Hadoop中的壓縮與解壓縮案例詳解
壓縮主要關(guān)注點(diǎn):壓縮率,壓縮速度,解壓速度,是否可切片
一:壓縮的作用
壓縮技術(shù)能夠減少底層HDFS讀寫(xiě)字節(jié)數(shù),減少磁盤(pán)IO,提升網(wǎng)絡(luò)傳輸效率,因?yàn)榇疟P(pán)IO和網(wǎng)絡(luò)帶寬是Hadoop的寶貴資源;特別是在運(yùn)行MR程序時(shí),I/O,網(wǎng)絡(luò)數(shù)據(jù)傳輸,shuffle及Merge都要花大量的時(shí)間,因此壓縮非常重要; 壓縮是提升Hadoop運(yùn)行效率的一種優(yōu)化策略,使用得當(dāng)可以提升效率,但是使用不當(dāng)也可能降低效率
1.1:壓縮的原則:
1、計(jì)算(運(yùn)算)密集型任務(wù):大量使用CPU去做數(shù)學(xué)運(yùn)算,此時(shí)少用壓縮
2、IO密集型任務(wù):此時(shí)多用壓縮 ????????壓縮需要消耗CPU資源
1.2:MR支持的壓縮編碼
DEFLATE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不支持切分
Gzip???????????????????????????????????????????????????????? 不支持切分
bzip2???????????????????????????????????????????????????????? 支持切分
LZO? ? ? ? ? ? ? ? 非hadoop自帶 安裝? ? ? ? ? ?支持切分
Snappy? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不支持切分
為了支持多種壓縮/解壓縮算法,Hadoop引入了編碼/解碼器
- org.apache.hadoop.io.compress.DefaultCodec
- org.apache.hadoop.io.compress.GzipCodec
- org.apache.hadoop.io.compress.BZip2Codec
- com.hadoop.compression.lzo.LzopCodec
- org.apache.hadoop.io.compress.SnappyCodec
1.3:壓縮性能的比較

