hive 壓縮全解讀(hive表存儲格式以及外部表直接加載壓縮格式數據);HADOOP存儲數據壓縮方

 數據做壓縮和解壓縮會增加CPU的開銷,但可以最大程度的減少文件所需的磁盤空間和網絡I/O的開銷,所以最好對那些I/O密集型的作業使用數據壓縮,cpu密集型,使用壓縮反而會降低性能。


     而hive中間結果是map輸出傳給reduce,所以應該使用低cpu開銷和高壓縮效率,一般最好使用snappy。


------------------------------------------------------------------------------


hive表的存儲格式有(參見http://blog.csdn.net/longshenlmj/article/details/51702343)

    TEXTFILE

    SEQUENCEFILE(三種壓縮選擇:NONE, RECORD, BLOCK。 Record壓縮率低,一般建議使用BLOCK壓縮)



    RCFILE


    ORC


    自定義格式


 


            hive表存儲格式是表自身的存儲結構,內部涉及存儲數據的結構,查詢方法,索引構建等等。支持的數據都是hadoop默認支持的。如txt格式文件,或壓縮格式zip、lzo、br2等等。hive外部表只能直接加載這些格式的數據。


 


源數據在雲上(hdfs)壓縮存儲

    Hadoop默認支持Gzip和BZip2的解壓縮方式,可直接讀取(hadoop fs -text命令),但hive只能用TEXTFILE格式的表加載,然後再insertoverwrite 到其他格式的表(比如SEQUENCEFILE表),如果hive其他格式的表想要直接加載壓縮格式數據,需要重寫INPUTFORMAT和OUTPUTFORMAT文件類



 


壓縮格式文件的切分(不支持則hadoop不能並行的進行map操作)

    BZip2和LZO(提供block級的壓縮)支持文件切分

    Gzip和Snappy則不支持。 




hadoop中支持的壓縮格式

    DEFLATEorg.apache.hadoop.io.compress.DefaultCodec

    gzip org.apache.hadoop.io.compress.GzipCodec

    bzip org.apache.hadoop.io.compress.BZip2Codec

    Snappy org.apache.hadoop.io.compress.SnappyCodec

    LZO:

        org.apache.hadoop.io.compress.LzopCodec或者com.hadoop.compression.lzo.LzopCodec;

        org.apache.hadoop.io.compress.LzoCodec或者com.hadoop.compression.lzo.LzoCodec;



注意:(引自http://ju.outofmemory.cn/entry/63512)

    (1)org.apache.hadoop.io.compress.LzoCodec和com.hadoop.compression.lzo.LzoCodec功能一樣,都是源碼包中帶的,返回都是lzo_deflate文件

    (2)有兩種壓縮編碼可用,即LzoCodec和LzopCodec,區別是:

        1)LzoCodec比LzopCodec更快, LzopCodec爲了兼容LZOP程序添加了如 bytes signature, header等信息

        2)LzoCodec作爲Reduce輸出,結果文件擴展名爲”.lzo_deflate”,無法被lzop讀取;

        而使用LzopCodec作爲Reduce輸出,生成擴展名爲”.lzo”的文件,可被lzop讀取

        3)LzoCodec結果(.lzo_deflate文件)不能由lzo index job的"DistributedLzoIndexer"創建index;且“.lzo_deflate”文件不能作爲MapReduce輸入(不識別,除非自編inputformat)。而所有這些“.LZO”文件都支持

    綜上所述,應該map輸出的中間結果使用LzoCodec,reduce輸出用 LzopCodec

    

===============================================================================


hive壓縮的編×××(壓縮格式)

    執行set io.compression.codecs 可以查看目前hive已加載的所以編×××(逗號分隔)


    也就是說,參數io.compression.codecs是hadoop的MR讀寫支持的所有格式支持,如果設置,就必須設置所有支持格式。默認支持,沒有必要的話,最好別加。設置多個語法爲:


        setio.compression.codecs=org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec;   


 


   當然,


set mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;



set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec


兩者一樣,是LzopCodec的兩個不同開源包。用哪個都行。


 


hive壓縮設置

1)中間結果壓縮

  中間結果是map產生的。格式設置語句


set hive.exec.compress.intermediate=true;


    set hive.intermediate.compression.codec=org.apache.Hadoop.io.compress.LzoCodec;



  map結果壓縮最好使用snappy的,因爲壓縮的前提是map輸出非常大,影響io,如果中間結果數據集比較小反而會拖慢速度


  


  另外,中間結果的壓縮格式設置還可以直接設置map輸出結果壓縮實現,如


