1. 介绍
如果你还没安装好hadoop可以参考我的hadoop安装教程
alluxio官方文档是本教程的主要参考资料。一切以官方资料为准。
本节讨论的alluxio安装将采用3台机器,其中1台为master,3台为worker(其中有一台master和worker在一起)
alluxio也是master-slave结构,因此必然master要配置无密码登入worker。因此个人建议:master、worker的配置和hadoop中master-slave的角色一一对应(即master对应master,slave对应worker)
2. 下载解压
2.1 下载预编译好的alluxio(不推荐)
从alluxio官网下载预编译好的alluxio
$ tar -xzf alluxio-1.2.0-bin.tar.gz
$ cd alluxio-1.2.0
用预编译好的alluxio,确保你的hadoop版本JDK版本与其一致。其实还是建议自己编译。
2.2 手动编译(强烈推荐)
手动编译有诸多好处:
- 可以使用最新版的alluxio,避免了BUG
- 可以针对你的hadoop和jdk版本来编译,避免版本不一致导致的问题
- alluxio-1.2.0集成hadoop2.7.2的时候貌似有个包依赖的bug(即commons.codec包版本太低,导致找不到方法)
从github上的alluxio仓库 下载最新的代码
git clone https://github.com/Alluxio/alluxio.git
修改下alluxio主目录下pom.xml,主要修改以下两项:
然后修改以下几个文件的pom,添加如下依赖(PS: 如果已经下载了alluxio 1.3.0,则不需要再做如下修改。之前反馈的问题在1.3.0中已经修复):
- $ALLUXIO_HOME/pom.xml
- $ALLUXIO_HOME/core/server/pom.xml
- $ALLUXIO_HOME/underfs/s3/pom.xml
- $ALLUXIO_HOME/underfs/gcs/pom.xml
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
下载后使用maven打包下
mvn install -Dhadoop.version=2.7.2 -Pspark -DskipTests -Dlicense.skip=true
打包后在主目录下自然会生产相关的目录
2.2.1 BUG预警
如果在编译的时候不修正commons-codec包的依赖版本,在运行配置完alluxio选项然后运行MR程序的时候会有如下报错:
2016-09-30 10:26:02,579 WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch: Failed to launch container.
java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String([B)Ljava/lang/String;
at org.apache.hadoop.yarn.util.AuxiliaryServiceHelper.setServiceDataIntoEnv(AuxiliaryServiceHelper.java:45)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.sanitizeEnv(ContainerLaunch.java:823)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:268)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
这个我觉得可能是官方源码的一个BUG吧。整合hadoop2.7.2的时候如果不修改commons-codec包的依赖版本就会出错。因为commons-codec如果使用1.4以下的版本,在alluxio-core-client-1.2.0-jar-with-dependencies.jar中的BASE64这个类会找不到encodeBase64String方法。该方法只有1.4及1.4以上版本有。
2.3 master无密码ssh登入各节点
这个比较简单,就是用以下命令配置下,可以查看hadoop2.7.2+spark1.6.2环境搭建教程这篇文章中关于无密码登入slave的教程
ssh-keygen -t rsa -P ''
```
#3. 配置
##3.1 配置文件修改
```bash
cd alluxio-1.2.0/conf
mv alluxio-env.sh.template alluxio-env.sh
vi alluxio-env.sh
#添加如下配置,以自己目录为准
ALLUXIO_HOME=/root/Downloads/alluxio-1.2.0
# 配置下主机的hostname,记得etc/hosts下都要配置
ALLUXIO_MASTER_HOSTNAME=mysql3
# 因为机器配置有限,我们这里每个worker只分配300MB内存
ALLUXIO_WORKER_MEMORY_SIZE=2500MB
# 配置JAVA_HOME
JAVA_HOME=/usr/java/jdk1.8.0_91
# 再配置下worker,和hadoop的slaves一样的配置方法
cd alluxio-1.2.0/conf/workers
vi workers
# 配置如下:
mysql1
mysql2
mysql3
mysql4
mysql5
确保JAVA_HOME指向有效的Java 7安装路径。将ALLUXIO_MASTER_HOSTNAME更新为运行Alluxio Master的机器的主机名。添加所有worker节点的IP地址到alluxio/conf/workers文件。
3.2 配置环境变量
vi ~/.bashrc
export ALLUXIO_HOME=/data/spark/software/alluxio-1.2.0
PATH=$PATH:$ALLUXIO_HOME/bin
3.3 使用alluxio命令来同步worker上的信息
在所有worker节点上按照同样方式配置alluxio-env.sh和workers文件。
之前我们仅仅在master上下载解压并且配置好了配置文件。为了在worker节点上也安装alluxio,我们可以用以下命令将已经配置好的alluxio整个主目录全部拷贝到所有worker上相同路径下。
./bin/alluxio copyDir $ALLUXIO_HOME
4. 启动alluxio
alluxio format
alluxio-start.sh all
查看日志发现有问题:
执行以下操作(所有worker机器上),使得可以使用ssh sudo cmd
chmod u+w /etc/sudoers
vi /etc/suders
# 注释以下内容
# Default requiretty
chmod u-w /etc/sudoers
然后在master和worker上使用JPS命令查看是否有AlluxioMaster和AlluxioWorker进程
登入master所在节点的19999端口查看WEB管理界面:
发现出现了HTTP ERROR 500错误,提示The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files
随便google了以下,google alluxio user group看到有同样的问题,发现是不支持太新的JDK
大家也给出了建议,我们就重新下载个jdk 1.8.0_77,以后发布alluxio 1.3 release的时候就不会有这个问题了。
另外也可以直接手动编译,下载最新的alluxio,已经修复了这个问题。
4.1 验证是否安装成功
使用以下命令检验是否安装成功
alluxio runTests
4.2 关于runTests时候的错误
进行runTests测试的时候一直报错:
java.lang.RuntimeException: No available Alluxio worker found
关于该问题的详细描述我也发布在google group里面的alluxio user小组了,详情可以点击:alluxio runTests command faied
解决该问题的办法就是: 把ALLUXIO_WORKER_MEMORY_SIZE=${ALLUXIO_WORKER_MEMORY_SIZE:-"1000MB"}这个选项的值设置的大点(大于你实际可用内存也没事,反正内存不够会持久化的)
5. 整合HDFS
alluxio能和很多底层存储系统集成在一起。HDFS是大数据中用的比较多的底层存储,这里也以此为例。
可以直接生成hdfs的配置文件:
./bin/alluxio bootstrapConf <ALLUXIO_MASTER_HOSTNAME> hdfs
ALLUXIO_MASTER_HOSTNAME指定hdfs namenode 的地址。然后启动alluxio集群即可。
5.1 测试
下面简单来测试下hdfs和alluxio是否成功整合。
在开始测试前,我们先明确数据存储位置的几个定义:
本地文件系统:例如使用linux,那么你的本地文件系统一般为ext4
底层文件系统:这个是指的alluxio底层用于持久化的文件系统,在我们这里自然指的是hdfs
alluxio:一般说把数据读到alluxio,实际上就是指读到内存当中
- 现在本地随便创建个文件test.txt
echo "hello world" >> test.txt
- 用alluxio命令行工具将该文件读到内存.(命令行工具的使用可以参考官方文档)
# 拷贝到内存文件系统的/目录下并且命名为test
alluxio fs copyFromLocal test.txt /test
在19999端口管理界面,浏览下文件,发现已经成功保存到内存中,此时全部在内存中。因为默认的写类型为MUST_CACHE,数据会被同步写入到worker但是不会写入底层存储系统。此时HDFS上肯定是没有该文件的。
我们采用alluxio提供的命令来把文件持久化到HDFS
# 将alluxio内存系统根目录下的test文件持久化到HDFS
alluxio fs persist /test
操作过程如下:
在HDFS上访问查看:
发现我们的数据已经成功持久化到HDFS。
6. alluxio集成HDFS的补充配置(可选)
如果需要将alluxio集成HDFS。接下来的这几步千万不要忘记,否则客户端没法正常访问基于HDFS的alluxio。位了确保hadoop能引用到alluxio的client jar我们需要执行以下几步
6.1 修改环境变量
添加如下环境变量到.bashrc,主要是让hadoop也能引用到alluxi client的jar。否则会报错找不到alluxio schema这样的错误。
# alluxio支持,这里推荐用绝对路径(相对路径没有测试过,有兴趣可以自己试试)
export HADOOP_CLASSPATH=/home/appadmin/alluxio-1.2.0/core/client/target/alluxio-core-client-1.2.0-jar-with-dependencies.jar
6.2 修改 hadoop-env.sh
在其中也添加如下内容:
# alluxio支持,这里推荐用绝对路径
export HADOOP_CLASSPATH=/home/appadmin/alluxio-1.2.0/core/client/target/alluxio-core-client-1.2.0-jar-with-dependencies.jar
6.3 添加jar到share目录
将alluxio-core-client-1.2.0-jar-with-dependencies.jar放到如下目录:
$HADOOP_HOME/share/hadoop/common/lib
6.4 修改hdfs-site.xml和core-site.xml
两个文件中全部添加以下内容:
<property>
<name>fs.alluxio.impl</name>
<value>alluxio.hadoop.FileSystem</value>
<description>The Alluxio FileSystem (Hadoop 1.x and 2.x)</description>
</property>
<property>
<name>fs.alluxio-ft.impl</name>
<value>alluxio.hadoop.FaultTolerantFileSystem</value>
<description>The Alluxio FileSystem (Hadoop 1.x and 2.x) with fault tolerant support</description>
</property>
<property>
<name>fs.AbstractFileSystem.alluxio.impl</name>
<value>alluxio.hadoop.AlluxioFileSystem</value>
<description>The Alluxio AbstractFileSystem (Hadoop 2.x)</description>
</property>
修改好后将hdfs-site.xml和core-site.xml拷贝到$ALLUXIO_HOME/conf下
PS:改过配置必须重启dfs集群和yarn集群以及 alluxio集群