Alluxio部署实践

简介

Alluxio诞生于2012年,并于2013年开源,是成长最快的大数据社区开源项目之一。类似于计算机中寄存器-内存-外存的层级存储模型,Alluxio可以在内存/SSD/HDD中分层实现数据缓存,并灵活配置。区别于Redis或Memcached等kv缓存系统,Alluxio能够将不同的底层文件系统(UFS)映射到统一的Alluxio命名空间下,客户端可按路径自由访问任意UFS上的文件。对于Impala来讲,业务上遇到的一些慢查询的场景可通过Alluxio来规避,如HDFS性能瓶颈、小文件问题等等。因此,本文及后续系列文章将讨论Alluxio与Impala的适配部署,以及可能遇到的问题,进一步将从代码角度出发,寻求Alluxio如何能为Impala带来最大的性能提升。

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作为存储。

在执行上述启动命令后,若显示如下输出则表示启动成功。

如果有worker启动失败,则可手动在失败节点上的/$ALLUXIO_HOME/bin目录下执行

./alluxio-start.sh worker [Mount]

如果Alluxio的版本与当前部署的Hadoop版本不匹配,可能会报下图错误,官方文档中未给出Alluxio与Hadoop的版本应如何对应,当出现图中报错时,可按照编译部署中的指定Hadoop版本方式进行编译,或回退到较早的Alluxio版本进行部署。

所有节点启动成功后,可在Alluxio的Web UI上看到集群状态,默认URL为{master所在hostname}:19999,Web UI界面如下所示

可在Web UI上查看目前Alluxio集群的配置项、UFS或Alluxio中的数据、当前的Worker状态以及日志等等,如下图所示。

配置页中,用户在alluxio-site.properties写入的配置标识为SITE_PROPERTY,并会注明配置文件的所在位置;不需要另外配置,Alluxio自行获取的配置标识为SYSTEM_PROPERTY,包括Alluxio所在目录、日志所在目录等等;其他未指定的配置项则标识为DEFAULT,表示采用默认值。
Metrics页中还可查看目前UFS的存储水位

至此,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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Alluxio Journal 是 Alluxio 这个开源分布式存储系统中的一种核心组件。它的作用是记录所有重要的元数据和操作信息,以实现数据的持久化和容错性。 Alluxio Journal 使用一种叫作 JournalWriteAheadLog 的技术来记录元数据和操作信息。这是一种高效的日志记录方式,可以将所有操作以日志的形式追加到顺序写的日志文件中,而不需要频繁的磁盘随机写入。这种写入方式可以提高系统的写入性能,并保证数据的一致性和持久性。 通过使用 JournalWriteAheadLog 技术,Alluxio Journal 可以确保在系统发生故障时能够快速地恢复和恢复数据的一致性。当系统启动时,Alluxio Journal 会读取日志文件来重放之前的所有操作,并将元数据状态恢复到故障发生之前的状态。这样,即使有异常发生,Alluxio Journal 也可以保证数据的一致性。 此外,Alluxio Journal 还支持主从模式,即能够将日志复制到多个节点上,以提供更高的容错性和可靠性。如果主节点发生故障,可以快速切换到备用从节点上,从而实现故障转移和高可用性。 总之,Alluxio Journal 是 Alluxio 存储系统的重要组件,通过使用 JournalWriteAheadLog 技术,它可以记录和恢复所有重要的元数据和操作信息,以实现数据的持久化和容错性。它还支持主从模式,提供了高可用性和可靠性。这些特性使得 Alluxio Journal 在分布式存储系统中起着至关重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值