还是说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/h adoop-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
搞定!