赞
踩
Job运行时,尽量让所有的节点都有任务处理,这样能尽量保证集群资源被充分利用,任务的并发度达到最大。可以通过调整处理的数据量大小,以及调整map和reduce个数来实现。
努力避免出现以下场景:
一个job中,每个MapTask或ReduceTask的执行时间只有几秒钟,这就意味着这个job的大部分时间都消耗在task的调度和进程启停上了,因此可以考虑增加每个task处理的数据大小。建议一个task处理时间为1分钟。
Shuffle阶段是MapReduce性能的关键部分,包括了从MapTaskask将中间数据写到磁盘一直到ReduceTask拷贝数据并最终放到Reduce函数的全部过程。这一块Hadoop提供了大量的调优参数。
mapreduce.map.memory.mb
mapreduce.map.cpu.vcores
当集群内存资源充足,考虑增大mapreduce.task.io.sort.mb提高溢写的效率,而且会减少中间结果的文件数量。
建议:
mapreduce.reduce.memory.mb=5G(默认1G)
mapreduce.reduce.cpu.vcores=1(默认为1)。
集群规模很大时(几百上千台节点的集群),个别机器出现软硬件故障的概率就变大了,并且会因此延长整个任务的执行时间推测执行通过将一个task分给多台机器跑,取先运行完的那个,会很好的解决这个问题。对于小集群,可以将这个功能关闭。
建议:
- 大型集群建议开启,小集群建议关闭!
- 集群的推测执行都是关闭的。在需要推测执行的作业执行的时候开启
MapReduce的AM在申请资源的时候,会一次性申请所有的Map资源,延后申请reduce的资源,这样就能达到先执行完大部分Map再执行Reduce的目的。
mapreduce.job.reduce.slowstart.completedmaps
当多少占比的Map执行完后开始执行Reduce。默认5%的Map跑完后开始起Reduce。如果想要Map完全结束后执行Reduce调整该值为1
- HDFS:hadoop的存储每个文件都会在NameNode上记录元数据,如果同样大小的文件,文件很小的话,就会产生很多文件,造成NameNode的压力。
- MR:Mapreduce中一个map默认处理一个分片或者一个小文件,如果map的启动时间都比数据处理的时间还要长,那么就会造成性能低,而且在map端溢写磁盘的时候每一个map最终会产生reduce数量个数的中间结果,如果map数量特别多,就会造成临时文件很多,而且在reduce拉取数据的时候增加磁盘的IO。
那么如何处理小文件?
- 从源头解决,尽量在HDFS上不存储小文件,也就是数据上传HDFS的时候就合并小文件
- 通过运行MR程序合并HDFS上已经存在的小文件
- MR计算的时候可以使用CombineTextInputFormat来降低MapTask并行度
- MR是一个并行处理的任务,整个Job花费的时间是作业中所有Task最慢的那个了。
为什么会这样呢?为什么会有的Task快有的Task慢?
- 数据倾斜,每个Reduce处理的数据量不是同一个级别的,所有数据量少的Task已经跑完了,数据量大的Task则需要更多时间。
- 有可能就是某些作业所在的NodeManager有问题或者container有问题,导致作业执行缓慢。
如何解决数据倾斜的问题呢?
- 默认的是hash算法进行分区,我们可以尝试自定义分区,修改分区实现逻辑,结合业务特点,使得每个分区数据基本平衡
- 可以尝试修改分区的键,让其符合hash分区,并且使得最后的分区平衡,比如在key前加随机数n-key。
- 抽取导致倾斜的key对应的数据单独处理。
如果不是数据倾斜带来的问题,而是节点服务有问题造成某些map和reduce执行缓慢呢?
使用推测执行找个其他的节点重启一样的任务竞争,谁快谁为准。推测执行时以空间换时间的优化。会带来集群资源的浪费,会给集群增加压力。
yarn.nodemanager.resource.memory-mb 默认是8192
yarn.nodemanager.resource.cpu-vcores
该节点上YARN可使用的虚拟CPU个数,默认是8。
目前推荐将该值设值为逻辑CPU核数的1.5~2倍之间
YARN的NodeManager提供2种Container的启动模式。
yarn.nodemanager.container-executor.class
运行的一个大任务,map总数达到了上万的规模,任务失败,发现是ApplicationMaster(以下简称AM)反应缓慢,最终超时失败。
失败原因是Task数量变多时,AM管理的对象也线性增长,因此就需要更多的内存来管理。AM默认分配的内存大小是1.5GB。
建议:
任务数量多时增大AM内存。
yarn.app.mapreduce.am.resource.mb
查看当前jvm内存使用以及垃圾回收情况
jstat -gc -t 7653 1s #显示pid是7653的垃圾回收堆的行为统计
结果解释:
#C即Capacity 总容量,U即Used 已使用的容量 S0C: 当前survivor0区容量(kB)。 S1C: 当前survivor1区容量(kB)。 S0U: survivor0区已使用的容量(KB) S1U: survivor1区已使用的容量(KB) EC: Eden区的总容量(KB) EU: 当前Eden区已使用的容量(KB) OC: Old空间容量(kB)。 OU: Old区已使用的容量(KB) MC: Metaspace空间容量(KB) MU: Metacspace使用量(KB) CCSC: 压缩类空间容量(kB)。 CCSU: 压缩类空间使用(kB)。 YGC: 新生代垃圾回收次数 YGCT: 新生代垃圾回收时间 FGC: 老年代 full GC垃圾回收次数 FGCT: 老年代垃圾回收时间 GCT: 垃圾回收总消耗时间
开启HDFS GC详细日志输出
编辑hadoop-env.sh
编辑hadoop-env.sh
增加JMX配置打印详细GC信息
指定一个日志输出目录;注释掉之前的ops
增加新的打印配置
查看内存使用:
free -m
清理内存:
echo 1 >>/proc/sys/vm/drop_caches
echo 2 >>/proc/sys/vm/drop_caches
echo 3 >>/proc/sys/vm/drop_caches
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。