Hive小文件优化
參考文檔
參考文檔
參考文檔
小文件優化
小文件產生的原因
小文件的影響
相關優化
小文件的預防
- 設置map和reduce個數,通用性不好// 設置map的數量 set mapred.map.tasks =10; // 設置reduce任務數,輸出文件數量對應reduce個數 set mapred.reduce.tasks=10;// 設置每個reduce處理文件最大字節長度,可以增加或減少reduce的數量 set hive.exec.reducers.bytes.per.reducer = 256000000;
- 設置map輸入相關參數// 每個Map最大輸入大小(這個值決定了合并后文件的數量) set mapred.max.split.size=256000000; // 一個節點上split的至少的大小(這個值決定了多個DataNode上的文件是否需要合并) set mapred.min.split.size.per.node=100000000; // 一個交換機下split的至少的大小(這個值決定了多個交換機上的文件是否需要合并) set mapred.min.split.size.per.rack=100000000; // 執行Map前進行小文件合并 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
- 設置map和reduce輸出相關參數// 設置map端輸出進行合并,默認為true set hive.merge.mapfiles = true // 設置合并文件的大小 set hive.merge.size.per.task = 256000000 // 設置reduce端輸出進行合并,默認為false set hive.merge.mapredfiles = true // 控制一個job當中會有多少reduce來處理,依據的是輸入文件的總大小 set hive.exec.reducers.bytes.per.reducer=256000000 // 當輸出文件的平均大小小于該值時,啟動一個獨立的MapReduce任務進行文件merge。 set hive.merge.smallfiles.avgsize=16000000
小文件解決
-
distribute by
insert overwrite table test [partition(hour=...)] select * from test distribute by floor (rand()*5);- distribute by:主要是控制在map端如何拆分數據給reduce端,其后的列用于控制落地文件數,默認采用hash算法
- rand():控制最終生成的文件個數
注意:這個語句把test表的數據查詢出來,overwrite覆蓋test表,不用擔心如果overwrite失敗,數據沒了,這里面是有事務性保證的,可以觀察一下執行的時候,在test表hdfs文件目錄下面有個臨時文件夾。如果是分區表,加上partition,表示對該分區進行overwrite
-
concatenate
// 這種方式只適用于orc文件存儲格式的表 alter table TableName [partition(...)] concatenate
總結
- 上一篇: 励志文章:追梦的青春,不放弃
- 下一篇: 遥感影像处理2——目视解译