从技术上来讲,Alluxio 是一个数据编排技术(数据编排,大概类似于一个平台,这个平台是用来管理数据的,主要是管理,对象是数据),它相当于一个数据层,在应用层和存储层之间加了一层,为上下两层搭建了桥梁,将数据移到离应用更近的地方,从而更容易访问数据。
数据驱动型应用是什么样的应用?
数据驱动:以数据为基础,将数据组织成信息,然后利用机器学习、算法等手段处理信息,最终形成自动化的决策模型。数据驱动型应用是以数据为基础,对新数据进行处理,得到处理结果。数据驱动型应用会使用大量的数据,对数据的访问会更为频繁。
简单的说,Alluxio 是一个分布式缓存系统,使用分布式的结构来提供缓存的服务。Alluxio 统一了不同存储系统中的数据,让上层的应用能够使用统一的接口和命名空间来访问数据。
所以分布式是什么,缓存又是什么。
分布式是什么??
提起来分布式,顺便把集群也说一句。
单机或者本地运行:只需要一台主机。
集群:需要多台主机,至少是2台。集群是一群主机,简单的理解为很多台电脑。使用集群的方式来运行代码,就是把代码运行在多个主机中。
从主机的规模来看,一台主机是单机结构,多台主机是集群结构。
分布式,是从业务上将一个系统进行划分,把系统分成多个独立的子系统,就像拼图一样,每个子系统是其中的一块,每个子系统可以部署在不同的机器上。分布式是从业务功能的方面划分的,不是按照现实中有多少台真实的主机(也可以是虚拟机中的主机)来区分是不是分布式系统,所以分布式可以在单机上运行,也可以在集群上运行。
缓存是什么??
缓存存储的是临时性的数据,与底层持久层存储系统相反。Alluxio 存储的是热数据,数据使用的更多,那它所有的较多的副本,再次访问数据会比没有缓存的速度快。
分布式缓存是不同的服务器将其缓存拿出来一部分,组成一个缓存系统。
Alluxio 基础概念
Alluxio 怎么统一了不同存储系统中的数据?
Alluxio 系统集成了不同的底层存储系统,包括文件系统HDFS、Amazon 的S3、谷歌云存储GCS、EMC ECS等。它对接了很多种不同的持久化存储系统,可以同时使用不同类型的存储系统,也可以使用多个相同的存储系统作为它的底层存储系统。
不同的持久化存储系统有各自的命名空间,它们有各自访问自己系统中的文件的命名方式,比如 HDFS 系统的命名方式 hdfs://namenode:port/ ,S3存储桶的命名方式 s3a://bucketName/。Alluxio 将底层存储系统挂载到 Alluxio 的空间目录下,即使有多个底层存储系统,它们挂载的目录是相同的,都在 Alluxio 的命名空间中,都可以使用 Alluxio 的命名方式(alluxio://host:port/)访问 。这样,只要访问 Alluxio 的命名空间,就可以访问到不同底层存储系统中的文件。即使它们是相互独立的存储系统,对于上层应用来说,应用访问不同存储系统中数据的方式是一样的。
举个例子:
如果有2个底层存储系统 S3 和 HDFS,s3 中存储了一个文件 s3-test.txt ,HDFS 中存储了一个文件 hdfs-test.txt ,将这2个存储系统都挂载到 Alluxio 命名空间的根目录下。那么,在Alluxio 的根目录下就有2个文件,s3-test.txt 和 hdfs-test.txt 。
直接访问 s3 中的文件,访问路径是 s3://bucketName/s3-test.txt。直接访问 HDFS 中的文件,访问路径是 http://hostName:port/hdfs-test.txt。需要知道数据存储在哪个存储系统中,然后按照那个存储系统的访问方式才能访问数据。
通过 Alluxio 访问两个文件的路径是 alluxio://hostName:port/s3-test.txt 和 alluxio://hostName:port/hdfs-test.txt 。在不同的存储系统中,访问数据的方式是一样的。只要知道数据在 Alluxio 中的路径,就可以访问到数据,而上层应用只需要知道存储系统中有没有自己要的数据,而不需要考虑底层是怎么存储数据的。
Alluxio 基础组成
一个 Alluxio 系统,在逻辑上,包括 master 节点、worker 节点、客户端和底层存储系统。
master 节点,负责管理 Alluxio 中的全局元数据,客户端访问数据的请求都会由 master 节点处理,然后 master 节点交给相应的 worker 节点传输数据。
worker 节点,负责数据的传输。
worker 节点在哪里?worker 节点是在应用所在的主机上。
woker 节点是怎么存储数据的?worker 节点可以由多种存储介质组成(内存 MEM,固态存储SSD,硬盘存储HDD),用户可以指定使用其中的一种或多种。
worker 节点什么时候存储数据?如果 worker 节点所在的客户端请求访问的文件没有在 worker 节点中,worker 节点就会在本节点中生成一个文件副本,这样客户端下次再访问该文件的时候,就可以直接从 worker 节点中读取文件。这里有两种情况:
- 如果客户端访问的文件不在 Alluxio 空间中,那么 Alluxio 会先从底层存储系统中读取文件,并在客户端所在的 worker 节点中生成文件副本。
- 如果客户端访问的文件不在本地的 worker 节点中,而是在其他的 worker 节点中,那么 Alluxio 会先从其他的 worker 节点中读取文件,并在客户端所在的 worker 节点中生成文件副本。
在读源码的时候,遇到了很多客户端和服务端,开始时一头雾水。这里记一下用到的客户端和服务端。
master 节点管理所有的元数据,worker 节点在客户端所在的主机中,所以 master 节点和 worker 节点之间的通信是由 rpc 完成的。对于 master 节点和 worker 节点之间的通信来说, worker 节点是使用服务的一端,也就是客户端,而 master 节点是提供服务的一端,也就是服务端。
master 节点和 worker 节点作为一个整体,提供了数据访问的服务,上层应用通过命令行或者 API 接口可以访问数据。应用获取数据也是通过 rpc ,所以,应用是客户端,Alluxio 是服务端。因为 master 节点管理所有的元数据,接收所有的请求,所以 master 节点是处理应用请求的服务端。
在实际的代码实现中,Alluxio 通过
job模块来管理它的任务调度,所以 master 节点在调用 worker 节点进行实际的操作时,会调用job的客户端,由其分配任务,调用 worker 节点执行实际的操作,而不是 master 节点直接直接与 worker 节点通信。同样的,在命令行执行命令,也是通过调用job的客户端来请求服务。