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>