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 手动编译(强烈推荐)

手动编译有诸多好处:

  1. 可以使用最新版的alluxio,避免了BUG
  2. 可以针对你的hadoop和jdk版本来编译,避免版本不一致导致的问题
  3. 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中已经修复):

  1. $ALLUXIO_HOME/pom.xml
  2. $ALLUXIO_HOME/core/server/pom.xml
  3. $ALLUXIO_HOME/underfs/s3/pom.xml
  4. $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 配置文件修改

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,实际上就是指读到内存当中

  1. 现在本地随便创建个文件test.txt

    echo "hello world" >> test.txt
    
  2. 用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集群