Mesos管理Hadoop集群

还是说Mesos的话题。

作为Mesos,本质上是一个支持用户将整个机房中的所有硬件资源全部抽象化,然后随意的组合和分配。而作为Hadoop来说本身就是一个资源的无底洞,两个组合就是绝配了!

首先,还是需要提前按照这篇教程搭建一个Mesos集群。同时,本文中出现的所有IP地址以及主机角色也是按照上文中的配置。

下载hadoop。我们选择了从官网上下载最新的2.5版本。

$ wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.5.0-cdh5.2.0.tar.gz
$ tar zxf hadoop-2.5.0-cdh5.2.0.tar.gz

下载hadoop-mesos插件,故名思意,这个是连接hadoop和meso的桥梁了。

$ wget https://github.com/mesos/hadoop/archive/0.1.0.tar.gz
$ tar zxf 0.1.0.tar.gz
$ cd hadoop-0.1.0/

修改配置文件pom.xml文件(命令:vi pom.xml),添加mesos的版本号。这一点很重要,但很容易被忽略掉。我们的版本是0.23,那么:

<mesos.version>0.23.0</mesos.version>

编译plugin,期间需要mvp来下载依赖库,所以请保持好互联网连接。

$ mvn package
$ cd ..

加载plugin到hadoop(此处 hadoop-2.5.0-cdh5.2.0为hadoop的解压目录)

$ cp hadoop-0.1.0/hadoop-mesos-0.1.0.jar hadoop-2.5.0-cdh5.2.0/share/hadoop/common/lib/

修改hadoop安装包中的文件链接关系。由于默认的hadoop cdh版本采用的yarn,这里就是用默认的mapreduce模块替换掉yarn。

$ cd hadoop-2.5.0-cdh5.2.0
$ mv bin bin-mapreduce2
$ mv examples examples-mapreduce2
$ ln -s bin-mapreduce1 bin
$ ln -s examples-mapreduce1 examples

$ pushd etc
$ mv hadoop hadoop-mapreduce2
$ ln -s hadoop-mapreduce1 hadoop
$ popd

$ pushd share/hadoop
$ rm mapreduce
$ ln -s mapreduce1 mapreduce
$ popd

制作Hadoop的软件包,并上传到hdfs,以供所有的slave节点可以下载使用。这一步挺有意思的,而且讲老实话,我在这里绕了很久的弯路才搞明白。其实在Mesos的slave节点上启动的只是一个sandbox,伴随着任务的启动生成,任务结束就自己销毁,跟本身的操作系统没有任何关系,那hadoop的软件如何部署呢?这就需要直接制作一个hadoop的文件上传到一个共享空间里去——比如hadoop自己的hdfs。

在制作hadoop的软件包之前,首先要调整的是各类配置和环境变量。

etc/hadoop/core-site.xml

<property>
 <name>fs.defaultFS</name>
 <value>hdfs://10.239.21.100:20030</value>
 </property>
 <!-- This value should match the value in fs.defaultFS -->
 <property>
 <name>fs.default.name</name>
 <value>hdfs://10.239.21.100:20030</value>
</property>

etc/hadoop/mapred-site.xml

<configuration>
<property>
 <name>mapred.job.tracker</name>
 <value>10.239.21.100:9001</value>
</property>
<property>
 <name>mapred.jobtracker.taskScheduler</name>
 <value>org.apache.hadoop.mapred.MesosScheduler</value>
</property>
<property>
 <name>mapred.mesos.taskScheduler</name>
 <value>org.apache.hadoop.mapred.JobQueueTaskScheduler</value>
</property>
<property>
 <name>mapred.mesos.master</name>
 <value>10.239.21.100:5050</value>
</property>
<property>
 <name>mapred.mesos.executor.uri</name>
 <value>hdfs://10.239.21.100:20030/hadoop-2.5.0-cdh5.2.0.tar.gz</value>
</property>
</configuration>

etc/hadoop/hadoop-env.sh

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export MESOS_JAR="/usr/local/mesos/build/src/java/target/mesos-0.23.0.jar"
export PROTOBUF_JAR="/home/testuser/hadoop-2.5.0-cdh5.2.0/share/hadoop/mapreduce1/lib/protobuf-java-2.5.0.jar"
export MESOS_NATIVE_JAVA_LIBRARY="/usr/local/mesos/build/src/.libs/libmesos.so"
export MESOS_NATIVE_LIBRARY="/usr/local/mesos/build/src/.libs/libmesos.so"
export HADOOP_CLASSPATH="/usr/local/mesos/build/src/java/target/mesos-0.23.0.jar:$HADOOP_CLASSPATH"
export HADOOP_HEAPSIZE=2000

打包Hadoop, 上传到hdfs。

# cd ..
# mv hadoop-2.5.0-cdh5.2.0 /usr/local/hadoop
# tar cfz hadoop-2.5.0-cdh5.2.0.tar.gz /usr/local/hadoop
# /usr/local/hadoop/bin/hadoop fs -put hadoop-2.5.0-cdh5.2.0.tar.gz /hadoop-2.5.0-cdh5.2.0.tar.gz

启动master节点上的hadoop

# su - mesos

$ hadoop namenode –format
$ hadoop namenode &
$ hadoop datanode &
$ hadoop jobtracker &

重启Mesos cluster(需要切回到root用户)

# mesos-stop-cluster
# mesos-start-cluster

做到这一步已经接近完成了,做一个简单的wordcount看看。

$echo "Hello World Bye World" > /tmp/file0
$echo "Hello Hadoop Goodbye Hadoop" > /tmp/file1
$hadoop fs -mkdir /data
$hadoop fs -copyFromLocal /tmp/file? /data
$hadoop jar /home/testuser/hadoop-2.5.0-cdh5.2.0/share/hadoop/mapreduce1/hadoop-examples-2.5.0-mr1-cdh5.2.0.jar wordcount /data /out

$ hadoop fs –cat /out/part-r-00000

搞定!

推荐阅读:
任何一个合理的应用程序的运行时
在虚拟机的日常使用和开发中,我
之前我们通过几个概念简单的介绍

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据