【hadoop2.2(yarn)】基于yarn成功执行分布式map-reduce,记录问题解决过程。
hadoop2.x改进了hadoop1.x的架构, 具体yarn如何工作以及改进了什么可以在网上学, 这里仅记录我个人搭建的问题和理解,希望能帮助遇到困难的朋友。
在开始前,必须了解yarn版本的mapreduce框架基础组件包括1个resourcemanager和每个slave上各1个nodemanager,其他进程均由mapreduce任务动态创建。
1,怎么简单高效的部署分布式集群?
答:先在1台机器上准备好hadoop和java环境,将java和hadoop的jar包环境变量写到.bashrc里去,填写hadoop配置文件。最后,配置这台服务器到其他所有slave节点的信任关系,将整个hadoop目录scp到slave节点上即可完成部署。
2,hadoop配置有哪些是至关重要的?
a) core-site.xml:指定hdfs的客户端访问地址,指定hadoop的临时文件目录:
<configuration> <property> <name>hadoop.tmp.dir</name> <value>/home/liangdong/hadoop/hadoop/tmp/hadoop-${user.name}</value> <description>A base for other temporarydirectories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://10.42.41.51:8010</value> <description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation. The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implementation class. The uri's authority is used to determine the host, port, etc. for a filesystem. </description> </property> </configuration>
b) hdfs-site.xml:指定hdfs副本个数,按照我的理解,上述fs.default.name是namenode的RPC通讯地址,而这里配置的是namenode和secondarynodenode的管理员HTTP地址,并且secondarynamenode会启动到对应的Host节点上,直到namenode挂了,那么secondarynamenode就会bound到fs.default.name里的端口(8010)提供服务。
<configuration> <property> <name>dfs.replication</name> <value>1</value> <description>Default block replication. Theactual number of replications can be specified when the file is created. Thedefault is used if replication is not specified in create time. </description> </property> <property> <name>dfs.namenode.http-address</name> <value>m1-reader-q1preonline07.m1.baidu.com:50070</value> <description>Secondary get fsimage and edits via dfs.http.address</description> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>m1-reader-q1preonline08.m1.baidu.com:50070</value> <description>NameNode get the newest fsimage via dfs.secondary.http.address</description> </property> </configuration>
c) mapred-site.xml:关于mapreduce框架的配置,指定框架为yarn,指定map和reduce默认的个数:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description></description> </property> <property> <name>mapred.map.tasks</name> <value>10</value> <description> As a rule of thumb, use 10x the number of slaves(i.e., number of tasktrackers). </description> </property> <property> <name>mapred.reduce.tasks</name> <value>2</value> <description> As a rule of thumb, use 2x the number of slaveprocessors (i.e., number of tasktrackers). </description> </property> </configuration>
d)yarn-site.xml:指定resourcemanager的监听客户端提交地址,监听applicationMaster来申请资源的地址,监听nodemanager来上报状态的地址,还有2个给管理员访问的HTTP地址,还有一个至关重要的配置是必须写的,这个配置是2.2版本一个bug导致不会加载默认参数,所以这里要给它写上,就是aux-services。
<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.resourcemanager.address</name> <value>m1-reader-q1preonline07.m1.baidu.com:8032</value> <description></description> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>m1-reader-q1preonline07.m1.baidu.com:8030</value> <description></description> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>m1-reader-q1preonline07.m1.baidu.com:8031</value> <description></description> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>m1-reader-q1preonline07.m1.baidu.com:8033</value> <description></description> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>m1-reader-q1preonline07.m1.baidu.com:8088</value> <description></description> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
最后,把所有datanode的机器ip/host填到slaves文件里(自己创建一个):
m1-reader-q1preonline07.m1.baidu.com m1-reader-q1preonline08.m1.baidu.com m1-reader-q1preonline09.m1.baidu.com m1-reader-q1preonline10.m1.baidu.com
slaves文件是给启动集群脚本看的,它会ssh到每台slave机器上启动datanode和nodemanager。而上述其他配置文件,一方面用于指导hadoop集群的进程启动,一方面也被hadoop客户端读取从而获取集群的一些监听地址,这样才能连接上去访问集群或者提交mapreduce任务,这是很容易理解的。
3,怎么启动集群和停止集群?
答:sbin/start-all.sh sbin/stop-all.sh
4,怎么动态加个slave节点?
答:把hadoop环境拷贝一份过去,配好控制机到slave的信任,然后再控制机上修改一下slaves文件把机器IP加进去,然后再sbin/start-all.sh一次,脚本检测到这个slave上进程没启动就给拉起来了,一旦拉起来slave上的进程会根据各种配置文件主动连到namenode和resourecemanager上,就进去集群了。
5,在yarn上怎么跑mapreduce?
答:和hadoop v1一样,就hadoop streaming去提交就可以了,这里hadoop客户端会从配置文件里读yarn resourcemangager提交任务地址并向其提交任务,和v1版本向jobtracker提交不同。
6,怎么看mapreduce任务状态?
答:上面配置里有yarn-site.xml的配置,里面不是有2个管理员地址吗,就去那里看就可以了,如果一切配置得当,你应该可以看到所有集群节点以及当前在上面跑了多少个map等等信息。
7,当mapreduce跑起来之后是什么样子?
答:你理应能够在所有slaves节点上看到大量java进程,使用jps命令可以看到applicationMaster进程还有若干jar包或者你的map/reduce程序在跑,最好通过resoucemanager的http页面观察一下是不是所有slave都进入了cluster,并且是不是都有container启动。
8,有任何问题可以留言,我个人发现的新问题也会继续追加,谢谢。