1. 程式人生 > >Hive資料匯入方案—使用ORC格式儲存hive資料

Hive資料匯入方案—使用ORC格式儲存hive資料

目的:將上網日誌匯入到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 - 1458 =兩小時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.       檔案不要太大(測試用檔案從200m1G不均),啟動多個客戶端並行上傳檔案 2.       考慮減少hive資料副本為2 3.       優化mapReducehadoop叢集,提高I/O,減少記憶體使用 參考文章: 為什麼要建立內外臨時表 為什麼要手動put資料代替hive自動loadHiveLoad Data時多一步Distcp的操作問題,優化叢集IO操作 Hadoop MapReduce之上傳檔案到HDFS 上傳檔案到HDFS