Hadoop資料壓縮及自定義
Hadoop資料壓縮
MR操作過程中進行大量資料傳輸。
壓縮技術能夠有效的減少底層儲存(HDFS)讀寫位元組數。
壓縮提高了網路頻寬和磁碟空間的效率。
資料壓縮能夠有效的節省資源!
壓縮是MR程式的優化策略!
通過壓縮編碼對mapper或者reducer資料傳輸進行資料的壓縮,以減少磁碟IO。
壓縮的基本原則
1、運算密集型任務少用壓縮
2、IO密集型的任務,少用壓縮
MR支援的壓縮編碼
壓縮格式 hadoop是否自帶? 檔案拓展名 是否可以切分
DEFAULT 是 .deflate 否
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.3G 1.8G 17.5MB/s 58MB/s
bzip2 8.3G 1.1G 2.4MB/s 9.5MB/s
LZO 8.3G 2.9G 49.3MB/s 74.6MB/s
hadoop壓縮使用方式
1、在Driver類中mapper端(Job.getInstance()下邊)
//開啟map端的輸出壓縮
conf.setBoolean("mapreduce.map.output.compress","true");
//設定壓縮方式
conf.setClass("mapreduce.map.output.compress.codec",DefaultCodec.class, CompressionCodec.class);
conf.setClass("mapreduce.map.output.compress.codec",BZip2Codec.class, CompressionCodec.class);
2、reduce端
//reduce端輸出資料型別下
//開啟reduce端的輸出壓縮
FileOutputFormat.setCompressOutput(job,true);
//設定壓縮方式
FileOutputFormat.setOutputCompressClass(job, DefaultCodec.class);//預設方式
FileOutputFormat.setOutputCompressClass(job, BZip2Codec.class);
FileOutputFormat.setOutputCompressClass(job, GzipCodec.class);
壓縮工具自定義
public class TextCompress {
main{
Compress("C://a.txt","org.apache.hadoop.io.compress.GzipCodec");
}
//測試壓縮方法
private static void Compress(String fileName, String method) throws Exception{
//1、獲取輸入流
FileInputStream fis = new FileInputStream(new File(fileName));
Class cName = Class.forName(method);
CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(cName, new Configuration());
//2、輸出流
FileOutputStream fos = new FileOutputStream(new File(fileName + codec.getDefaultExtension()));
//3、建立壓縮輸出流
CompressionOutputStream cos = codec.createOutputStream(fos);
//4、流的對考
IOUtils.copyBytes(fis, cos, 1024*1024*2, false);
//5、關閉資源
fis.close();
fos.close();
cos.close();
}
}