当前位置: 首页 > >

Hadoop优化 第一篇 : HDFS/MapReduce

发布时间:

比较惭愧,博客很久(半年)没更新了。最*也自己搭了个博客,wordpress玩的还不是很熟,感兴趣的朋友可以多多交流哈!地址是:http://www.leocook.org/


另外,我建了个QQ群:305994766,希望对大数据、算法研发、系统架构感兴趣的朋友能够加入进来,大家一起学*,共同进步(进群请说明自己的公司-职业-昵称)。


?


1.应用程序角度进行优化


1.1.减少不必要的reduce任务

1.2.外部文件引用

1.3.使用Combiner

1.4.使用合适的Writable类型

1.5.尽可能的少创建新的Java对象


public void map(...) {

for (String word : words) {
output.collect(new Text(word), new IntWritable(1));
}
}

这样会冲去创建对象new Text(word)和new IntWritable(1)),这样可能会产生海量的短周期对象。更高效的写法见下:



class MyMapper … {
Text wordText = new Text();
IntWritable one = new IntWritable(1);
public void map(...) {
for (String word: words) {
wordText.set(word);
output.collect(wordText, one);
}
}
}

b)对于可变字符串,使用StringBuffer而不是String


String类是经过final修饰的,那么每次对它的修改都会产生临时对象,而SB则不会。


?


2. Linux系统层面上的配置调优

2.2. Linux文件系统预读缓冲区大小

2.3. 去除RAID和LVM


2.4. 增大同时打开的文件数和网络连接数

2.5. 关闭swap分区

2.6. I/O调度器选择

?


3. Hadoop*台内参数调优
mapred.tasktracker.map.tasks.maximum / mapred.tasktracker.reduce.tasks.maximum
参数说明:每个TaskTracker上可并发执行的Map Task和Reduce Task数目
默认值:都是2
推荐值:根据具体的节点资源来看,推荐值是(core_per_node)/2~2*(cores_per_node)
单位:无
这个值太小的话,在一个大集群中会造成JobTracker需要处理高并发心跳,可能会有很大的压力。
建议集群规模小于300时,使用默认值3秒,在此基础上,集群规模每增加100台,会加1秒。
mapreduce.tasktracker.outofband.heartbeat
参数说明:主要是为了减少任务分配延迟。它与常规心跳不同,一般的心跳是一定时间间隔发送的,而带外心跳是在任务运行结束或是失败时发送,这样就能在TaskTracker节点出现空闲资源的时候能第一时间通知JobTracker。


3.3. 磁盘块的配置优化
参数说明:map本地计算时所用到的目录,建议配置在多块硬盘上
参数说明:HDFS的数据存储目录,建议配置在多块硬盘上,可提高整体IO性能
例如:




dfs.name.dir
/data1/hadoopdata/mapred/jt/,/data2/hadoopdata/mapred/jt/


c) 存储相关的磁盘配置(HDFS元数据存储):dfs.name.dir


参数说明:HDFS的元数据存储目录,建议设置多目录,每个多目录都可保存元数据的一个备份

3.4. RPC Handler个数和Http线程数优化
参数说明:JobTracker需要并发的处理来自各个TaskTracker的RPC请求,可根据集群规模和并发数来调整RPC Handler的个数。
默认值:10
推荐值:60-70,最少要是TaskTracker个数的4%
单位:无

3.5. 选择合适的压缩算法
mapred.compress.map.output / Mapred.output.compress
map输出的中间结果时需要进行压缩的,指定压缩方式(Mapred.compress.map.output.codec/ Mapred.output.compress.codec)。推荐使用LZO压缩。


3.6. 启用批量任务调度(现在新版本都默认支持了)

3.7. 启用预读机制(Apache暂时没有)

3.8.HDFS相关参数优化
参数说明:hdfs文件副本数
默认值:3
推荐值:3-5(对于IO较为密集的场景可适量增大)
单位:无
参数说明:
默认值:67108864(64MB)
推荐值:稍大型集群建议设为128MB(134217728)或256MB(268435456)
单位:无
参数说明:DateNode上的服务线程数
默认值:10
推荐值:
单位:无
参数说明:HDFS文件删除后会移动到垃圾箱,该参数时清理垃圾箱的时间
默认值:0
推荐值:1440(1day)
单位:无
参数说明:当一个map task执行完之后,本地磁盘上(mapred.local.dir)有若干个spill文件,map task最后做的一件事就是执行merge sort,把这些spill文件合成一个文件(partition)。执行merge sort的时候,每次同时打开多少个spill文件由该参数决定。打开的文件越多,不一定merge sort就越快,所以要根据数据情况适当的调整。
默认值:10
推荐值:
单位:无
参数说明:JVM堆的最大可用内存
默认值:-Xmx200m
推荐值:-Xmx1G | -Xmx4G | -Xmx8G
单位:-Xmx8589934592也行,单位不固定
参数说明:Map Task的输出结果和元数据在内存中占的buffer总大小,当buffer达到一定阀值时,会启动一个后台进程来对buffer里的内容进行排序,然后写入本地磁盘,形成一个split小文件
默认值:100
推荐值:200 | 800
单位:兆
参数说明:即io.sort.mb中所说的阀值
默认值:0.8
推荐值:0.8
单位:无
参数说明:io.sort.mb中分类给元数据的空间占比
默认值:0.05
推荐值:0.05
单位:无
参数说明:Reduce shuffle阶段copier线程数。默认是5,对于较大集群,可调整为16~25
默认值:5
推荐值:16~25
单位:无


4.系统实现角度调优



4.2. 可移植性


Block-intra prefetching:对block内部数据处理方式进行了优化,即一边进行计算,一边预读将要用到的数据。这种方式需要解决两个难题:一个是计算和预取同步,另一个是确定合适的预取率。前者可以使用进度条(processing bar)的概念,进度条主要是记录计算数据和预读数据的进度,当同步被打破时发出同步失效的通知。后者是要根据实际情况来设定,可采用重复试验的方法来确定。
Block-inter prefetching:在block层面上预读数据,在某个Task正在处理数据块A1的时候,预测器能预测接下来将要读取的数据块A2、A3、A4,然后把数据块A2、A3、A4预读到Task所在的rack上。


b) preshuffling

?


参考资料:

国内博客(大部分内容都是AMD白皮书上的翻译):

?



转载于:https://www.cnblogs.com/leocook/p/hadoop_optimize01.html






相关资源:根据三相电流计算正序负序零序的软件



友情链接: