????????hive作為數(shù)據(jù)倉庫工具仑嗅,可以查看HDFS結(jié)構(gòu)化文件內(nèi)容,使用sql進(jìn)行數(shù)據(jù)加工處理。在使用hive進(jìn)行數(shù)據(jù)查詢時无畔,底層執(zhí)行引擎主要是MapReduce啊楚,而MapReduce流程加工處理期間有數(shù)據(jù)落盤情況,會浪費大量時間浑彰,接下來整理下hive是如何確定map和reduce數(shù)量及相關(guān)優(yōu)化方法恭理。?
????hive如何確定map數(shù)量
? ? ? ? 1、輸入文件總個數(shù)郭变;2颜价、輸入文件大小诉濒;3周伦、集群設(shè)置的文件塊大小(默認(rèn)128未荒,hdfs-set.xml 中dfs.block.size確定大凶ㄅ病)。
????????比如:
? ? ? ? 1片排、假設(shè)input目錄下有3個文件a寨腔、b、c率寡,大小分別是10m迫卢、20m、150m冶共,那么hadoop會分隔成4個塊乾蛤,10m、20m捅僵、128m家卖、22m共4個map。
????????2命咐、假設(shè)輸入目錄下有1個文件a篡九,大小是780m,hadoop會把a分割成7塊醋奠,6個128m和1個12m,產(chǎn)生7個map伊佃。? ?
????map數(shù)量是否越多越好
? ? ? ? 一個map任務(wù)啟動和初始化時間是需要時間的窜司,如果map數(shù)量多,但每個map下數(shù)據(jù)量并不大航揉,造成執(zhí)行時間小于啟動初始化時間塞祈,會浪費大量的時間給更多的map分配task,同時也是對系統(tǒng)資源對浪費帅涂。但是對于有些文件在一個文件塊下议薪,因為字段少尤蛮,數(shù)據(jù)行特別多,可以增加map數(shù)量來提高數(shù)據(jù)處理速度斯议。
? ? ? ? 設(shè)置調(diào)整map數(shù)量方法:
? ? ? ? set mapred.max.split.size=100000000??決定每個map處理的最大的文件大小
? ? ? ? set mapred.min.split.size.per.node=100000000? 節(jié)點可以處理的最小的文件大小
? ? ? ? set mapred.min.split.size.per.rack=100000000??機(jī)架中可以處理的最小的文件大小
? ? ? ? set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat(設(shè)置執(zhí)行前進(jìn)行小文件合并)
????hive如何確定reduce數(shù)量
? ? ? ? reduce數(shù)量是min(max(totalInputFileSize/bytesPerReducer,1),maxReducers)決定产捞。
? ? ? ? toalInputFizeSize job所有輸入總字?jǐn)?shù)
? ? ? ? bytesPerReducer 每個Reduce數(shù)據(jù)量,由hive.exec.reducers.bytes.per.reducer參數(shù)指定
? ? ? ? maxReducers 一個MapReduce作業(yè)允許的最大reduce數(shù)量哼御,由參數(shù)hive.exec.reducer.max指定
? ? ? ??set mapred.reduce.tasks 設(shè)置reduce數(shù)量坯临,這種方法不建議使用,優(yōu)先通過設(shè)置Reduce數(shù)據(jù)量確定reduce數(shù)量
????hive合并輸入文件設(shè)置
? ? ? ? set hive.merge.mapfiles = true 在map-only任務(wù)結(jié)束時合并小文件
? ? ? ? set hive.merge.mapredfiles = true 在map-reduce任務(wù)結(jié)束時合并小文件
? ? ? ? set hive.merge.size.per.task = 256*1000*1000 合并文件大小?
? ? ? ? set hive.merge.smallfiles.avgsize = 16000000 當(dāng)輸出文件的平均大小小于該值時恋昼,啟動一個獨立map-reduce 任務(wù)進(jìn)行文件merge