Hive資料匯入方案—使用ORC格式儲存hive資料
阿新 • • 發佈:2019-02-16
目的:將上網日誌匯入到hive中,要求速度快,壓縮高,查詢快,表易維護。推薦使用ORC格式的表儲存資料
思路:因為在hive指定RCFile格式的表,不能直接load資料,只能通過textfile表進行insert轉換。考慮先建立txtFile格式內部臨時表tmp_testp,使用hdfs
fs -put命令向tmp_testp表路徑拷貝資料(不是load),再建立ORC格式外部表http_orc,使用insert命令把tmp_test表匯入http_orc中,最後刪除掉臨時表資料。過程消耗的時間
1.使用put想hdfs上傳檔案
2.insert表資料(hive轉換格式壓縮資料)
執行:
1、 建立內部臨時表,使表的location關聯到一個日誌檔案的資料夾下:
create table IF NOT EXISTS tmp_testp(p_id INT,tm BIGINT,idate BIGINT,phone BIGINT)
partitioned by (dt string)
row format delimited fields terminated by '\,'
location '/hdfs/incoming';
2. 通過hdfs上傳檔案124G檔案,同時手動建立分割槽對映關係來匯入資料。
ALTER TABLE tmp_testp ADD PARTITION(dt='2013-09-30');
hadoop fs -put /hdfs/incoming/*d /hdfs/incoming/dt=2013-09-30
記錄耗時: 12:44 - 14:58 =兩小時14分鐘
上傳速度緩慢,記憶體消耗巨大
Mem: 3906648k total, 3753584k used, 153064k free, 54088k buffers
記憶體利用率96%
3.測試臨時表是否可以直接讀取資料
select * from tmp_testp where dt='2013-09-30';
4.建立ORC格式外部表
create external table IF NOT EXISTS http_orc(p_id INT,tm BIGINT,idate BIGINT,phone BIGINT )
partitioned by (dt string)
row format delimited fields terminated by '\,'
stored as orc ;
5.將臨時表匯入到ORC表中
insert overwrite table http_orc partition(dt='2013-09-30') select p_id,tm,idate,phone from tmp_testp where dt='2013-09-30';
記錄耗時:Time taken: 3511.626 seconds = 59分鐘,
注意insert這一步,可以選擇欄位匯入到orc表中,達到精簡欄位,多次利用臨時表建立不同緯度分析表的效果,不需要提前處理原始log檔案,缺點是上傳到hdfs原始檔案時間太長
6.計算ORC表壓縮率:
HDFS Read: 134096430275 HDFS Write: 519817638 SUCCESS
壓縮率:519817638/134096430275=0.386% 哎呀,都壓縮沒了
7.刪除內部臨時表,保證hdfs中只存一份ORC壓縮後的檔案
drop table tmp_testp;
8.簡單測試一下表操作看看,ORC壓縮表與txtFile不壓縮表的效能對比
ORC表執行:select count(*) from http_orc;
469407190
Time taken: 669.639 seconds, Fetched: 1 row(s) txtFile表執行:select count(*) from tmp_testp; 469407190
Time taken: 727.944 seconds, Fetched: 1 row(s) ORC效果不錯,比txtFile效果好一點點 總結:平均每s上傳檔案:124G / (2hour14min+59min)= 11M/s 可以清楚看到向hdfs上傳檔案浪費了大量時間 優化方案:如何提高hdfs檔案上傳效率 1. 檔案不要太大(測試用檔案從200m到1G不均),啟動多個客戶端並行上傳檔案 2. 考慮減少hive資料副本為2 3. 優化mapReduce及hadoop叢集,提高I/O,減少記憶體使用 參考文章: 為什麼要建立內外臨時表 為什麼要手動put資料代替hive自動load: Hive中Load Data時多一步Distcp的操作問題,優化叢集IO操作 Hadoop MapReduce之上傳檔案到HDFS 上傳檔案到HDFS
Time taken: 669.639 seconds, Fetched: 1 row(s) txtFile表執行:select count(*) from tmp_testp; 469407190
Time taken: 727.944 seconds, Fetched: 1 row(s) ORC效果不錯,比txtFile效果好一點點 總結:平均每s上傳檔案:124G / (2hour14min+59min)= 11M/s 可以清楚看到向hdfs上傳檔案浪費了大量時間 優化方案:如何提高hdfs檔案上傳效率 1. 檔案不要太大(測試用檔案從200m到1G不均),啟動多個客戶端並行上傳檔案 2. 考慮減少hive資料副本為2 3. 優化mapReduce及hadoop叢集,提高I/O,減少記憶體使用 參考文章: 為什麼要建立內外臨時表 為什麼要手動put資料代替hive自動load: Hive中Load Data時多一步Distcp的操作問題,優化叢集IO操作 Hadoop MapReduce之上傳檔案到HDFS 上傳檔案到HDFS