Hive優化(整理)

本文檔是參考多個博客以及Hadoop2.5.0和Hive0.13.1的配置文件及源碼整理出來的,未做詳細解釋的部分可以在文章尾查看參考文檔

一、硬件優化

1、配置

二、網絡優化

1、交換機

⑴普通交換機:網線連接服務器,便宜,常用,數據交換能力一般;

⑵光纖交換機:光纖連接服務器,比較貴,數據交換能力強;

⑶帶寬(最好千兆以上);

三、MR優化


1、map優化

⑴map的優化,主要是確定合適的mapper數(默認等於block數)。

⑵map的計算公式

[java] view plain copy
  1. long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));    
  2. long maxSize = getMaxSplitSize(job);  
  3. Math.max(minSize, Math.min(maxSize, blockSize))  

①getFormatMinSplitSize()默認爲1byte,getMinSplitSize(job)返回的就是屬性②mapreduce.input.fileinputformat.split.minsize的值,默認爲1Lbyte;

③getMaxSplitSize(job)返回的值是Long.MAX_VALUE,對應的十進制爲9223372036854775807約等於9EB;

④所以getFormatMinSplitSize()就是爲了確定分片下限的,getMaxSplitSize(job)就是確定分片上限的;

⑤通過上面的分析,我們可以得出,分片的大小取決於Math.max("mapreduce.input.fileinputformat.split.minsize", blockSize)),這兩個參數是我們可以配置的,再根據文件大小就可以確定mapper數量了;

源碼分析見:hadoop2如何確定map數量

實際應用

⑴減小Map-Reduce job 啓動時創建的Mapper數量
當處理大批量的大數據時,一種常見的情況是job啓動的mapper數量太多而超出了系統限制,導致Hadoop拋出異常終止執行。解決這種異常的思路是減少mapper的數量。具體如下:
①輸入文件size巨大,但不是小文件
這種情況可以通過增大每個mapper的input size,即增大minSize或者增大blockSize來減少所需的mapper的數量。增大blockSize通常不可行,因爲當HDFS被hadoop namenode -format之後,blockSize就已經確定了(由格式化時dfs.block.size決定),如果要更改blockSize,需要重新格式化HDFS,這樣當然會丟失已有的數據。所以通常情況下只能通過增大minSize,即增大mapreduce.input.fileinputformat.split.minsize的值。

②輸入文件數量巨大,且都是小文件
所謂小文件,就是單個文件的size小於blockSize。這種情況通過增大mapreduce.input.fileinputformat.split.minsize不可行,需要使用FileInputFormat衍生的CombineFileInputFormat將多個input path合併成一個InputSplit送給mapper處理,從而減少mapper的數量。具體細節稍後會更新並展開。

⑵增加Map-Reduce job 啓動時創建的Mapper數量
增加mapper的數量,可以通過減小每個mapper的輸入做到,即減小blockSize或者減小mapreduce.input.fileinputformat.split.minsize的值。

註釋:

調整大小的時機根據查詢的不同而不同,總的來講可以通過觀察Map task的完成時間來確定是否需要增加Map資源。如果Map task的完成時間都是接近1分鐘,甚至幾分鐘了,那麼往往增加Map數量,使得每個Map task處理的數據量減少,能夠讓Map task更快完成;而如果Map task的運行時間已經很少了,比如10-20秒,這個時候增加Map不太可能讓Map task更快完成,反而可能因爲Map需要的初始化時間反而讓Job總體速度變慢,這個時候反而需要考慮是否可以把Map的數量減少,這樣可以節省更多資源給其他Job。

2、reduce優化

⑴reduce的優化,主要是確定reducer的數量;

⑵如果不需要Reducer,可以使用Job.setNumReduceTasks(int)將Reducer的數量設置爲0(如果不使用該方法設置Reducer的數量,由於mapreduce.job.reduces默認爲1,會啓動一個Reducer);

⑶增加Reducer的數量雖然增加了框架開銷,但增加了負載平衡和降低了失敗的成本。

3、spill與sort優化

