Hive orc 格式 + snappy 壓縮是比較常用的存儲加壓縮格式。
今天處理下面的場景時,解決了一些問題,記錄下來:
flume消費kafka的數據實時寫入hdfs,通過創建分區表,t + 1 時,需要看到昨天的數據:
flume 通過snappy 將數據寫入hdfs,可以通過在fliume.conf中配置以下
- 保證每天的數據寫入同一個目錄中:
agent.sinks.hdfs_sink.hdfs.path = /user/hive/warehouse/ods.db/kafka_2_hdfs_test/ods_sale_alter/dt=%Y-%m-%d
- 避免在hdfs寫入過多的小文件:
tier1.sinks.hdfs_sink.hdfs.idleTimeout=0
這個參數是某個topic停止活動時間超過設置的值時,就把hdfs上文件結尾的.tmp去掉,並開始寫入新文件。設置為0,表示忽略停止時間。
- 配置了2的參數后,會造成一個問題,當新的一天,數據開始寫入hdfs上另一個目錄后,
比如"dt=2019-03-02","dt=2019-03-01"文件夾下的最后一個文件,還是以.tmp結尾的,在hive建表后,數據格式錯誤會報錯。
所以需要我們通過腳本,每天修復文件名稱:
hadoop -mv abc.tmp abc
- 另外就是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格式的表。 - 那么這里可以使用的建表語句是什么呢?
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就可以了。