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)文章
java項(xiàng)目實(shí)現(xiàn)圖片等比縮放
這篇文章主要為大家詳細(xì)介紹了java項(xiàng)目實(shí)現(xiàn)圖片等比縮放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04SpringBoot項(xiàng)目中@Test不出現(xiàn)可點(diǎn)擊運(yùn)行的按鈕問(wèn)題
這篇文章主要介紹了SpringBoot項(xiàng)目中@Test不出現(xiàn)可點(diǎn)擊運(yùn)行的按鈕問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01IDEA加載項(xiàng)目沒(méi)有src目錄的問(wèn)題及解決
這篇文章主要介紹了IDEA加載項(xiàng)目沒(méi)有src目錄的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Spring Boot不同版本Redis設(shè)置JedisConnectionFactory詳解
本文章向大家介紹Spring Boot不同版本Redis設(shè)置JedisConnectionFactory,主要內(nèi)容包括1.X 版本、2.X 版本、2.、基本概念、基礎(chǔ)應(yīng)用、原理機(jī)制和需要注意的事項(xiàng)等,并結(jié)合實(shí)例形式分析了其使用技巧,希望通過(guò)本文能幫助到大家理解應(yīng)用這部分內(nèi)容2023-09-09Java實(shí)現(xiàn)一鍵生成表controller,service,mapper文件
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)一鍵生成表controller,service,mapper文件,文中的示例代碼講解詳細(xì),需要的可以收藏一下2023-05-05