mesos的具体安装过程可以参考我的上一篇日志《mesos安装总结》。本篇日志主要介绍在mesos之上安装Hadoop。mesos 0.9.0的解压包中包含了Hadoop 0.20.205.0版本及相应的补丁程序。可以使用mesos自带的Hadoop来进行安装。下面的安装过程会用到master结点上解压并build好的mesos目录,具体过程请参见mesos安装总结。在下面总结过程中使用<mesos>来指代解压并build好的mesos目录,用<prefix>代指mesos的安装目录。
具体安装Hadoop的过程如下所示:
(1) 在master结点上,进入文件夹<mesos>/hadoop。
(2) 在该文件夹中,有一个名为TUTORIAL.sh可执行文件,直接运行该可执行文件,可以build mesos自带的hadoop 0.20.205.0版本,并为其打补丁,主要是生成mesos的executor,和为hadoop产生相应的配置文件。在执行过程中,可以一路回车,直至结束。执行结束后,会在<mesos>/hadoop/文件夹下生成一个名为hadoop-0.20.205.0的目录。有一点需要注意,在执行过程中需要给出mesos库文件libmesos-0.9.0.so的位置,该文件位于<prefix>/lib/libmesos-0.9.0.so(我的位置是/home/dummy/mesos/lib/libmesos-0.9.0.so)。
(3)执行完成后,需要在<mesos>目录中找到两个jar文件,并将其拷贝到<mesos>/hadoop/hadoop-0.20.205.0中。这两个jar文件的具体位置如下为<mesos>/build/src/mesos-0.9.0.jar和<mesos>/build/protobuf-2.4.1.jar。具体命令如下:
cp <mesos>/build/src/mesos-0.9.0.jar <mesos>/hadoop/hadoop-0.20.205.0 cp <mesos>/build/protobuf-2.4.1.jar <mesos>/hadoop/hadoop-0.20.205.0
(4) 接着进入<mesos>/hadoop/hadoop-0.20.205.0/conf目录中修改相应的配置文件,对hadoop进行配置。具体要配置如下一些文件:
masters和slaves文件
#masters文件中的内容 master #slaves文件中的内容 slave1 slave2 slave3
core-site.xml文件
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://master:54322</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/hadoop/hadoop-0/hadoop-0.20.205.0</value> </property> </configuration>
mapred-site.xml文件
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>mapred.job.tracker</name> <value>master:54323</value> </property> <property> <name>mapred.jobtracker.taskScheduler</name> <value>org.apache.hadoop.mapred.MesosScheduler</value> </property> <property> <name>mapred.mesos.master</name> <value>master:5050</value> </property> </configuration>
hdfs-site.xml文件
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
hadoop-env.sh文件
# Google protobuf (necessary for running the MesosScheduler). export PROTOBUF_JAR=${HADOOP_HOME}/protobuf-2.4.1.jar # Mesos. export MESOS_JAR=${HADOOP_HOME}/mesos-0.9.0.jar # Native Mesos library. export MESOS_NATIVE_LIBRARY=/home/dummy/mesos/lib/libmesos.so # The java implementation to use. Required. export JAVA_HOME=/home/dummy/.java/jdk1.6.0_33 # Extra Java CLASSPATH elements. Optional. export HADOOP_CLASSPATH=${HADOOP_HOME}/build/contrib/mesos/classes:${MESOS_JAR}:${PROTOBUF_JAR} # The maximum amount of heap to use, in MB. Default is 1000. export HADOOP_HEAPSIZE=2000 # close warning information export HADOOP_HOME_WARN_SUPPRESS=TRUE
(5)配置好上述配置文件后,就可以将文件夹<mesos>/hadoop/hadoop-0.20.205.0拷贝到主结点和所有从结点上,注意主从结点的位置要一致。用<hadoop>来代表主从结点上hadoop的安装位置。接着运行如下命令来启动mesos之上的hadoop集群。
进入<prefix>/sbin目录,使用如下命令启动mesos集群:
bash mesos-start-cluster.sh
进入主结点上的<hadoop>目录,使用如下命令格式化HDFS:
bin/hadoop namenode -format
在主结点的<hadoop>目录中,使用如下命令来启动HDFS:
bin/start-dfs.sh
这时候在主从结点上分别运行jps命令会看到主结点上的NameNode和SecondaryNameNode已经跑起来,而从结点上的DataNode也已经跑起来。
在主结点的<hadoop>目录中,使用如下命令启动主结点上的JobTracker:
bin/hadoop jobtracker
如果一切配置正常,那么会出现如下的不断重复的信息:
12/12/26 22:17:55 INFO mapred.FrameworkScheduler: Registered with Mesos, with framework ID value: "20121226130 71677895872-5050-2996-0003" 12/12/26 22:17:55 INFO mapred.FrameworkScheduler: Killing tasks that started 20000 milliseconds ago 12/12/26 22:17:55 INFO mapred.FrameworkScheduler: Got resource offer value: "2012122613071677895872-5050-2996- 22200" 12/12/26 22:17:55 INFO mapred.FrameworkScheduler: Got resource offer value: "2012122613071677895872-5050-2996- 22201" 12/12/26 22:17:55 INFO mapred.FrameworkScheduler: Got resource offer value: "2012122613071677895872-5050-2996- 22202" 12/12/26 22:17:57 INFO mapred.FrameworkScheduler: Killing tasks that started 20000 milliseconds ago 12/12/26 22:17:57 INFO mapred.FrameworkScheduler: Got resource offer value: "2012122613071677895872-5050-2996- 22203" 12/12/26 22:17:57 INFO mapred.FrameworkScheduler: Got resource offer value: "2012122613071677895872-5050-2996- 22204" 12/12/26 22:17:57 INFO mapred.FrameworkScheduler: Got resource offer value: "2012122613071677895872-5050-2996- 22205"
这时候可以在mesos的web界面中的Active Frameworks下看到新启动的hadoop框架。接着就可以按照往常的方式向hadoop提交作业了。具体的作业可以打包成jar包,然后使用如下命令提交给hadoop:
bin/hadoop jar /path/to/file.jar
碰到的问题:
1. 第一次配置完成后,启动jobtracker后,看到上面的重复信息还以为配置出了什么问题。以为不停地killing tasks,又不停地Got resource offer value是集群配置不正确的反映,其实上面的提示信息说明配置没有问题,jobtracker已经运行起来,正在等待作业的提交
2. 运行上面所有有关hadoop命令的时候,最好是在<hadoop>目录下,使用bin/script的形式运行,否则会出现jobtracker无法启动,或者提交作业后无法执行的问题。我碰到的一个问题是/tmp/mesos/slaves/..../stderr文件中提示找不到<hadoop>/bin/bin/mesos-executor。出现该问题的原因是我在运行不同脚本文件的时候所处的位置不同所致,有些时候是在<hadoop>目录下,而有些时候实在<hadoop>/bin/目录下,这导致<hadoop>/bin/目录下的脚本在识别环境变量HADOOP_HOME出了问题。解决办法就是运行所有脚本的时候都在<hadoop>目录下进行。