Hive ORC + SNAPPY


Hive orc 格式 + snappy 壓縮是比較常用的存儲加壓縮格式。

 

今天處理下面的場景時,解決了一些問題,記錄下來:

flume消費kafka的數據實時寫入hdfs,通過創建分區表,t + 1 時,需要看到昨天的數據:

   flume 通過snappy 將數據寫入hdfs,可以通過在fliume.conf中配置以下

  1. 保證每天的數據寫入同一個目錄中:
    agent.sinks.hdfs_sink.hdfs.path = /user/hive/warehouse/ods.db/kafka_2_hdfs_test/ods_sale_alter/dt=%Y-%m-%d 
  2. 避免在hdfs寫入過多的小文件:
    tier1.sinks.hdfs_sink.hdfs.idleTimeout=0

    這個參數是某個topic停止活動時間超過設置的值時,就把hdfs上文件結尾的.tmp去掉,並開始寫入新文件。設置為0,表示忽略停止時間。

  3. 配置了2的參數后,會造成一個問題,當新的一天,數據開始寫入hdfs上另一個目錄后,
    比如"dt=2019-03-02","dt=2019-03-01"文件夾下的最后一個文件,還是以.tmp結尾的,在hive建表后,數據格式錯誤會報錯。
    所以需要我們通過腳本,每天修復文件名稱:
    hadoop -mv abc.tmp abc
  4. 另外就是hive建表的問題:
    當數據導入hdfs后,我們想針對flume倒過來的數據,建立snappy壓縮,orc格式的hive表。 
    建表語句如下:
    DROP TABLE IF EXISTS test_orc_snappy;
    CREATE EXTERNAL TABLE test_orc_snappy (
      x_json string
      )
    PARTITIONED BY (`dt` string) 
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY "\t"
    STORED AS orc
    LOCATION '/user/hive/warehouse/ods.db/kafka_2_hdfs_test/test_orc_snappy'
    TBLPROPERTIES ("orc.compress"="SNAPPY");

    然而,我忽略了一件很重要的事,文件雖然用了snappy壓縮,但是沒有轉化為orc格式。
    假如我們還想繼續使用orc格式,那就只能把這張表當做底層表,在上層表比如 dw 層,中通過insert into的方式,
    轉為orc格式的表。

  5. 那么這里可以使用的建表語句是什么呢?
    CREATE EXTERNAL TABLE test_snappy (
      x_json string
      )
    PARTITIONED BY (`dt` string) 
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY "\t"
    STORED AS textfile
    LOCATION '/user/hive/warehouse/ods.db/kafka_2_hdfs_test/ods_sale_alter'
    TBLPROPERTIES ("orc.compress"="SNAPPY")

    使用textFile就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM