简介
Alluxio诞生于2012年,并于2013年开源,是成长最快的大数据社区开源项目之一。类似于计算机中寄存器-内存-外存的层级存储模型,Alluxio可以在内存/SSD/HDD中分层实现数据缓存,并灵活配置。区别于Redis或Memcached等kv缓存系统,Alluxio能够将不同的底层文件系统(UFS)映射到统一的Alluxio命名空间下,客户端可按路径自由访问任意UFS上的文件。对于Impala来讲,业务上遇到的一些慢查询的场景可通过Alluxio来规避,如HDFS性能瓶颈、小文件问题等等。因此,本文及后续系列文章将讨论Alluxio与Impala的适配部署,以及可能遇到的问题,进一步将从代码角度出发,寻求Alluxio如何能为Impala带来最大的性能提升。
![](https://img-blog.csdnimg.cn/0f64dcfcd77d46cea8e0837140e705e3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYTYwNDk0Nzc0MA==,size_17,color_FFFFFF,t_70,g_se,x_16)
Alluxio部署
Alluxio可通过预编译包部署,也可通过源码安装部署,以下分别介绍。
源码编译
执行以下命令clone源码包
git clone git://github.com/alluxio/alluxio.git
cd alluxio
如要选择其他Alluxio版本,则需执行
git tag
git checkout <TAG_NAME>
随后执行以下命令进行编译
mvn clean install -DskipTests
官方文档中说明为加速编译,可增加一系列参数以跳过检查,但本文测试跳过检查的编译速度并没有什么变化,只有首次编译时拉取依赖的速度较慢,因此建议保留编译检查。如果要执行跳过,需要注意首次编译时-Dskip.protoc这个选项不能跳过,编译时需要生成一系列的proto文件,后续编译可以增加-Dskip.protoc。
此外,若编译时报类似于
java.lang.OutOfMemoryError: Java heap space
的OOM错误,可执行以下命令增加maven可用的堆内存空间
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
编译完成后,执行脚本与可执行文件将在$ALLUXIO_HOME/bin下,后续部署与预编译包的部署方式相同,此处不再赘述。如果需要针对已有环境中的Hadoop进行编译,则可执行以下编译命令以指定相关参数:
mvn install -P<HADOOP_PROFILE> -Dhadoop.version=<HADOOP_VERSION> -DskipTests
针对不同的Hadoop发行版(Apache、Cloudera、Hortonworks),<HADOOP_PROFILE>和<HADOOP_VERSION>参数可参照如下:
Apache发行版
-Phadoop-1 -Dhadoop.version=1.0.4
-Phadoop-1 -Dhadoop.version=1.2.0
-Phadoop-2 -Dhadoop.version=2.2.0
-Phadoop-2 -Dhadoop.version=2.3.0
-Phadoop-2 -Dhadoop.version=2.4.1
-Phadoop-2 -Dhadoop.version=2.5.2
-Phadoop-2 -Dhadoop.version=2.6.5
-Phadoop-2 -Dhadoop.version=2.7.3
-Phadoop-2 -Dhadoop.version=2.8.0
-Phadoop-2 -Dhadoop.version=2.9.0
-Phadoop-3 -Dhadoop.version=3.0.0
CDH
-Phadoop-2 -Dhadoop.version=2.3.0-cdh5.1.0
-Phadoop-2 -Dhadoop.version=2.0.0-cdh4.7.0
HDP
-Phadoop-2 -Dhadoop.version=2.1.0.2.0.5.0-67
-Phadoop-2 -Dhadoop.version=2.2.0.2.1.0.0-92
-Phadoop-2 -Dhadoop.version=2.4.0.2.1.3.0-563
预编译包部署
从官方下载地址下载Alluxio包,或直接在部署环境中执行(此处以Alluxio 2.4.1版本为例)
wget https://downloads.alluxio.io/downloads/files/2.4.1/alluxio-2.4.1-bin.tar.gz
然后进行解压
tar zxvf alluxio-2.4.1-bin.tar.gz
------源码编译完成后从此处继续------
确保所有节点均配置好了SSH免密登录。将Alluxio目录发送到所有节点中,或先发送预编译包到所有节点,再同时执行解压。在master节点上修改配置文件:
1.alluxio-site.properties
在$ALLUXIO_HOME/conf目录中执行
cp alluxio-site.properties.template alluxio-site.properties
可按照如下示例配置文件进行参考配置
#基础配置
alluxio.master.hostname={master所在节点的hostname}
alluxio.master.mount.table.root.ufs={core-site.xml中的fs.defaultFS}
alluxio.underfs.hdfs.configuration=/path/to/core-site.xml:/path/to/hdfs-site.xml
#权限相关配置
alluxio.security.authorization.permission.enabled=false
alluxio.security.login.impersonation.username=none
alluxio.master.security.impersonation.root.users=*
alluxio.master.security.impersonation.root.groups=*
alluxio.master.security.impersonation.client.users=*
alluxio.master.security.impersonation.client.groups=*
#存储层配置
alluxio.worker.memory.size=1GB
alluxio.worker.tieredstore.levels=1
alluxio.worker.tieredstore.level0.alias=MEM
alluxio.worker.tieredstore.level0.dirs.path=/path/to/ramdisk
#读写模式配置
alluxio.user.file.readtype.default=CACHE
alluxio.user.file.writetype.default=CACHE_THROUGH
2.master
master文件中只需写master的hostname
{master所在节点的hostname}
3.worker
worker文件中写除master以外所有节点的hostname
worker1.xxx.xxx.com
worker2.xxx.xxx.com
worker3.xxx.xxx.com
…
将alluxio-site.properties、master、worker文件发送到所有worker上的$ALLUXIO_HOME/conf中。若要使用内存作为缓存存储,则需要用户具有sudo权限或为root用户,用来自动或手动挂载RamFS。
以上为所有部署前的准备工作,包括编译、构造配置文件、环境准备等,下面为正式部署。
首次运行前,在master上的$ALLUXIO_HOME/bin中执行格式化
./alluxio format
也可分别对master和worker执行格式化
./alluxio formatMaster
./alluxio formatWorker
然后启动Alluxio集群
./alluxio-start.sh all [Mount]
Mount参数将使Alluxio尝试自动挂载RamFS(如果配置文件中配置了内存作为存储)到/path/to/ramdisk,如果挂载失败,可在所有worker中手动挂载(需sudo或root)。没有Mount参数则Alluxio会直接把/path/to/ramdisk作为RamFS,如果没有手动挂载会报错。
mount -t tmpfs -o size=50G tmpfs /path/to/ramdisk
注意:
没有sudo或root权限的普通用户只能使用NoMount选项,这将使Alluxio使用/dev/shm作为临时性存储,在启动前还需要在所有节点执行
export ALLUXIO_RAM_FOLDER=/dev/shm
#再启动集群
./alluxio-start.sh all NoMount
/dev/shm是一个所有用户公用的共享内存目录,和tmpfs一样也是一个基于内存而不是外存的目录,默认大小为物理内存的一半。Alluxio使用/dev/shm作为MEM的存储在性能上可能看不出太大差别,但其他用户可能会偶尔将这个目录空间用尽。换句话说,Alluxio的可用存储空间将受到其他外部的限制,这将影响集群的稳定性,因此建议用户挂载tmpfs作为Alluxio专属的RamFS。若部署时采用了/dev/shm作为存储介质,后续又要更改为内存时,需要重置ALLUXIO_RAM_FOLDER的环境变量值
export ALLUXIO_RAM_FOLDER=''
否则Alluxio识别到此变量值不为空,将继续使用/dev/shm作为存储。
在执行上述启动命令后,若显示如下输出则表示启动成功。
![](https://img-blog.csdnimg.cn/e53f21c487d240dd801b44053ac5cb44.png)
如果有worker启动失败,则可手动在失败节点上的/$ALLUXIO_HOME/bin目录下执行
./alluxio-start.sh worker [Mount]
如果Alluxio的版本与当前部署的Hadoop版本不匹配,可能会报下图错误,官方文档中未给出Alluxio与Hadoop的版本应如何对应,当出现图中报错时,可按照编译部署中的指定Hadoop版本方式进行编译,或回退到较早的Alluxio版本进行部署。
![](https://img-blog.csdnimg.cn/fac419d6fb764b679a032975456672ee.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYTYwNDk0Nzc0MA==,size_20,color_FFFFFF,t_70,g_se,x_16)
所有节点启动成功后,可在Alluxio的Web UI上看到集群状态,默认URL为{master所在hostname}:19999,Web UI界面如下所示
![](https://img-blog.csdnimg.cn/f291f949362f4179973eaaf76b4b7058.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYTYwNDk0Nzc0MA==,size_20,color_FFFFFF,t_70,g_se,x_16)
可在Web UI上查看目前Alluxio集群的配置项、UFS或Alluxio中的数据、当前的Worker状态以及日志等等,如下图所示。
![](https://img-blog.csdnimg.cn/e12fdf8c456e4280b772db8a0f1f4a8b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYTYwNDk0Nzc0MA==,size_20,color_FFFFFF,t_70,g_se,x_16)
配置页中,用户在alluxio-site.properties写入的配置标识为SITE_PROPERTY,并会注明配置文件的所在位置;不需要另外配置,Alluxio自行获取的配置标识为SYSTEM_PROPERTY,包括Alluxio所在目录、日志所在目录等等;其他未指定的配置项则标识为DEFAULT,表示采用默认值。
Metrics页中还可查看目前UFS的存储水位
![](https://img-blog.csdnimg.cn/03bfb11bde0f4fcb8af3ca7933bd8a33.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYTYwNDk0Nzc0MA==,size_20,color_FFFFFF,t_70,g_se,x_16)
至此,Alluxio集群部署完成。
配置文件说明
alluxio-site.properties中的可用配置项较多,取值也较多,下面以本文给出的示例配置为例,结合官方文档简要介绍主要配置的一些取值含义。
alluxio.underfs.hdfs.configuration
本文部署的Alluxio集群的UFS为HDFS,此配置的值即为Hadoop集群上NameNode的配置文件。
alluxio.worker.tieredstore.levels
此配置表示Alluxio要使用的存储层数,数量不限,使用/dev/shm存储时为默认值1,一般配置为MEM-SSD-HDD层次,其中每种存储也可配置多层,也可只使用其中的一种或几种自由搭配,需要结合其他存储配置来实现。
alluxio.worker.tieredstore.level{0~}.alias
此配置标识了每层存储所使用的介质类型,以3层存储为例,需要分别写明alluxio.worker.tieredstore.level{0~2}.alias的存储介质,0为最顶级,一般为内存:
alluxio.worker.tieredstore.level0.alias=MEM
alluxio.worker.tieredstore.level1.alias=SSD
alluxio.worker.tieredstore.level2.alias=HDD,HDD
alluxio.worker.tieredstore.level{0~}.dirs.path
在上面配置中写明了使用MEM存储介质后,需在本配置项中写入RamFS的路径,为保障只能通过Alluxio进行读写,一般位于部署Alluxio的用户目录中。若启动Alluxio时有Mount参数,则Alluxio会自动尝试挂载tmpfs在指定路径。使用其他存储介质时也需要指定路径,举例来讲,如果使用了3层MEM/SSD/HDD的存储介质,则需要如下配置:
alluxio.worker.tieredstore.level0.dirs.path=/path/to/ramdisk
alluxio.worker.tieredstore.level1.dirs.path=/path/to/ssd
alluxio.worker.tieredstore.level2.dirs.path=/path/to/hdd
也可以在同一层介质中配置多个路径,用","分隔:
alluxio.worker.tieredstore.level2.dirs.path=/path/to/hdd1,/path/to/hdd2
alluxio.worker.tieredstore.level{0~}.dirs.quota
表示当前层的存储介质能使用的最大存储空间,与上文中的配置项类似,按层来单独进行配置:
alluxio.worker.tieredstore.level0.dirs.quota=50GB
alluxio.worker.tieredstore.level1.dirs.quota=100GB
alluxio.worker.tieredstore.level2.dirs.quota=1TB
如果在同一层配置了多个存储路径,最大存储空间也需要配置多个,而且顺序需要与路径的顺序对应,以上文的两个HDD路径为例:
alluxio.worker.tieredstore.level2.dirs.quota=500GB,1TB
alluxio.user.file.readtype.default
此配置表示当读数据时Alluxio的一些行为,有CACHE_PROMOTE、CACHE、NO_CACHE三种取值,分别代表:
CACHE_PROMOTE:将读取到的数据(无论在不在Alluxio中)移动到最高层次的存储中;
CACHE:将底层读取到的数据移动到最高层次的存储中;
NO_CACHE:从底层读取的数据不会存储到Alluxio中,从Alluxio读取到的数据不会发生数据所在层次的移动。
alluxio.user.file.writetype.default
此配置表示写数据时Alluxio的一些行为,有MUST_CACHE、CACHE_THROUGH、THROUGH三种取值,分别代表:
MUST_CACHE:写入的数据只缓存在Alluxio中;
CACHE_THROUGH:写入数据缓存到Alluxio中,并写回底层存储;
THROUGH:写入数据不缓存到Alluxio,只写到底层存储;
总结
本文主要介绍了Alluxio部署的相关步骤,并穿插介绍了部署时可能遇到的一些问题,最后简要介绍了几个主要的配置项,其他配置项也有特定的作用,本文选取主要的几个配置进行说明,即最基础的Alluxio集群部署至少需要这几项是配置过的。后续文章中将介绍Impala 3.4与Alluxio适配、Alluxio权限模型、Alluxio对于Impala的最佳性能调优探索等等。
参考文档:
1.Alluxio官方文档:https://docs.alluxio.io/os/user/stable/cn/Overview.html