在EC2上使用YARN运行Alluxio

Alluxio可以由Apache YARN启动并管理。该指南介绍如何使用Alluxio自带的 Vagrant脚本在EC2的机器上用YARN启 动Alluxio。

前期准备

安装Vagrant和AWS插件

下载Vagrant

安装AWS Vagrant插件:

$ vagrant plugin install vagrant-aws
$ vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box

安装Alluxio

下载Alluxio到本地,并解压:

$ wget http://alluxio.org/downloads/files/1.6.1/alluxio-1.6.1-bin.tar.gz
$ tar xvfz alluxio-1.6.1-bin.tar.gz

安装python库依赖

安装python>=2.7,注意不是python3。

进入Alluxio主目录下的deploy/vagrant 目录下,运行:

$ sudo bash bin/install.sh

你可以选择手动安装pip,进入deploy/vagrant目录,运行:

$ sudo pip install -r pip-req.txt

启动集群

要在EC2上运行Alluxio集群,首先在Amazon Web Services site注册一个Amazon EC2帐号。

接着创建access keys并且设置AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY shell环境变量:

$ export AWS_ACCESS_KEY_ID=<your access key>
$ export AWS_SECRET_ACCESS_KEY=<your secret access key>

在你想部署的区域生成EC2 Key Pairs(默认为us-east-1)。确保将私钥文件的权限设置成只有你可读:

$ chmod 400 <your key pair>.pem

deploy/vagrant/conf/ec2.yml.template文件复制一份,命名为deploy/vagrant/conf/ec2.yml,并在其中将Keypair设置为你的keypair名,Key_Path设置成pem key路径。

Vagrant脚本默认会在区域(us-east-1)和可用区域(us-east-1b)中创建一个名为alluxio-vagrant-test安全组。 该安全组会在区域中自动建立,而且所有入站及出站的网络流量都将打开。你可以在ec2.yml配置文件中更改安全组、区域以及可用区域。

最后,在deploy/vagrant/conf/ufs.yml文件中设置”Type”的值为hadoop2

现在你可以运行deploy/vagrant下的脚本在us-east-1b区域启动Alluxio集群,该集群以Hadoop2.4.1作为底层文件系统:

$ ./create <number of machines> aws

访问集群

通过Web UI访问

./create <number of machines> aws命令运行成功后,shell输出的末尾会有如下两行(shell中为绿色):

>>> AlluxioMaster public IP is xxx, visit xxx:19999 for Alluxio web UI<<<
>>> visit default port of the web UI of what you deployed <<<

Alluxio Web UI的默认端口为19999

Hadoop Web UI的默认端口为50070

在浏览器中输入http://{MASTER_IP}:{PORT}地址访问Web UI。

也能通过AWS web console监视其状态。

通过ssh访问

节点的名称依次被设置成AlluxioMaster, AlluxioWorker1, AlluxioWorker2等等。

通过ssh登陆一个节点,运行:

$ vagrant ssh <node name>

例如,ssh AlluxioMaster节点:

$ vagrant ssh AlluxioMaster

所有的软件都安装在根目录下,例如Alluxio安装在/alluxio,Hadoop安装在/hadoop

配置集成YARN的Alluxio

在我们的EC2机器上,YARN作为Hadoop2.4.1的一部分安装。注意,vagrant脚本构建的Alluxio二进制版本并不包含YARN 的整合。需要先停止默认的Alluxio服务,重新编译Alluxio,编译时指定”yarn”配置文件(以便Alluxio包含YARN client 和ApplicationMaster)。

$ cd /alluxio
$ ./bin/alluxio-stop.sh all
$ mvn clean install -Phadoop-2.4 -Dhadoop.version=2.4.1 -Pyarn -Dlicense.skip -DskipTests -Dfindbugs.skip -Dmaven.javadoc.skip -Dcheckstyle.skip

添加-DskipTests -Dfindbugs.skip -Dmaven.javadoc.skip -Dcheckstyle.skip不是严格必须的,但是添加后可以使构建过程快很多。

定制Alluxio master和worker的特定属性(例如,每个worker建立分层存储),参考 配置设置获取更多信息。为了确保你的配置可以被ApplicationMaster和 Alluxio master/worker读取,将其设置在alluxio-site.properties中。

启动Alluxio

如果Yarn不是存放在HADOOP_HOME目录下,则需要将Yarn的基本路径保存到YARN_HOME环境变量。

