欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hadoop 2.X管理与开发(二、数据压缩与优化)

程序员文章站 2022-03-08 20:29:16
...

#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>
    
相关标签: hadoop