在Spill階段,由於內存不夠,數據可能沒辦法在內存中一次性排序完成,那麼就只能把局部排序的文件先保存到磁盤上,這個動作叫Spill,然後Spill出來的多個文件可以在最後進行merge。如果發生Spill,可以通過設置mapreduce.task.io.sort.mb(默認100M)來增大Mapper輸出buffer的大小,避免Spill的發生。另外合併時可以通過設置mapreduce.task.io.sort.factor(默認10)來使得一次性能夠合併更多的數據。調試參數的時候,一個要看Spill的時間成本,一個要看merge的時間成本,還需要注意不要撐爆內存(mapreduce.task.io.sort.mb是算在Map的內存裏面的)。Reduce端的merge也是一樣可以用mapreduce.task.io.sort.factor。一般情況下這兩個參數很少需要調整,除非很明確知道這個地方是瓶頸。

4、copy優化

copy階段是把文件從Map端copy到Reduce端。默認情況下在5%的Map完成的情況下Reduce就開始啓動copy,這個有時候是很浪費資源的,因爲Reduce一旦啓動就被佔用,一直等到Map全部完成,收集到所有數據纔可以進行後面的動作,所以我們可以等比較多的Map完成之後再啓動Reduce流程,這個比例可以通mapreduce.job.reduce.slowstart.completedmaps去調整,他的默認值就是5%。如果覺得這麼做會減慢Reduce端copy的進度,可以把copy過程的線程增大。mapreduce.tasktracker.http.threads(默認40)可以決定作爲server端的Map用於提供數據傳輸服務的線程,mapreduce.reduce.shuffle.parallelcopies(默認5)可以決定作爲client端的Reduce同時從Map端拉取數據的並行度(一次同時從多少個Map拉數據),修改參數的時候這兩個注意協調一下,server端能處理client端的請求即可。

5、文件格式


四、Job優化

1、Job執行模式

Hadoop的Map Reduce Job可以有3種模式執行,即本地模式,僞分佈式,還有真正的分佈式。本地模式和僞分佈式都是在最初學習Hadoop的時候往往被說成是做單機開發的時候用到。但是實際上對於處理數據量非常小的Job,直接啓動分佈式Job會消耗大量資源,而真正執行計算的時間反而非常少。這個時候就應該使用本地模式執行mr Job,這樣執行的時候不會啓動分佈式Job,執行速度就會快很多。比如一般來說啓動分佈式Job,無論多小的數據量,執行時間一般不會少於20s,而使用本地mr模式,10秒左右就能出結果。

設置執行模式的主要參數有三個,一個是Hive.exec.mode.local.auto,把他設爲true就能夠自動開啓local mr模式。但是這還不足以啓動local mr,輸入的文件數量和數據量大小必須要控制,這兩個參數分別爲Hive.exec.mode.local.auto.tasks.max和Hive.exec.mode.local.auto.inputbytes.max,默認值分別爲4和128MB,即默認情況下,Map處理的文件數不超過4個並且總大小小於128MB就啓用local mr模式。

2、JVM重用

正常情況下,MapReduce啓動的JVM在完成一個task之後就退出了,但是如果任務花費時間很短,又要多次啓動JVM的情況下(比如對很大數據量進行計數操作),JVM的啓動時間就會變成一個比較大的overhead。在這種情況下,可以使用jvm重用的參數mapreduce.job.jvm.numtasks(默認爲1,設置爲-1時則不受限制),他的作用是讓一個jvm運行多次任務之後再退出。這樣一來也能節約不少JVM啓動時間。

3、索引


4、join算法

處理分佈式join,一般有兩種方法:

⑴replication join:把其中一個表複製到所有節點,這樣另一個表在每個節點上面的分片就可以跟這個完整的表join了;
⑵repartition join:把兩份數據按照join key進行hash重分佈,讓每個節點處理hash值相同的join key數據,也就是做局部的join。

5、數據傾斜

所謂數據傾斜,說的是由於數據分佈不均勻,個別值集中佔據大部分數據量,加上Hadoop的計算模式,導致計算資源不均勻引起性能下降。

五、Hql優化

1、表連接優化

2、排序

3、insert into 替換 union all

4、limit

5、自定義函數


六、平臺優化

1、Hive on tez

2、Spark sql

七、參考文檔

1、深入淺出數據倉庫中SQL性能優化之Hive篇

2、Hadoop-2.4.1學習之如何確定Mapper數量

3、


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章