set mapred.map.output.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec


  來代替set hive.intermediate.compression.codec這個語句實現


 


2)最終輸出結果壓縮

    配置參數爲hive.exec.compress.output

    選擇編×××(壓縮格式)參數mapred.output.compression.code(

    


    命令格式


set hive.exec.compress.output=true;    


set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;


   (也可以用org.apache.hadoop.io.compress.SnappyCodec)


    或者


set mapred.output.compress=true


        setmapred.output.compression.codec=org.apache.hadoop.io.compress.LzopCodec


    


    兩種方式功能一樣,之所以兩個方式,是因爲作用不同的參數文件



    hive.exec.compress.output和mapred.output.compression.codec是hive-site.xml中的配置參數


而mapred.output.compress 和mapred.output.compression.codec 是hdfs-site.xml的配置參數


都可以配置實現。可以查看各個文件中的配置參數,如


hive-site.xml中有


<!--

<property>

<name>hive.exec.compress.output</name>

<value>true</value>

</property>


<property>


<name>mapred.output.compression.codec</name>

<value>org.apache.hadoop.io.compress.GzipCodec</value>

</property>

-->


mapred-site.xml中有


   <property>

       <name>mapred.compress.map.output</name>

       <value>true</value>

    </property>

    <property>

       <name>mapred.map.output.compression.codec</name>

       <value>com.hadoop.compression.lzo.LzoCodec</value>

    </property>



core-site.xml中有


     <property>

      <name>io.compression.codecs</name>

<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>

      </property>

      <property>

        <name>io.compression.codec.lzo.class</name>

        <value>com.hadoop.compression.lzo.LzopCodec</value>

      </property>


hadoop-site.xml中有


   <property>

     <name>io.compression.codecs</name>

     <value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.LzoCodec</value>

      <description>A listof the compression codec classes that can be used

                  for compression/decompression.</description>

    </property>

    <property>

     <name>mapred.output.compress</name>

     <value>true</value>

      <description>Shouldthe job outputs be compressed?

      </description>

    </property>

    <property>

     <name>mapred.output.compression.codec</name>

     <value>org.apache.hadoop.io.compress.LzoCodec</value>

      <description>If thejob outputs are compressed, how should they be compressed?

      </description>

    </property>





設置的另外方式:

    hive –hiveconfhive.exec.compress.output=true –hiveconfmapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec





重要的輔助工作,添加索引

添加index是爲讓.lzo文件子在hdfs上按照block大小來切分塊(速度加快,但多消耗cpu時間。map數大量增加)

如果不建立lzo索引則不會按照block來切分塊

    爲每個lzo塊添加index的命令:

        hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.15.jarcom.hadoop.compression.lzo.DistributedLzoIndexer  path/xxx.lzo   

    注意(只設置mapred.output.compress=true默認的reduce輸出格式爲.lzo_deflate)


 


Hadoop上三種壓縮格式的存儲方案對比(LZO,gz,orc,)

Lzo的使用

drop table tmp_tb_test_lzo;


    CREATE EXTERNAL TABLE tmp_tb_test_lzo( allstring)


    stored as


        INPUTFORMAT'com.hadoop.mapred.DeprecatedLzoTextInputFormat'


        OUTPUTFORMAT'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'


    location '/user/pmp_bi/test/testlog/'


    ---------------------------------------------


    select


        split(split(all,'\\|~\\|')[5],'/')[1]as media,


        split(all,'\\|~\\|')[21] as device,


        split(all,'\\|~\\|')[22] as network,


        split(all,'\\|~\\|')[25] as id_code,


        split(all,'\\|~\\|')[26] ascode_method,


        split(all,'\\|~\\|')[30] as os,


        split(all,'\\|~\\|')[34] as channel,


        split(all,'\\|~\\|')[42] as adtype,


        split(all,'\\|~\\|')[43] as rtbtype,


        count(1) as cnt


    from tmp_tb_test_lzo


    group bysplit(split(all,'\\|~\\|')[5],'/')[1],split(all,'\\|~\\|')[21],split(all,'\\|~\\|')[22],split(all,'\\|~\\|')[25],split(all,'\\|~\\|')[26],split(all,'\\|~\\|')[30],split(all,'\\|~\\|')[34],split(all,'\\|~\\|')[42],split(all,'\\|~\\|')[43]


 


lzo加索引


hadoop jar/usr/local/hadoop-0.20.2/lib/hadoop-lzo-0.4.15.jarcom.hadoop.compression.lzo.LzoIndexer/user/pmp_bi/test/testlog/access_bid_20160414_22.log.lzo



ORC的使用

相關參數設定 ORC File Format:  


       https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-ORCFileFormat


 


    drop table test_tb_log_orc;


    create table test_tb_log_orc ( all string )


    stored as ORC;


    默認爲tblproperties("orc.compress"="ZLIB");


 


    show create table test_tb_log_orc;


 


    CREATE TABLE `test_tb_log_orc`(


      `all` string)


    ROW FORMAT SERDE


     'org.apache.hadoop.hive.ql.io.orc.OrcSerde'


    STORED AS INPUTFORMAT


     'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'


    OUTPUTFORMAT


     'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'


    LOCATION


     'hdfs://namenode/hivedata/warehouse/pmp.db/test_tb_log_orc'


    TBLPROPERTIES (


      'orc.compress'='ZLIB',


      'transient_lastDdlTime'='1465283611')


    -------------------------


 


    desc formatted test_tb_log_orc;


 


    # col_name              data_type               comment            


                    


    all                     string  


 


    # Detailed Table Information            


    Database:               pmp                      


    Owner:                  pmp_bi                  


    CreateTime:             Tue Jun 07 13:48:19 CST 2016    


    LastAccessTime:         UNKNOWN                 


    Protect Mode:           None                    


    Retention:              0                       


    Location:              hdfs://namenode/hivedata/warehouse/pmp.db/test_tb_log_orc       


    Table Type:             MANAGED_TABLE           


    Table Parameters:               


            transient_lastDdlTime   1465278499         


                    


    # Storage Information           


    SerDe Library:         org.apache.hadoop.hive.ql.io.orc.OrcSerde       


    InputFormat:            org.apache.hadoop.hive.ql.io.orc.OrcInputFormat 


    OutputFormat:          org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat        


    Compressed:             No                      


    Num Buckets:            -1                      


    Bucket Columns:         []                       


    Sort Columns:           []                      


    Storage Desc Params:            


            serialization.format    1           


-------------------------


====================================================================


gz壓縮文件hadoop處理

  1) external tablefor gz


 


    drop tabletmp_tb_test_gz;


    CREATE EXTERNALTABLE tmp_tb_test_gz( all string )


    location'/user/pmp_bi/test/testlog2/'


 


    insert overwritetable test_tb_log_orc


    select *


    from tmp_tb_test_gz


        time taken: 34分鐘


        hadoop fs -ls/user/pmp_bi/test/testlog2


           gz:4450965423


        hadoop fs -ls/hivedata/warehouse/pmp.db/test_tb_log_orc


           orc:4801158504


   -------------------------------------------------------


    2) load gz fromlocal(耗時同put到雲上建外部表)


        hive直接load


        drop tabletmp_tb_test_gz;


        CREATE TABLEtmp_tb_test_gz( all string );


        LOAD DATALOCAL INPATH '/home/pmp_bi/test/report_test/testlog2/rtb1_bid_20160606_15.log.gz'OVERWRITE INTO TABLE tmp_tb_test_gz;


            timetaken:401 秒


       


        insertoverwrite table test_tb_log_orc


        select *


        fromtmp_tb_test_gz


   


    本地load是簡單的將gz文件put到內部表路徑下/hivedata/warehouse/pmp.db/tmp_tb_test_gz/rtb1_bid_20160606_15.log.gz


    同hadoop直接put耗時一樣


