今天群里有个有经验的大神提了一个问题(@尘事随缘),记录下来。
A君搭建一个小型的集群,7台DataNode,一台主节点。需求是这样:通过MR程序去读取Hbase表里面的数据,程序运行后发现速度比较慢,通过查询任务详细发现,累计需要1542个Map完成,目前有14个MAP在执行。客户对此速度表示不满意,请问如何优化?
首先通过Job看,有1542个Map需要执行,说明Hbase,有1542个分区(每个分区对应一个Map),这是一个知识点。
数据不存在热点,Hbase处理性能没有问题
有1542个Map需要执行,但是并行的只有14个,说明Map的数据量不够。
经过询问,他没有做配置,默认每台机器只有2个Map,所以并行度是7*2=14,也就是同时运行14个Map
所以提示他去配置文件重新配置,每台机器配置的Map数据量是CPU个,因为8个CPU,所以配置8个MAP。那么并行处理能力是7*8=56(同时56个Map)。
运行速度提升4倍。
参数修改:
conf/mapred-site.xml
1.0 版本是这个参数 mapred.tasktracker.map.tasks.maximum 配置Map
mapred.tasktracker.reduce.tasks.maximum 配置Reduce
https://hadoop.apache.org/docs/r1.0.4/mapred-default.html
2.0 版本是这个参数
mapreduce.map.cpu.vcores 配置 每个Map Task 需要的虚拟CPU的个数
http://hadoop.apache.org/docs/r2.4.1/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
反思:
Hadoop集群搭建好了,必须要做优化(优化需要根据你不同的业务场景来做优化)
一个Region对应一个Map,那么反过来,批量导入数据到Hbase,怎么优化呢?