1.4:壓縮方式的選擇
1.4.1Gzip壓縮
優(yōu)點(diǎn):壓縮/解壓縮比較快,處理Gzip格式文件和直接處理文本一樣
缺點(diǎn):不支持split
應(yīng)用場(chǎng)景:
? ? ? ? 當(dāng)每個(gè)文件壓縮之后在130M以?xún)?nèi)(1個(gè)塊大小內(nèi)),考慮。
1.4.2:Bzip2壓縮
優(yōu)點(diǎn):比Gzip壓縮率高,支持split
缺點(diǎn):壓縮/解壓速度慢
應(yīng)用場(chǎng)景:適合對(duì)速度要求不高,但需要較高的壓縮率??
? ? ? ? ? ? ? ? ? ?或者輸出數(shù)據(jù)比較大,處理之后的數(shù)據(jù)需要壓縮存檔,同時(shí)對(duì)單個(gè)很大的文本文件像壓縮減少存儲(chǔ)空間,同時(shí)需支持split;
1.4.3LZO壓縮
優(yōu)點(diǎn):壓縮/解壓縮比較快,合理的壓縮率,支持split,是Hadoop最流行的壓縮格式,在Linux系統(tǒng)下需要安裝
缺點(diǎn):壓縮率比Gzip低一些,Hadoop本身不支持,為了支持split需要建立索引,還需要指定InputFormat為L(zhǎng)zo格式
應(yīng)用場(chǎng)景:一個(gè)很大的文本文件,壓縮之后還大于200M以上可以考慮,而且單個(gè)文件越大,LZO優(yōu)點(diǎn)越明顯;
1.4.4Snappy壓縮
優(yōu)點(diǎn): 壓縮速度和合理的壓縮率
缺點(diǎn):不支持split,壓縮率比gzip低,Hadoop本身不支持需要安裝
應(yīng)用場(chǎng)景:當(dāng)MapReduce作業(yè)的Map輸出的數(shù)據(jù)比較大的時(shí)候,作為Map到Reduce的 中間數(shù)據(jù)的壓縮格式,或者作為一個(gè)MapReduce作業(yè)的輸出和另外一個(gè)MapReduce作業(yè)的輸入。
壓縮可以在MapReduce作用的任意階段啟用。
?二:MapReduce數(shù)據(jù)壓縮
Map之前的輸入端壓縮 :(Hadoop自動(dòng)檢查文件擴(kuò)展名如果擴(kuò)展名能夠匹配就會(huì)使用恰當(dāng)?shù)木幗獯a方式對(duì)文件進(jìn)行壓縮和解壓)Mapper輸出采用壓縮:(可有效改善shuffle過(guò)程,此過(guò)程是資源消耗最多的環(huán)節(jié))
注:(LZO是Hadoop通用的編解碼器,其設(shè)計(jì)目標(biāo)是達(dá)到與硬盤(pán)讀取速度相當(dāng)?shù)膲嚎s速度,因此速度是優(yōu)先考慮的因素,其次是壓縮率,LZO的壓縮速度是Gzip的5倍,解壓速度是Gzip的2倍)
Reducer輸出壓縮:壓縮技術(shù)能夠減少要存儲(chǔ)的數(shù)據(jù)量,將i磁盤(pán)空間。
三:壓縮的參數(shù)配置
io.compression.codecs ??(在core-site.xml中配置)? (map輸入前)
mapreduce.map.output.compress(在mapred-site.xml中配置)? (map到reduce)
mapreduce.map.output.compress.codec(在mapred-site.xml中配置)
mapreduce.output.fileoutputformat.compress(在mapred-site.xml中配置)(reduce輸出)
mapreduce.output.fileoutputformat.compress.codec(在mapred-site.xml中配置)
mapreduce.output.fileoutputformat.compress.type(在mapred-site.xml中配置)
如果壓縮寫(xiě)到了配置文件中則,所有都會(huì)進(jìn)行壓縮,如果只是寫(xiě)到了當(dāng)前程序中,只對(duì)當(dāng)前程序起作用。
3.1:設(shè)置reduce輸出端的壓縮格式
//設(shè)置Reduced端輸出壓縮
FileOutputFormat.setCompressOutput(job,true);
//壓縮的結(jié)果是BZip2Codec
FileOutputFormat.setOutputCompressorClass(job,BZip2Codec.class);
FileOutputFormat.setOutputCompressorClass(job, SnappyCodec.class);
3.2:設(shè)置map輸入的壓縮方式
//開(kāi)啟map輸出壓縮
conf.setBoolean("mapreduce.map.output.compress",true);
conf.setClass("mapreduce.map.output.compress.codec", BZip2Codec.class, CompressionCodec.class);
四:文件的壓縮與解壓縮案例
public class FileCompress {
public static void main(String[] args) throws IOException {
//壓縮傳入兩個(gè)參數(shù) path 以及壓縮格式
// compress("E:\\a.txt","org.apache.hadoop.io.compress.BZip2Codec");
decompress("E:\\a.txt.bz2");
}
private static void decompress(String path) throws IOException {
//1:校驗(yàn)是否能解壓 CompressionCodecFactory A factory that will find the correct codec for a given filename.
CompressionCodecFactory factory = new CompressionCodecFactory(new Configuration());
//This class encapsulates a streaming compression/decompression pair.
CompressionCodec codec = factory.getCodec(new Path(path));
if (codec == null){
System.out.println("cannot find codec for file " + path);
return;
}
//2 獲取普通輸入流,再獲取解壓輸入流
FileInputStream fis = new FileInputStream(new File(path));
//允許客戶(hù)端 重新定義輸入流
CompressionInputStream cis = codec.createInputStream(fis);
//3:獲取輸出流
FileOutputStream fos = new FileOutputStream(new File(path + ".decodec"));
//4 將壓縮輸入流寫(xiě)入輸出流
IOUtils.copyBytes(cis , fos, new Configuration());
//5:關(guān)閉資源
IOUtils.closeStream(fos);
IOUtils.closeStream(cis);
IOUtils.closeStream(fis);
}
private static void compress(String path, String method) throws IOException {
//1:獲取輸入流
FileInputStream fis = new FileInputStream(path);
//2:獲取壓縮編碼器 編解碼器就是算嗎
CompressionCodecFactory factory = new CompressionCodecFactory(new Configuration());
CompressionCodec codec = factory.getCodecByName(method);
//3:獲取普通輸出流,獲取壓縮輸出流 獲取編碼器的擴(kuò)展名
FileOutputStream fos = new FileOutputStream(new File(path + codec.getDefaultExtension()));
CompressionOutputStream cos = codec.createOutputStream(fos);
//4:賦值輸入流到流輸出流
IOUtils.copyBytes(fis,cos,new Configuration());
//5 關(guān)閉資源
IOUtils.closeStream(cos);
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
}
}
到此這篇關(guān)于Hadoop中的壓縮的文章就介紹到這了,更多相關(guān)Hadoop壓縮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Feign超時(shí)設(shè)置深入了解
Spring?Cloud中Feign客戶(hù)端是默認(rèn)開(kāi)啟支持Ribbon的,最重要的兩個(gè)超時(shí)就是連接超時(shí)ConnectTimeout和讀超時(shí)ReadTimeout,在默認(rèn)情況下,也就是沒(méi)有任何配置下,F(xiàn)eign的超時(shí)時(shí)間會(huì)被Ribbon覆蓋,兩個(gè)超時(shí)時(shí)間都是1秒2023-03-03
Java中private關(guān)鍵字詳細(xì)用法實(shí)例以及解釋
這篇文章主要給大家介紹了關(guān)于Java中private關(guān)鍵字詳細(xì)用法實(shí)例以及解釋的相關(guān)資料,在Java中private是一種訪(fǎng)問(wèn)修飾符,它可以用來(lái)控制類(lèi)成員的訪(fǎng)問(wèn)權(quán)限,文中將用法介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
mybatis-plus分頁(yè)查詢(xún)的實(shí)現(xiàn)示例
這篇文章主要介紹了mybatis-plus分頁(yè)查詢(xún)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
java 多線(xiàn)程死鎖詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了java 多線(xiàn)程死鎖詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-01-01
Java大數(shù)據(jù)處理的核心技術(shù)MapReduce框架
MapReduce是一種分布式計(jì)算框架,適用于大規(guī)模的數(shù)據(jù)處理。它將大數(shù)據(jù)分成多個(gè)小數(shù)據(jù)塊,通過(guò)Map和Reduce兩個(gè)階段對(duì)數(shù)據(jù)進(jìn)行處理和分析。MapReduce框架具有可靠、高效、可擴(kuò)展等特點(diǎn),已經(jīng)成為大數(shù)據(jù)處理的核心技術(shù)2023-05-05
springboot ApplicationContextInitializer的三種使用方法小結(jié)
這篇文章主要介紹了關(guān)于ApplicationContextInitializer的三種使用方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

