yarn的搭建
集群规划
配置
- 修改配置文件mapred-sitex.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<-- 跨平台配置 -->
<property>
<name>mapreduce.app-submission.cross-platform</name>
<value>true</value>
</property>
- 修改配置文件yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node02</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
- 将配置好信息分发到所有节点
- 在node02 node03 node04上启动zookeeper
./zkServer.sh start
- node01上启动hdfs和yarn集群
start-dfs.sh
start-yarn.sh
- 在node02上单独启动一个备用ResourceManager
(node01上已自动启动一个active的RM)
yarn-daemon.sh start resourcemanager
- 从8088端口查看管理页面
测试案例
wordcount
使用MapReduce提供的测试用例wordcount
- 到mapreduce的jar包目录下
cd $HADOOP_HOME/share/hadoop/mapreduce
- 运行测试用例
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /input /output
- input:是hdfs文件系统中数据所在的目录
- ouput:是hdfs中不存在的目录,程序运行的结果会输出到该目录,若目录存在会报错
- 查看运行结果
hdfs dfs -cat /output/*
Shuffle调优
Map端调优
选项 | 类型 | 默认值 | 类型 |
---|---|---|---|
io.sort.mb | int | 100 | 缓存map中间结果的buffer大小(MB) |
io.sort.record.percent | float | 0.05 | io.sort.mb中用来保存map output记录边界的百分比 其他缓存用来保存数据 |
io.sort.spill.percent | float | 0.80 | map开始做spill操作的阈值 |
io.sort.factor | int | 10 | 做merge操作时同时操作的stream数上限 |
min.num.spill.for.combine | int | 3 | combiner函数运行的最小spill数 |
mapred.compress.map.output | boolean | false | map中间结果是否采用压缩 |
-
io.sort.mb
一个map都会对应存在一个内存缓冲区kvbuffer,kvbuffer默认为100MB,大小可以根据job提交时设定的参数io.sort.mb来调整。当map产生的数据非常大,并且把io.sort.mb调大,那么在map计算过程中spill的次数就会降低,map task对磁盘的操作就会变少,如果map tasks的瓶颈在磁盘上,这样调整就会大大提高map的计算性能。 -
io.sort.spill.percent
io.sort.spill.percent控制的是kvbuffer开始spill到磁盘的阈值,默认为0.80。这个参数同样也是影响spill频繁程度,进而影响map task运行周期对磁盘的读写频率。 -
io.sort.factor
merge的过程中,有一个参数io.sort.factor可以调整这个过程的行为,默认为10。该参数表示当merge spill文件时,最多能有多少并行的stream向merge文件中写入。如果map的中间结果非常大,调大io.sort.factor,有利于减少merge次数,进而减少 map对磁盘的读写频率,有可能达到优化作业的目的。 -
min.num.spill.for.combine
当job指定了combiner时,会在map端根据combiner定义的函数将map结果进行合并。运行combiner函数的时机有可能会是merge完成之前或之后。这个时机由min.num.spill.for.combine参数控制,默认为3。通过这样的方式,就可以在spill非常多需要merge,并且很多数据需要做combine的时候,减少写入到磁盘文件的数据数量,同样减少了对磁盘的读写频率,有可能达到优化作业的目的。 -
mapred.compress.map.output
将这个参数设置为true时,那么map在写中间结果时,就会将先数据压缩后再写入磁盘,读结果时也会采用先解压后读取数据。这样做的后果就是:写入磁盘的中间结果数据量会变少,但是cpu会消耗一些用来压缩和解压。所以这种方式通常适合job中间结果非常大,瓶颈不在cpu,而是在磁盘的读写的情况。 -
mapred.map.output.compression.codec
当采用map中间结果压缩的情况下,通过mapred.map.output.compression.codec参数可以选择不同的压缩模式,现有支持的压缩格式:GzipCodec,LzoCodec,BZip2Codec,LzmaCodec等压缩格式。通常来说,想要达到比较平衡的cpu和磁盘压缩比,LzoCodec比较适合。但也要取决于job的具体情况。
Reduce端优化
选项 | 类型 | 默认值 | 类型 |
---|---|---|---|
mapred.reduce.parallel.copies | int | 5 | 每个reduce并行下载map结果的最大线程数 |
mapred.reduce.copy.backoff | int | 300 | reduce下载线程最大等待时间(s) |
io.sort.factor | int | 10 | 做merge操作时同时操作的stream数上限 |
mapred.job.shuffle.input.buffer.percent | float | 0.7 | 用来缓存shuffle数据的reduce task heap百分比 |
mapred.job.shuffle.merge.percent | float | 0.66 | 缓存的内存中多少百分比后开始做spill操作 |
mapred.job.reduce.input.buffer.percent | float | 0.0 | sort完成后reduce计算阶段用来缓存数据的百分比 |
mapreduce.reduce.memory.mb | String | 1024 | 这只map task reduce task使用的内存大小 |
-
mapred.reduce.parallel.copies
对一个reduce来说,下载可以从并行的多个map中下载,并行度通过参数mapred.reduce.parallel.copies进行设置。默认为5个并行的下载线程,这个参数比较适合map很多并且完成的比较快的job的情况下调大,有利于reduce更快的获取属于自己部分的数据。 -
mapred.reduce.copy.backoff
reduce下载线程的最大下载时间段通过参数mapred.reduce.copy.backoff设置,默认为300s。如果超过改时间,reduce下载线程中断,并尝试从其他地方下载。
如果集群环境的网络本身是瓶颈,那么用户可以通过调大这个参数来避免reduce下载线程被误判为失败的情况。不过在网络环境比较好的情况下,没有必要调整。 -
io.sort.factor
Reduce将map结果下载到本地时,同样也是需要进行merge,所以io.sort.factor的配置选项同样会影响reduce进行 merge时的行为,可能通过调大这个参数来加大一次merge时的并发吞吐,优化reduce效率。 -
mapred.job.shuffle.merge.percent
mapred.job.shuffle.merge.percent这个限度阈值可以控制merge的开始,默认为0.66。如果下载速度很快,很容易就把内存缓存撑大,那么调整一下这个参数有可能会对reduce的性能有所帮助。 -
mapred.job.reduce.input.buffer.percent
mapred.job.reduce.input.buffer.percent参数默认为0,表示reduce是全部从磁盘开始读处理数据。如果这个参数大于0,那么就会有一定量的数据被缓存在内存并输送给reduce,当reduce计算逻辑消耗内存很小时,可以分一部分内存用来 缓存数据
Reduce Task数量调优
选项 | 类型 | 默认值 | 类型 |
---|---|---|---|
mapred.reduce.tasks | int | 1 | reduce task数量 |
mapred.tasktracker.map.tasks.maximum | int | 2 | 每个节点上能够启动map task的最大数量 |
mapred.tasktracker.reduce.tasks.maximum | int | 2 | 每个节点上能够启动reduce task的最大数量 |
mapred.reduce.slowstart.completed.maps | float | 0.05 | map阶段完成5%的时候开始进行reduce计算 |
参数设置的三种方式:
- 在代码的conf对象中设置
- 提交任务的时候使用-D设置
hadoop jar wc.jar com.sxt.hadoop.mr.wc.WC -Dmapred.reduce.tasks=100
#有多个参数加多个-D
- 在配置文件中设置mapred-site.xml设置