Hadoop集群优化及相关问题
一、 HDFS优化
1. 集群存在的问题
集群存在单点故障
隐患。一旦NN或者RM出现故障,整套集群将进入瘫痪状态。
解决方案:
将集群配置为高可用群(HA),在一个集群中配置多台NN和RM。
2. HA中存在多台NN,由谁提供服务
高可用集群中存在多台NN,只将其中一台NN的状态设置为
active
并对外听过服务。其余的状态为standby
,作为服务NN的热备。
3. HA中的元数据管理模式是否发生改变
元数据的管理模式没有发生改变,仍然由
fsimage
和edits
管理元数据,不过HA集群中没有配置2NN,所以合并元数据的工作交给standby
的NN完成。NN间的数据同步由JournalNode
完成。
4. JN如何实现源数据共享
HA集群中,当有请求对元数据进行更改时,
active
状态的NN会处理请求,想edits文件中追加记录,通过本地的JN
向其他standby
的NN发送数据。热备收到JN的信息后,会读取本地的JN服务中的最新的编辑日志信息,在内存中生成最新的元数据。如果active
状态的NN发生故障,热备将立即作为替补顶替工作。
二、 小文件对集群的影响
1. 小文件对存储空间的影响
因为HDFS中对数据使用元数据管理,而每条元数据的大小都是固定的(约为150字节)。如果集群中存放了大量的小文件,那么NN中存放元数据的空间就会被占满,但是真实存储数据的存储空间就会大量的剩余,对资源的使用十分浪费。并且过多的元数据也会降低寻址索引的速度。
2. 小文件对MR的影响
小文件过多会严重拖累MR程序效率,因为进行Map阶段计算时,会对文件进行切片,而Map是按照文件的数量进行切片。这样就会产生大量的MT任务,导致MT任务的处理时间远小于启动时间,白白的造成资源浪费。
3. 小文件的解决方案
- 数据采集时,对小文件或小批数据提前进行聚合,合并成大文件再上传到HDFS。
- 处理业务之前,就对小文件提前处理。合并成大文件再进行计算。
- 在MapReduce处理时,可采用
CombineTextInputFormat
提高效率。 - 开启uber模式,实现jvm重用。
三、 MR优化
MR阶段容易出现问题的阶段:数据输入、Map姐u但、Reduce阶段、IO传输阶段、数据倾斜问题、参数调优问题
1. 数据输入阶段
Hadoop对小文件是十分敏感的,大量的小文件会大大增加Map阶段的任务数量,因此导致集群的性能降低。
在MR任务开始之前,将大量的小文件合并成一份大文件,通过
CombineTextInputFormat
实现类完成小文件合并。
2. Map阶段
减少Map阶段的溢写次数(spill),增加溢写空间的内存上限。这样可以减少磁盘的IO次数和压力。
减少文件合并次数(Merge),增大Merge文件的数量,可以减少Merge的合并次数,缩短了MR的处理时间。
在不影响业务逻辑的前提下,使用Combiner对输出结果进行预处理,减少磁盘IO。Combiner是Map阶段输出到Reduce阶段的文件预处理操作。
3. Reduce阶段
优化Reduce阶段,需要合理的分配Map和Reduce的任务数量。
将MR程序设置为,当Map阶段运行到一定程度之后,Reduce开始运行,这样可以减少Reduce的等待时间。
合理的设计Reduce阶段的Buffer,合理利用资源。
需要将多个数据集连接时,尽量避免大量的使用Reduce。
4. IO传输问题
IO传输在MR阶段也需要进行优化。
采用数据压缩算法,按照不同的阶段要求,使用不同的压缩算法对数据进行压缩,以此减少IO传输时间。
使用二进制文件
SequenceFile
。
5. 数据倾斜问题
为什么会出现数据倾斜
?
数据倾斜分为数据频率倾斜
和数据大小倾斜
。
- 频率倾斜:某一个区域的数据量远大于其他区域的数据量。
- 大小倾斜:部分记录的大小远大于平均值。
解决方案:
- 抽样和范围分区:对原始数据进行抽象,通过抽样得到的结果集对预设分区设置边界值。
- 使用自定义分区,将分区规则变得更加合理、高效。
- 不影响整体业务逻辑的前提下,使用
combiner
对Mapper输出到Reducer的结果进行预处理。这样就可以大大的减少数据倾斜。- 存在大小表连接时,使用Map Join ,尽量避免使用Reduce Join。