在master里面安装ResourceManager和HistoryServer:
yum install hadoop-yarn-resourcemanager hadoop-mapreduce-historyserver
yum install hadoop-yarn-nodemanager hadoop-mapreduce
先把mapred-site.xml和yarn-site.xml贴出来,有几个地方后面解释。
mapred-site.xml:
mapreduce.framework.name
yarn
mapreduce.jobhistory.address
MASTER:10020
mapreduce.jobhistory.webapp.address
MASTER:19888
mapreduce.jobhistory.intermediate-done-dir
/mr-history/tmp
mapreduce.jobhistory.done-dir
/mr-history/done
mapred.child.java.opts
-Xmx1024m
yarn.resourcemanager.resource-tracker.address
MASTER:8031
yarn.resourcemanager.address
MASTER:8032
yarn.resourcemanager.scheduler.address
MASTER:8030
yarn.resourcemanager.admin.address
MASTER:8033
yarn.resourcemanager.webapp.address
MASTER:8088
yarn.nodemanager.aux-services
mapreduce.shuffle
yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler
yarn.log-aggregation-enable
true
List of directories to store localized files in.
yarn.nodemanager.local-dirs
/var/lib/hadoop-yarn/cache/${user.name}/nm-local-dir
Where to store container logs.
yarn.nodemanager.log-dirs
/var/log/hadoop-yarn/containers
yarn.nodemanager.remote-app-log-dir
/var/log/hadoop-yarn/apps
Classpath for typical applications.
yarn.application.classpath
$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/*
yarn.app.mapreduce.am.staging-dir
/user
yarn.nodemanager.resource.memory-mb
2560
yarn.scheduler.minimum-allocation-mb
512
yarn.scheduler.maximum-allocation-mb
1024
yarn.nodemanager.vmem-pmem-ratio
6
yarn.app.mapreduce.am.resource.mb
512
下面就我的配置和官方文档不同的几个地方说明一下。
仅仅按照官方文档配置,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就可以发挥作用了。
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和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。