Hadoop YARN的安装配置

最近配置了Hadoop的新MapReduce框架:YARN。总体上是按照CDH的文档配置的: http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/4.2.1/CDH4-Installation-Guide/cdh4ig_topic_11_4.html。但是实际应用中发现这个文档里好多东西都没说全,自己补充了一些。这里记录一下备忘。

安装

在master里面安装ResourceManager和HistoryServer:

yum install hadoop-yarn-resourcemanager hadoop-mapreduce-historyserver

在各个slave里安装NodeManager:

yum install hadoop-yarn-nodemanager hadoop-mapreduce

注意,一定要安装hadoop-mapreduce这个包,要不然jar包不全。(master里面因为historyserver包,直接就把这个装上了。)

配置文件

先把mapred-site.xml和yarn-site.xml贴出来,有几个地方后面解释。

mapred-site.xml:

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>MASTER:10020</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>MASTER:19888</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.intermediate-done-dir</name>
    <value>/mr-history/tmp</value>
  </property>

  <property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>/mr-history/done</value>
  </property>
  <property>
    <name>mapred.child.java.opts</name>
    <value>-Xmx1024m</value>
  </property>
</configuration>

yarn-site.xml:

<configuration>
 <property>
     <name>yarn.resourcemanager.resource-tracker.address</name>
     <value>MASTER:8031</value>
 </property>
 <property>
     <name>yarn.resourcemanager.address</name>
     <value>MASTER:8032</value>
  </property>
  <property>
     <name>yarn.resourcemanager.scheduler.address</name>
     <value>MASTER:8030</value>
  </property>
  <property>
     <name>yarn.resourcemanager.admin.address</name>
     <value>MASTER:8033</value>
  </property>
  <property>
     <name>yarn.resourcemanager.webapp.address</name>
     <value>MASTER:8088</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce.shuffle</value>
  </property>

  <property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>

  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>

  <property>
    <description>List of directories to store localized files in.</description>
    <name>yarn.nodemanager.local-dirs</name>
    <value>/var/lib/hadoop-yarn/cache/${user.name}/nm-local-dir</value>
  </property>

  <property>
    <description>Where to store container logs.</description>
    <name>yarn.nodemanager.log-dirs</name>
    <value>/var/log/hadoop-yarn/containers</value>
  </property>

  <property>
    <name>yarn.nodemanager.remote-app-log-dir</name>
    <value>/var/log/hadoop-yarn/apps</value>
  </property>

  <property>
    <description>Classpath for typical applications.</description>
     <name>yarn.application.classpath</name>
     <value>
        $HADOOP_CONF_DIR,
        $HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,
        $HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,
        $HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*,
        $YARN_HOME/*,$YARN_HOME/lib/*,
        $HBASE_HOME/*,$HBASE_HOME/lib/*,$HBASE_HOME/conf/*
     </value>
  </property>
  <property>
    <name>yarn.app.mapreduce.am.staging-dir</name>
    <value>/user</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>2560</value>
  </property>
  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>512</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>6</value>
  </property>
  <property>
    <name>yarn.app.mapreduce.am.resource.mb</name>
    <value>512</value>
  </property>
</configuration>

配好配置文件后,还有按照官方文档里面说的,在本地文件系统和HDFS里面创建各种文件夹,然后赋予权限,这里就不赘述了。

下面就我的配置和官方文档不同的几个地方说明一下。

HistoryServer的问题

仅仅按照官方文档配置,HistoryServer是没用的。Job结束了以后在HistoryServer里根本看不见。

原因是官方文档里没配置HistoryServer在HDFS中的存储目录:mapreduce.jobhistory.intermediate-done-dir和mapreduce.jobhistory.done-dir。

我们在mapred-site.xml中配置好了这两个变量后,还要在HDFS中创建目录并且赋予权限:

sudo -u hdfs hdfs dfs -mkdir -p /mr-history/tmp
sudo -u hdfs hdfs dfs -mkdir -p /mr-history/done
sudo -u hdfs hdfs dfs -chmod -R 1777 /mr-history
这样HistoryServer就可以发挥作用了。


classpath的问题

yarn.application.classpath中设定了Job运行时需要用到的jar包。如果你需要什么其他的jar包的话,可以把它们上传到各个服务器上,然后把路径添加到这里。比如我把HBASE_HOME给添加上了,这样Job就可以读写HBase了。

这里要说的是,添加的路径里有环境变量的时候,这些环境变量应该在哪里定义。我觉得最好不要在/etc/profile里面,因为YARN运行的时候是用yarn用户,如果不重启机器的话是读不到这些变量的。最好是写在yarn-env.sh里面,因为YARN在启动的时候会先执行这个脚本,这样能确保yarn用户能够读到这些变量。(或者,变量还是写在/etc/profile里面,但是在yarn-env.sh中加一句:. /etc/profile)

YARN的内存管理

YARN和MapRedcue1的一个很大不同,就是YARN不能在配置文件里设置最大的Map和Reduce的Task数。YARN可以根据内存资源的分配来自动调节各个服务器上运行的Task的数量。这一点上,确实YARN的做法更先进,更合理,但是同时也更麻烦了。

首先,“yarn.nodemanager.resource.memory-mb”这个参数定义了每一个NodeManager(就是运行各个Task的Slave)能够提供的内存数。这个数其实是可以随便写的,写多少都行,但是写的太多的话,YARN同时启动的Task太多,机器也受不了,还是量力而行吧。

“yarn.scheduler.minimum-allocation-mb”和“yarn.scheduler.maximum-allocation-mb”,顾名思义,就是每一个Task可以分配到的最小和最大内存数。做个除法,就知道每台机器上面能同时运行几个Task了吧?不过还有一个小问题,YARN在运行一个Job的时候要选一台Slave做Application Master的,这个所谓的AM其实也是一个Task,也是要占内存的,是要分配“yarn.app.mapreduce.am.resource.mb”这么多的内存给它的。所以经常可以看到这样的现象:总是有那么一台Slave,运行的Task数总是比别人少一个。

要想让所有Slave运行一样数量的Task,就要设置得“巧妙”一点儿。比如向我上面的设置,每一台Slave提供2560mb(2048+512),每一个Task最小512mb最大1024mb。这样就可以让每一个普通结点运行2个Task,AM运行2个Task加上一个AM任务。

另外,关于内存,还是几个小问题:

1. “yarn.nodemanager.vmem-pmem-ratio”这个一定要设置。这个的意思是,每一个Task最大的虚拟内存,是实际内存的多少倍。这个值如果不设的话,默认才2.1。比如,当给一个Task分配了512mb内存的时候,2.1倍才1075mb。JVM在申请虚拟内存的时候一点儿都不客气,经常伸手就要1.4g,这时候YARN就会判断这个Task内存超标了,直接kill掉。

2.“mapred.child.java.opts”这个富有浓郁MapReduce1特色的参数,到了YARN这样全自动的内存管理里面,竟然也是一定要设置的。不知道是不是因为YARN还不是很完善。这个如果不设置的话,会有一个默认值“-Xmx200m”。YARN在启动一个Task的JVM的时候,就会把这个参数加到JVM参数里。才200m啊!!!前面那些参数就是设出花儿来也没用啊!!!满眼的Java Heap Space啊!!!

3.“yarn.app.mapreduce.am.resource.mb”,前面也说过了,是AM的内存数。最好还是设一下,因为默认的值比较大,要1G多,没这个必要。而且有时候不小心把“yarn.nodemanager.resource.memory-mb”设太小了,YARN就会因为分配不到AM所需的内存而一直不开始运行Job。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值