1. 程式人生 > >Hadoop 2.X管理與開發(二、資料壓縮與優化)

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>