使用integration/yarn/bin/alluxio-yarn.sh脚本启动Alluxio。该脚本有3个参数:

  1. 需要启动的Alluxio worker的总数。(必填项)
  2. 分布存储Alluxio ApplicationMaster可执行文件的HDFS路径。(必填项)
  3. 运行Alluxio Master的节点的YARN的名称。(选填项,默认为ALLUXIO_MASTER_HOSTNAME

举例而言,启动3个worker节点的Alluxio集群,HDFS临时目录是hdfs://AlluxioMaster:9000/tmp/,主机的名字是AlluxioMaster

你也可以在Yarn之外启动Alluxio Master节点,在这种情况下,上述启动过程将会自动检测所提供地址的主机上的Master,并且跳过该新实例的初始化。这非常有用,特别是当你想在某台特定的主机上运行Master,而该主机不属于Yarn集群,例如一个AWS EMR Master实例。

$ export HADOOP_HOME=/hadoop
$ /hadoop/bin/hadoop fs -mkdir hdfs://AlluxioMaster:9000/tmp
$ /alluxio/integration/yarn/bin/alluxio-yarn.sh 3 hdfs://AlluxioMaster:9000/tmp/ AlluxioMaster

该脚本会在YARN上启动Application Master,后面会继续为Alluxio master和workers申请运行的容器。脚本一直运行并报告ApplicationMaster的状态。也可以在浏览器中查看http://AlluxioMaster:8088访问Web UI观察Alluxio作业的状态和应用ID。

以上脚本会产生如下的输出:

Using $HADOOP_HOME set to '/hadoop'
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/<PATH_TO_ALLUXIO>/client/alluxio-1.7.0-SNAPSHOT-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Initializing Client
Starting Client
15/10/22 00:01:17 INFO client.RMProxy: Connecting to ResourceManager at AlluxioMaster/172.31.22.124:8050
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/<PATH_TO_ALLUXIO>/client/alluxio-1.7.0-SNAPSHOT-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
ApplicationMaster command: /bin/java -Xmx256M alluxio.yarn.ApplicationMaster 3 /alluxio localhost 1><LOG_DIR>/stdout 2><LOG_DIR>/stderr
Submitting application of id application_1445469376652_0002 to ResourceManager
15/10/22 00:01:19 INFO impl.YarnClientImpl: Submitted application application_1445469376652_0002

从输出中,我们得知运行Alluxio的应用ID是application_1445469376652_0002。应用ID可以用来杀死该应用。

测试Alluxio

知道Alluxio master容器的IP后,可以修改conf/alluxio-env.sh在每台EC2机器上建立ALLUXIO_MASTER_HOSTNAME环境变量:

ALLUXIO_MASTER_HOSTNAME=<alluxio_master_ip>

可以对Alluxio运行测试检测其健康状态:

$ /alluxio/bin/alluxio runTests

在所有测试完成后,再次访问Alluxio的web UI http://{MASTER_IP}:19999,在导航栏中点击Browse,可以看到测试过程中写入到Alluxio的文件。

停止Alluxio

使用如下YARN命令可以停止Alluxio,其中应用ID可以从YARN web UI或alluxio-yarn.sh的输出中获取(上面已经提及)。举例而言,如果应用ID是application_1445469376652_0002,可以使用如下语句杀死应用:

$ /hadoop/bin/yarn application -kill application_1445469376652_0002

撤销集群

在启动EC2机器的本地机器deploy/vagrant目录下运行:

$ ./destroy

撤销之前创建的集群。一次只能创建一个集群。当该命令成功执行后,EC2实例将终止运行。

故障排除

1 如果使用maven编译集成YARN的Alluxio,编译时报错显示如下信息:

 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) on project alluxio-integration-yarn: Compilation failure: Compilation failure:
 [ERROR] /alluxio/upstream/integration/yarn/src/main/java/alluxio/yarn/Client.java:[273,49] cannot find symbol
 [ERROR] symbol:   method $$()
 [ERROR] location: variable JAVA_HOME of type org.apache.hadoop.yarn.api.ApplicationConstants.Environment
 [ERROR] /Work/alluxio/upstream/integration/yarn/src/main/java/alluxio/yarn/Client.java:[307,31] cannot find symbol
 [ERROR] symbol:   variable CLASS_PATH_SEPARATOR
 [ERROR] location: interface org.apache.hadoop.yarn.api.ApplicationConstants
 [ERROR] /alluxio/upstream/integration/yarn/src/main/java/alluxio/yarn/Client.java:[310,29] cannot find symbol
 [ERROR] symbol:   variable CLASS_PATH_SEPARATOR
 [ERROR] location: interface org.apache.hadoop.yarn.api.ApplicationConstants
 [ERROR] /alluxio/upstream/integration/yarn/src/main/java/alluxio/yarn/Client.java:[312,47] cannot find symbol
 [ERROR] symbol:   variable CLASS_PATH_SEPARATOR
 [ERROR] location: interface org.apache.hadoop.yarn.api.ApplicationConstants
 [ERROR] /alluxio/upstream/integration/yarn/src/main/java/alluxio/yarn/Client.java:[314,47] cannot find symbol
 [ERROR] symbol:   variable CLASS_PATH_SEPARATOR
 [ERROR] location: interface org.apache.hadoop.yarn.api.ApplicationConstants
 [ERROR] -> [Help 1]

请确保使用正确的Hadoop版本:

$ mvn clean install -Phadoop-2.4 -Dhadoop.version=2.4.1 -Pyarn
Need help? Ask a Question