如何使用Hive合并小文件,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創新互聯公司主營洛江網站建設的網絡公司,主營網站建設方案,app軟件定制開發,洛江h5成都小程序開發搭建,洛江網站營銷推廣歡迎洛江等地區企業咨詢
目前集群存于一個非常不健康的狀態,主要問題是小文件太多,單個DataNode的block數量閾值是500,000,而現在單個DataNode的block為2,631,218,約為閾值的5倍,現在所有DataNode都處于黃色不健康狀態。
小文件問題會直接帶來NameNode的壓力巨大,從而導致HDFS的穩定性,同時對HDFS日常的數據讀寫帶來性能下降。目前已可以看到集群的NameNode頻繁出現檢查點告警問題。
通過對集群中目前目錄個數,文件大小,文件數量,Hive表數量,Hive數據庫數量,Hive分區數量進行了詳細的數據采集。發現主要是HDFS目錄中的小文件太多,大量1KB的文件,甚至是小于1KB的文件;具體表現為:不論表與分區的數據量大小,當有分區時每個分區具有200個文件,當沒有分區時每個表有200個文件,而許多表是小表,所以造成嚴重的小文件問題。
解決此問題的方法主要為兩個方面;一是從源頭解決小文件問題,在導數的過程中對作業進行優化,以減少小文件的輸出,此方法需要業務方解決;二是合并平臺上已有的小文件;本問描寫合并平臺小文件的方案。
通過對集群內的文件數量以及文件大小進行分析,小文件問題基本出現在hive表中;經過近一步分析,發現每個分區存在著200個小文件,可以將這些文件合并減少小文件數量從而緩解小文件問題。
示例表test_part一共20行數據,以字段date_str為分區



共有五個分區

每個分區分別四個文件

執行流程總體如下:
1、使用create table name like tb_name創建備用表,使得表結構保持一致;

2、配置支持merge等參數,并使用insert overwrite語句讀取原表數據插入到備用表。

3、確認表數據一致后,刪除原表,使用alter語句將備用表的表名修改為原表的表名。

新建備表,表結構與原表保持一致
create table test_part_bak like test_part;


設置如下參數,使支持合并
SET hive.merge.mapfiles = true;
SET hive.merge.mapredfiles = true;
SET hive.merge.size.per.task = 256000000;
SET hive.merge.smallfiles.avgsize = 134217728;
SET hive.exec.compress.output = true;
SET parquet.compression = snappy;
SET hive.exec.dynamic.partition.mode = nonstrict;
SET hive.exec.dynamic.partition = true;

使用insert overwrite語句查詢原表數據覆蓋備表
insert overwrite table test_part_bak partition(date_str) select * from test_part;

備用表數據和原表一致

刪除原表,將備用表表名修改為原表名
alter table test_part_bak rename to test_part;

合并后表數據沒有變化

表結構一致

從HDFS文件系統可以看出,分區數量沒有改變,每個分區的幾個小文件已經合并為一個文件。

關于如何使用Hive合并小文件問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創新互聯行業資訊頻道了解更多相關知識。
當前題目:如何使用Hive合并小文件
瀏覽地址:http://www.yijiale78.com/article24/pchdce.html
成都網站建設公司_創新互聯,為您提供自適應網站、品牌網站設計、虛擬主機、Google、云服務器、軟件開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