==================================================


gz本地解壓後put

 


    1)hadoop fs -get/user/pmp_bi/test/testlog2/rtb1_bid_20160606_15.log.gz ./


        time taken:1分鐘    15:53:39 to 15:54:45


        size:4G


 


    2)解壓


    date


    gzip -drtb1_bid_20160606_15.log.gz


    date


        time taken: 5分鐘(15:45:40to 15:50:51)


        size:27117660098


   


    3)


    hadoop fs -mkdir/user/pmp_bi/test/testlog3


    hadoop fs -ls/user/pmp_bi/test/testlog3


 


    4)


    date


    hadoop fs -put./rtb1_bid_20160606_15.log /user/pmp_bi/test/testlog3/


    date


        time taken: 34分鐘(16:34:11to  17:08:23)


 


    5)


    drop tabletmp_tb_test_log_unzip;


    CREATE EXTERNALTABLE tmp_tb_test_log_unzip( all string )


    location'/user/pmp_bi/test/testlog3/'


 


    insert overwritetable test_tb_log_orc


    select *


    fromtmp_tb_test_log_unzip


        Time taken:69.458 seconds


   


------------------------------------------------------------------  

--------------------- 

作者:willard 

來源:CSDN 

原文:https://blog.csdn.net/longshenlmj/article/details/50550580 

版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章