解釋:web
一、JVM重用是hadoop調優參數的內容,對hive的性能具備很是大的影響,特別是對於很難避免小文件的場景或者task特別多的場景,這類場景大多數執行時間都很短。hadoop默認配置是使用派生JVM來執行map和reduce任務的,這是jvm的啓動過程可能會形成至關大的開銷,尤爲是執行的job包含有成千上萬個task任務的狀況。jvm
JVM重用可使得JVM實例在同一個JOB中從新使用N次,N的值能夠在Hadoop的mapre-site.xml文件中進行設置oop
mapred.job.reuse.jvm.num.tasks性能
也可在hive的執行設置:優化
set mapred.job.reuse.jvm.num.tasks=10;spa
JVM的一個缺點是,開啓JVM重用將會一直佔用使用到的task插槽,以便進行重用,直到任務完成後才能釋放。若是某個「不平衡「的job中有幾個reduce task 執行的時間要比其餘reduce task消耗的時間多得多的話,那麼保留的插槽就會一直空閒着卻沒法被其餘的job使用,直到全部的task都結束了纔會釋放。orm
二、並行執行,意思是同步執行hive的多個階段,hive在執行過程,將一個查詢轉化成一個或者多個階段。某個特定的job可能包含衆多的階段,而這些階段可能並不是徹底相互依賴的,也就是說能夠並行執行的,這樣可能使得整個job的執行時間縮短xml
hive執行開啓:set hive.exec.parallel=truehadoop
三、調整reducer個數:同步
設置 hive.exec.reducers.bytes.per.reducer(默認爲1GB),受hive.exec.reducers.max(默認爲999)影響:
mapred.reduce.tasks = min ( 參數2,總輸入數據量/參數1 )
三個優化的場景:
採用一個數據源多份處理的SQL來執行:
FROM TABLE1
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table1.txt' SELECT 20140303, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140303 AND col3 >= 20140201 GROUP BY col1, col2
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table2.txt' SELECT 20140302, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140302 AND col3 >= 20140131 GROUP BY col1, col2
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table3.txt' SELECT 20140301, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140301 AND col3 >= 20140130 GROUP BY col1, col2
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table4.txt' SELECT 20140228, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140228 AND col3 >= 20140129 GROUP BY col1, col2
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table5.txt' SELECT 20140227, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140227 AND col3 >= 20140128 GROUP BY col1, col2
INSERT OVERWRITE LOCAL DIRECTORY '/data/data_table/data_table6.txt' SELECT 20140226, col1, col2, 2160701, COUNT(DISTINCT col) WHERE col3 <= 20140226 AND col3 >= 20140127 GROUP BY col1, col2
………………省略
沒設置前的,執行時間是450s
設置參數:
set mapred.job.reuse.jvm.num.tasks=20
set hive.exec.reducers.bytes.per.reducer=150000000
set hive.exec.parallel=true;
執行時間縮短到273s ,合理利用一個參數調整,能夠達到部分調優