#Hadoop数据压缩
数据压缩
- 1)MR操作过程中进行大量数据传输,就需要对数据进行压缩
- 2)压缩技术能够有效减少底层存储(HDFS)读写字节数,提高的网络带宽和磁盘空间的效率
- 3)数据压缩能够有效节省资源
- 4)压缩事MR程序的优化策略
- 5)通过压缩编码对Mapper或者reduce数据传输进行的压缩,以减少磁盘IO
压缩的基本原则
- 1)运算密集型任务少用压缩
- 2)IO密集型的任务,多用压缩
MR支持的压缩编码
- DEFAULT 是自带编码 .default 不可切分
- Gzip 是自带编码 .gz 不可切分
- bzip2 是自带编码 .bz2 可以切分
- LZO 非自带编码 .lzo 可以切分
- Snappy 非自带编码 .Snappy 不可切分
编码/解码器
DEFAULT org.apache.hadoop.io.compress.DefaultCodec
Gzip org.apache.hadoop.io.compress.GzipCodec
bzip2 org.apache.hadoop.io.compress.BZip2Codec
LZO com.hadoop.compression.lzo.lzoCodec
Snappy org.apache.hadoop.io.compress.SnappyCodec
压缩性能
Gzip 原大小:8.3GB 压缩后:1.8GB 压缩速度:17.5MB/s 解压速度:58MB/s
bzip2 原大小:8.3GB 压缩后:1.1GB 压缩速度:2.4MB/s 解压速度:9.5MB/s
LZO 原大小:8.3GB 压缩后:2.9GB 压缩速度:49.3MB/s 解压速度:74.6MB/s
设置压缩方式
1 | mapper端: |
Hadoop优化
MapReduce程序的效率瓶颈
相关
- MR功能:分布式离线计算
- 计算机性能:CPU、内存、磁盘、网络
- I/O操作优化:
数据倾斜(代码优化)
map和reduce的个数设置不合理
map运行时间太长,导致reduce等待时间过久
小文件过多(CombineTextInputFormat小文件合并)
不可分快的超大文件(不断的溢写)
多个溢写小文件需要多次merge优化方法
- 数据输入
合并小文件:在执行MR任务前就进行小文件合并
采用CombineTextInputFormat来作为输入来作为输入端大量小文件的场景 Map阶段
减少溢写次数(增加内存200MB 80%):减少磁盘I/O
1
2
3
4
5
6
7
8
9
10
11mapred-default.xml:
<property>
<name>mapreduce.task.io.sort.mb</name>
<value>200</value>
</property>
<property>
<name>mapreduce.map.sort.spill.percent</name>
<value>0.80</value>
</property>减少合并的次数
1
2
3
4
5mapred-default.xml:
<property>
<name>mapreduce.task.io.sort.factor</name>
<value>10</value> //文件的个数,数值越大合并次数越少
</property>在map之后,不影响业务逻辑的情况下可以使用combiner
Reduce阶段
合理的设置map与reduce的个数
设置map/reduce共存1
2
3
4
5mapred-default.xml:
<property>
<name>mapreduce.job.reduce.skowstart.completedmaps</name>
<value>0.05</value> //设置运行一定程度的map后,启动reduce,减少等待时间
</property>合理设置reduce的buffer
1
2
3
4
5mapred-default.xml:
<property>
<name>mapreduce.reduce.markreset.buffer.percent</name>
<value>0.0</value>
</property>I/O传输
进行数据压缩
使用sequenceFile- 数据倾斜
进行范围分区
自定义分区
Combine
能用mapJoin的坚决不用reduceJoin 参数调优
分配map程序CPU核心数
1
2
3
4
5mapred-default.xml:
<property>
<name>mapreduce.map.cpu.vcores</name>
<value>1</value> //核心数
</property>分配reduce程序CPU核心数
1
2
3
4
5mapred-default.xml:
<property>
<name>mapreduce.reduce.cpu.vcores</name>
<value>1</value> //核心数
</property>设置maptask内存
1
2
3
4
5mapred-default.xml:
<property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value> //一个maptask能够使用的内存上限
</property>设置reducetask内存
1
2
3
4
5mapred-default.xml:
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>1024</value> //一个maptask能够使用的内存上限
</property>reduce去map端并行度
1
2
3
4
5mapred-default.xml:
<property>
<name>mapreduce.reduce.shuffle.parallelcopies</name>
<value>5</value> //当reduce去map端拿取数据时所开的并行数是5
</property>