Hadoop 2.X管理与开发(二、数据压缩与优化)
#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
设置压缩方式
mapper端:
//开启map端的输出压缩
conf.setBoolean("mapreduce.map.outpot.compress", true);
//设置压缩方式
//conf.setClass("mapreduce.map.outpot.compress.codec", DefaultCodec.class, CompressionCodec.class);
conf.setClass("mapreduce.map.outpot.
compress.codec", BZip2Codec.class, CompressionCodec.class);
reduce端:
//开启reduce端的输出压缩
FileOutputFormat.setCompressOutput(job, true);
//设置压缩方式
//FileOutputFormat.setOutputCompressorClass(job, DefaultCodec.class);
FileOutputFormat.setOutputCompressorClass(job, BZip2Codec.class);
Hadoop优化
MapReduce程序的效率瓶颈
相关
- MR功能:分布式离线计算
- 计算机性能:CPU、内存、磁盘、网络
- I/O操作优化:
数据倾斜(代码优化)
map和reduce的个数设置不合理
map运行时间太长,导致reduce等待时间过久
小文件过多(CombineTextInputFormat小文件合并)
不可分快的超大文件(不断的溢写)
多个溢写小文件需要多次merge
优化方法
- 数据输入
合并小文件:在执行MR任务前就进行小文件合并
采用CombineTextInputFormat来作为输入来作为输入端大量小文件的场景 - Map阶段
减少溢写次数(增加内存200MB 80%):减少磁盘I/O
mapred-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>
减少合并的次数
mapred-default.xml: <property> <name>mapreduce.task.io.sort.factor</name> <value>10</value> //文件的个数,数值越大合并次数越少 </property>
在map之后,不影响业务逻辑的情况下可以使用combiner
- Reduce阶段
合理的设置map与reduce的个数
设置map/reduce共存mapred-default.xml: <property> <name>mapreduce.job.reduce.skowstart.completedmaps</name> <value>0.05</value> //设置运行一定程度的map后,启动reduce,减少等待时间 </property>
合理设置reduce的buffer
mapred-default.xml: <property> <name>mapreduce.reduce.markreset.buffer.percent</name> <value>0.0</value> </property>
- I/O传输
进行数据压缩
使用sequenceFile - 数据倾斜
进行范围分区
自定义分区
Combine
能用mapJoin的坚决不用reduceJoin - 参数调优
分配map程序CPU核心数
mapred-default.xml: <property> <name>mapreduce.map.cpu.vcores</name> <value>1</value> //核心数 </property>
分配reduce程序CPU核心数
mapred-default.xml: <property> <name>mapreduce.reduce.cpu.vcores</name> <value>1</value> //核心数 </property>
设置maptask内存
mapred-default.xml: <property> <name>mapreduce.map.memory.mb</name> <value>1024</value> //一个maptask能够使用的内存上限 </property>
设置reducetask内存
mapred-default.xml: <property> <name>mapreduce.reduce.memory.mb</name> <value>1024</value> //一个maptask能够使用的内存上限 </property>
reduce去map端并行度
mapred-default.xml: <property> <name>mapreduce.reduce.shuffle.parallelcopies</name> <value>5</value> //当reduce去map端拿取数据时所开的并行数是5 </property>
下一篇: python超简单解决约瑟夫环问题