hive學習之四:hive檔案格式以及壓縮編碼

anickname發表於2018-05-22
1。檔案格式及壓縮編碼
   當前hive版本支援的編碼型別:
   set io.compression.codecs;
   org.apache.hadoop.io.compress.GzipCodec,--壓縮後不可分割
   org.apache.hadoop.io.compress.DefaultCodec,--預設
   org.apache.hadoop.io.compress.SnappyCodec,--壓縮後不可分割
   據說bzip2和lzo壓縮支援分割,我的hive版本里沒有(0.14)
   預設的檔案格式是文字檔案(textfile,sequencefile,rcfile):
   set hive.default.fileformat;
   TextFile--預設
   sequencefile--二進位制,可分割,有NONE,RECORD,BLOCK三種方式,一般BLOCK
   rcfile--行列結合儲存方式,高效。建議使用。
  
   看錶儲存的檔案格式,看建表語句:
   hive>show create table sas_atpt;
   STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.SequenceFileInputFormat'
   OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'
   在輸出資訊的最後面可看出是SequenceFile
   看其壓縮編碼格式:
   hadoop fs -text /spdbccc/data/dest/SAS/SAS_ATPT/dt=20160506/000000_0|head -n 1;
   16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
   16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
   16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
   16/05/18 10:01:34 INFO compress.CodecPool: Got brand-new decompressor [.snappy]
            16883528|C|6048|20160506|22531555|2167521675225315556048835429|156.0|4047398908347862|20160505|18.0|終止退費―分期折(分期寶)| ||0000|000|0.0
  可看出是snappy壓縮編碼格式。如果沒有壓縮直接顯示內容。
  看檔案記錄數:
  hadoop fs -text /spdbccc/data/dest/SAS/SAS_ATPT/dt=20160506/000000_0|wc -l
  --------------設定中間結果壓縮(map輸出壓縮)--------------
  set hive.exec.compress.intermediate=true;
  set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
  --------------最終輸出結果壓縮---------------------------
  set hive.exec.compress.output=true;
  set mapred.output.compression.type=BLOCK;---指定sequencefile壓縮方式
  set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
3。相同壓縮編碼不同檔案格式測試
  表名:sas_amed_req
  snappy壓縮編碼,sequencefile
  資料量:22003205
  大小:2.1 G
  create table sas_amed_rc like sas_amed;
  set hive.exec.compress.output=true;
  set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
  alter table sas_amed_rc set fileformat rcfile;
  insert overwrite table sas_amed_rc partition(dt) select * from  sas_amed where dt='20160407';
  資料量不變,大小變為1.7G。
  查詢效能測試:測試sql:
  select ED_CUST_NBR,
         ED_ACCT_NBR,   
         ED_CARD_NBR,   
         ED_APPLICATION_ID,
         ED_LOGO,      
         ED_DATE_FIRST_CARD_VERIFY,
         ED_CDFRM
       --row_number() over (distribute by ED_APPLICATION_ID sort by ED_CARD_SEQ desc) rank ------1
   from sas_amed_rc
   where dt='20160407' and ED_PRIMARY_CARD_IND='1' limit 100;
   Time taken: 43.229 seconds, Fetched: 100 row(s)
   更換上述sql的表名為sas_amed_rc,結果為:
   Time taken: 43.465 seconds, Fetched: 100 row(s)
   預測是rcfile查詢更快,但是沒什麼差別。將1處註釋掉查詢,rcfile比sequencefile快了4秒左右。再測試join速度
   select a.* from
   (select ED_CUST_NBR,
          ED_ACCT_NBR,   
          ED_CARD_NBR,   
          ED_APPLICATION_ID,
          ED_LOGO,      
          ED_DATE_FIRST_CARD_VERIFY,
          ED_CDFRM
    from sas_amed
    where dt='20160407' and ED_PRIMARY_CARD_IND='1') a inner join (select * from sas_nasrdwn where dt='20160407') b 
    on a.ED_APPLICATION_ID=b.NASRDW_APPL_ID;
    rcfile+snappycodec:Time taken: 32.476 seconds, Fetched: 42011 row(s)
    seqfile+snappycodec:Time taken: 35.36 seconds, Fetched: 42011 row(s)
    確實快了不少。從這點上來看,rcfile在查詢時候的優勢還是比sequencefile高的。
3。不同壓縮編碼相同檔案格式測試
   檔案格式:rcfile 測試這2個不同的編碼:default,snappy,default壓縮後1.2個G,壓縮率高於snappy,gzip壓縮後930.7M,壓縮比最高。
   Caused by: org.apache.hadoop.hive.ql.metadata.HiveException:
   java.lang.IllegalArgumentException: Compression codec org.apache.hadoop.io.compress.org.apache.hadoop.io.compress.GzipCodec was not found.
   select a.* from
   (select ED_CUST_NBR,
          ED_ACCT_NBR,   
          ED_CARD_NBR,   
          ED_APPLICATION_ID,
          ED_LOGO,      
          ED_DATE_FIRST_CARD_VERIFY,
          ED_CDFRM
    from sas_amed_rc_gzip
    where dt='20160407' and ED_PRIMARY_CARD_IND='1') a inner join (select * from sas_nasrdwn where dt='20160407') b 
    on a.ED_APPLICATION_ID=b.NASRDW_APPL_ID;
    rcfile+defaultcodec:Time taken: 91.915 seconds, Fetched: 42011 row(s)
    rcfile+snappycodec:Time taken: 38.182 seconds, Fetched: 42011 row(s)
    rcfile+gzipcodec:Time taken: 39.558 seconds, Fetched: 42011 row(s)
    綜上所述選擇rcfile+snappycodec檔案格式和壓縮編碼優於其他。建議採用這種組合方式。

4。判斷是否資料傾斜
   1.1.如果任務卡在reduce階段不動或者執行非常緩慢,在排除其他情況下大致可認為出現了資料傾斜(hive sql中出現的join,group by,distinct等情況都有可能)。
   1.2.任務執行完成,但是耗費的時間過長,從YARN或者MR的監控頁面上看job執行的各個reduce數的耗時情況。例如某個job10個map,20個reduce。map大約20秒左右完成,reduce基本在10秒
       左右完成,但某一個需要3分鐘完成,可基本判斷出現了資料傾斜。

其本質原因:是某個key過於集中(包括空值過多),分佈不均勻造成的,解決方法在優化篇中有。

5。設定hive作業執行的佇列;
   set mapreduce.job.queuename=hive(佇列名稱)

相關文章