您好,登錄后才能下訂單哦!
如何使用Hive合并小文件,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
目前集群存于一個非常不健康的狀態,主要問題是小文件太多,單個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合并小文件問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。