欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Hadoop中的壓縮與解壓縮案例詳解

 更新時(shí)間:2021年12月02日 11:36:54   作者:愛(ài)上攻城獅2021  
壓縮就是通過(guò)某種技術(shù)(算法)把原始文件變下,相應(yīng)的解壓就是把壓縮后的文件變成原始文件,本文給大家分享Hadoop中的壓縮知識(shí),感興趣的朋友跟隨小編一起看看吧

壓縮主要關(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)圖片等比縮放

    java項(xiàng)目實(shí)現(xiàn)圖片等比縮放

    這篇文章主要為大家詳細(xì)介紹了java項(xiàng)目實(shí)現(xiàn)圖片等比縮放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringBoot項(xiàng)目中@Test不出現(xiàn)可點(diǎn)擊運(yùn)行的按鈕問(wèn)題

    SpringBoot項(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-01
  • Java?toString方法使用超全講解

    Java?toString方法使用超全講解

    在Java中所有的類(lèi)都有一個(gè)共同的父類(lèi)Object(默認(rèn)繼承,不用加extends關(guān)鍵字),toString方法就是Object類(lèi)的一個(gè)方法,用來(lái)返回該對(duì)象的字符串表示形式,下面這篇文章主要給大家介紹了關(guān)于Java?toString方法使用的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • IDEA加載項(xiàng)目沒(méi)有src目錄的問(wèn)題及解決

    IDEA加載項(xiàng)目沒(méi)有src目錄的問(wèn)題及解決

    這篇文章主要介紹了IDEA加載項(xiàng)目沒(méi)有src目錄的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringMVC框架的介紹與使用詳解

    SpringMVC框架的介紹與使用詳解

    SpringMVC?是一種基于?Java?的實(shí)現(xiàn)?MVC?設(shè)計(jì)模型的請(qǐng)求驅(qū)動(dòng)類(lèi)型的輕量級(jí)?Web?框架,跟Spring,Mybatis框架并稱(chēng)為ssm,這篇文章主要介紹了SpringMVC框架的介紹與使用,需要的朋友可以參考下
    2022-08-08
  • springMVC的生命周期詳解

    springMVC的生命周期詳解

    本篇文章主要介紹了springMVC的生命周期詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • Spring Boot不同版本Redis設(shè)置JedisConnectionFactory詳解

    Spring 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-09
  • Spring的IOC控制反轉(zhuǎn)詳解

    Spring的IOC控制反轉(zhuǎn)詳解

    這篇文章主要為大家介紹了Spring的IOC控制反轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>
    2022-01-01
  • Java實(shí)現(xiàn)一鍵生成表controller,service,mapper文件

    Java實(shí)現(xiàn)一鍵生成表controller,service,mapper文件

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)一鍵生成表controller,service,mapper文件,文中的示例代碼講解詳細(xì),需要的可以收藏一下
    2023-05-05
  • SpringBoot中的事務(wù)回滾規(guī)則詳解

    SpringBoot中的事務(wù)回滾規(guī)則詳解

    這篇文章主要介紹了SpringBoot中的事務(wù)回滾規(guī)則詳解,事務(wù)是指一系列的操作,這些操作要么全部成功,要么全部失敗。在Spring Boot中,我們可以使用事務(wù)管理器來(lái)管理事務(wù),在使用事務(wù)管理器的時(shí)候,一個(gè)非常重要的概念就是事務(wù)回滾,需要的朋友可以參考下
    2023-07-07

最新評(píng)論