其實,在從事過調優相關的工作後,會發現其實調優是一項較為複雜的工作。而對於hadoop這樣複雜且龐大的系統來說,調優更是一項巨大的工作,由於hadoop包含common、hdfs、mapreduce、yarn等模組,每個模組都有可以根據自身業務進行優化的工作,本篇部落格也是針對某些模組進行調優剖析。
在進行hadoop調優時,不僅僅只是針對其效能調優,還是涉及到更底層的硬體,os以及jvm等的優化,如下圖所示:
針對以上內容進行優化,均有可能對hadoop的效能進行提公升。
由於hadoop的設計決定,其只能用於linux作業系統作為生產環境。在實際應用場景之中,對linux引數進行優化,可以在一定程度上提公升作業的允許效率。
在hadoop集群當中,其內部的一些通訊依賴網路,需調整linux引數net.core.somaxconn,讓其處於乙個足夠大的狀態。
磁碟io效能沒有cpu和記憶體這樣發展迅猛,因而它成為os當中乙個主要的效能瓶頸。改進磁碟io效能也是重要的優化手段之一。可以使用linux的blockdev命令來設定預讀取的緩衝區大小,以便提高hadoop的檔案讀取效能。
在yarn裡面,可以啟用jvm的重用機制來得到效能的提公升。啟用該功能能夠讓一些task的執行效率提高2~3倍。在hadoop2.x中,yarn的結構不同於mrv1,因而其配置有些許變化。
yarn的預設配置會禁用該元件,即不允許重用jvm。首先,我們需要明白yarn是如何執行乙個mapreduce的job。其步驟如下所示:
每得到乙個container,該container所屬的nm將此container啟動
該container執行對應的task
對應的task執行完畢,該container被nm**,而container所擁有的jvm相應的推出
通過上述的流程可以看出,這種情況下,每乙個jvm僅只執行了乙個task,jvm並未被重用。
因而,使用者可以通過啟用ubertask屬性來重用jvm,在同乙個container裡面一次執行多個task,可以在mapred-site.xml中配置對應的引數即可,內容如下所示:
<在對hadoop調優時,這是乙個龐大的任務,這裡進行分解來看,按hadoop的組成模組來分,比如:我們可以安裝hdfs、mapreduce、yarn等模組去優化對應的模組。若是在細分,我們可以優化其各個元件的相關配置檔案,其每個模組都有對應的xml檔案,在系統啟動時,會通過configure載入到系統當中,而對應的xml檔案當中,配置的引數和屬性比較多,有些引數是根據業務本身去優化,如:心跳間隔、緩衝區大小、jvm子程序最大記憶體、小檔案的合併數、歸併map輸出資料佔比等等。property
>
<
name
>mapreduce.job.ubertask.enable
name
>
<
value
>true
value
>
property
>
另外,在處理一些io密集的應用,會在執行mapreduce時產生大量的中間輸出資料(map task執行階段),而產生的這些資料對於使用者來說是並不關心的(透明化)。這裡,可以思考一下,有木有一種辦法能夠集中處理這些輸出資料。答案是肯定的,在mapreduce中支援壓縮演算法,我們可以在執行這部分流程時,將中間輸出資料壓縮儲存,這樣在io效能方面有會有明顯的提公升。然而,萬物皆有因果,在選擇壓縮演算法時,需考慮壓縮比和壓縮效率,在一些壓縮演算法當中,有的壓縮比非常可觀,然而其壓縮效率卻非常低下;反之,有的壓縮比較差,然其壓縮效率非常理想。因為,我們需要在壓縮比和壓縮效率之間做乙個平衡,選擇合適的演算法,去平衡二者的關係。
上面提點過預讀取機制,可以通過預讀取機制來有效的提公升磁碟io的讀效能。通過改機制提高hdfs的讀效能以及mapreduce作業的執行效率。
當然,從應用程式也是有優化的空間的,處理應用程式當中配置必要的作業引數之外,其本身的編寫方式對效能也是有影響的。在執行一大批mapreduce作業時,若是設定乙個combiner,對於提供作業的效能大有裨益。在了解mapreduce(其分兩部分,其一為計算模型,其二為執行環境,儘管hadoop版本公升級到2.x,然其計算模型不變,變得只是其執行環境。其執行環境是基於yarn的資源管理)的計算模型時,在弄明白combiner階段的好處後,會發現,我們在編寫相關作業時,新增combiner可減少map task的中間輸出結果,從而減少各個reduce task的遠端copy資料量,最終帶來的益處是縮短了map和reduce兩者的執行時間。
同樣,我們在選擇hadoop的相關型別時,如writeable。在mapreduce中,map task和reduce task的輸入和輸出的資料型別均為writable的衍生型別,其包含intwritable、longwriteable、floatwritable等。在編寫相關**時,選擇合適的型別可以大大提公升其效能。例如在處理整型資料之時,直接採用intwritable比先以text型別讀取在通過對應的方法轉化為整型來的高效。
在對hadoop的優化過程,是乙個探索和實踐的過程,有一些優化的手段和技巧也是需要平時在工作的當中去總結的,以上給出的優化點,也是有限的,並未盡數述說,如我們也可以通過對任務的級別引數的調整,來達到有效的優化手段,對map task和reduce task階段的調優等。還有未言之知識點有待後續去發掘,以上只是起到點撥之效。
****:
twitter:
qq群(hadoop - 交流社群1):
424769183
Hadoop效能調優
最近看了些hadoop效能調優的文章,現總結如下。1 關於集群物理機器 配置noatime選項。配置方式 etc fstab 相關知識點 atime,ctime,mtime。對於datanode tasktracker機器,不需要配置raid或lvm。盡量避免使用到tasktracker的swap。...
hadoop 效能調優
hadoop 效能調優 環境 4臺suse 各 4g 記憶體 1t硬碟 4核cpu 3臺 redhat 各 2g記憶體 500g 硬碟 雙核cpu 由於沒有真正意義上的伺服器,所以當執行大量map reduce任務的時候 map 執行速度還可以接受 但reduce 速度 特別慢,所以開發 對集群進行...
Hadoop調優總結
size large 1.管理員角度主要在四方面進行調優 size 1 硬體選擇 2 作業系統引數調優 3 jvm引數調優 4 hadoop引數調優。size large 2.作業系統調優 size 1 增大同時開啟的檔案描述符合網路連線上限。管理員在啟動hadoop集群時,應使用ulimit命令將...