Hive ORC + SNAPPY

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

 

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

flume消費kafka的數據實時寫入hdfs,經過建立分區表,t + 1 時,須要看到昨天的數據:oop

   flume 經過snappy 將數據寫入hdfs,能夠經過在fliume.conf中配置如下spa

  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,表示忽略中止時間。code

  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格式的表。blog

  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就能夠了。hadoop

相關文章
相關標籤/搜索