Hadoop性能优化点小结

最近一段时间看了许多Hadoop性能优化相关的资料,于是花了点时间整理了一下,希望给正在苦于Hadoop集群性能问题的博友们一点建议吧。

1、Hadoop在存储有输入数据的节点上运行map任务,可以获得最佳性能,称为“数据本地化优化“,所以一般会设置最大分片的大小应该与块大小相同,如果分片跨越2个块的大小,必然要经过网络传输到不同的节点上读取数据。

2、适当的时候使用Combine函数。Combine的阶段是在map阶段到reduce阶段之间进行的,在某些Job中,设置Combine可以减少Shuffle过程中数据的传输量,并且不会影响到最终的结果。

3、有的时候我们想要导入一部分数据到HDFS,这时候可以不用自己重新写一个应用程序,可以通过Flume或者Sqoop等工具导入。

4、Hadoop中有一个有用的distcp分布式复制程序,可以用于Hadoop文件系统间的文件数据拷贝,也可以用于将外部数据拷贝到Hadoop中,distcp的典型应用场景是在2个HDFS集群之间传输数据。

5、向HDFS复制数据后,需要考虑集群的负载均衡性,这时候可以利用均衡器(balancer)等工具。

6、Hadoop存档工具使用,减少namenode上保存每个块的元数据所耗费的内存,因为大量的小文件会耗尽namenode上大量的内存。

7、为了性能上的考虑,可以使用原生的native类库来实现压缩和解压缩,例如,使用原生gzip类。

8、对于大文件来说,不要使用不支持切分整个文件的压缩格式,因为会失去数据的本地性。,使用支持切分的压缩格式,例如bzip2。

9、在Hadoop序列化中,对整数进行编码的时候,有2种选择,一个是定长格式,1个是变长格式,定长格式适合对整个值域空间中分布比较均匀的数据进行编码。但是大部分的数值变量的分布式不均匀的,这样可以使用变长格式,可以节省空间。

10、NullWritable是Writable的特殊类型,如果不需要使用键或值的序列化地址的时候,可以将键或值声明为NUllWritable。

11、目前尽管多数的MR程序使用的是Writable类型的键和值,但是这不是MapReduce API所强制使用的。其实可以使用任何类型,只要能有一种机制实现每个类型与二进制类型表示的来回转换就可以了。

12、MapReduce应用程序是一个分布式的程序,所以最好使用单元测试来确保函数的运行符合预期,一般是先通过小型数据集的测试。

13、可以使用MRUnit测试库,进行map,reduce功能函数的测试。

14、MapReduce相关作业的运行状态信息可以通过Web UI来查看。

15、在超过数亿条记录的数据集中,有的时候我们可以扔掉不正确的记录,当然我们可以通过自定义计数器来捕获不合理的数据。

16、Mapper需要运行多长时间,如果只运行几秒钟,则看看能否用更少的Mapper来运行,时间长度取决于使用的输入格式。

17、为了达到最佳性能,集群中reducer数量应该略少于reducer中的任务槽数。

18、使用自定义的Writable对象或自定义的comparator。

19、使用HPROF分析工具来实现任务。HPROF是JDK自带的分析工具。

20、在map输出写到磁盘的过程中对其进行压缩可以使得写磁盘的速度更快,并且可以节约磁盘空间,减少传给reducer的数据量。

21、在map端要避免多次溢写操作,在Shuffle过程中尽量多提供内存空间,减少频繁的IO操作。

22、有的时候可以选择关闭推测执行,在一个繁忙的集群中,推测执行会减少整体的吞吐量,冗余任务的执行必然会占据一部分的资源。

23、当有大量的超短执行时间的任务运行的时候,可以考虑JVM的重用。

24、计数器是MapReduce中的高级属性,他可以作为作业统计信息的有效手段之一。通常可用于记录某一特定事件的发出次数。

25、在Hadoop中可以利用DistributedCache分布式缓存来提高作业执行的效率。


参考资料:<<Hadoop权威指南>>.Tom.White

原文地址:https://www.cnblogs.com/bianqi/p/12183938.html