1. 程式人生 > >Hadoop叢集的配置調優

Hadoop叢集的配置調優

 

一、背景

Hadoop的叢集使用也有些時候了,不過都是小叢集的使用(數量小於30臺)。在這個過程中不斷的進行著配置調優的操作。最早的時候,在網上也沒有找到一些合適的配置調優方法,於是,我在這裡列舉一些基本的調優配置,以供參考。最後,還有一個我自己的測試環境的配置說明,也可以參看一下。

二、環境和配置

1.       版本和環境

Ø  Hadoop版本:apache釋出的0.21

Ø  作業系統:Linux

Ø  JDK:1.6

Ø  網路環境為千兆網路

2.       hdfs-site.xml配置檔案

Ø  dfs.block.size

這個是塊大小的設定,也就是說檔案按照多大的size來切分塊。一般來說,塊的大小也決定了你map的數量。舉個例子:我現在有一個1T的檔案,如果我的塊size設定是預設的64M,那麼在HDFS上產生的塊將有1024000/64=16000塊。

如果我們以TextInputFormat來處理該1T的檔案,那麼將會產生16000個map來處理。這樣的多的map明顯是不合理的。所以,如果我們將block的size設定成512M,那麼,將1T的檔案作為輸入檔案,將產生2000個map,計算的時候效率將提升不少。

因此,block size的大小是需要根據輸入檔案的大小以及計算是產生的map來綜合考量的。一般來說,檔案大,叢集數量少,還是建議將block size設定大一些的好。

Ø  dfs.replication

複製數量的設定,不能為0。這個名字說實話很迷惑人,最開始的時候我以為就是備份數量,後來才發現,原來就是存放資料檔案的份數。

設定為1,就是在叢集中存一份。如果設定為2,即做一份備份,也就是說資料在叢集中有2份。還是以1T的資料為例,如果設定1,叢集中就存在1T的檔案,如果設定為2,那麼叢集佔用空間為2T。

當然,這個備份還有個基於機架感知的備份機制(本地存放、同機架存放、異機架存放)如果不配置機架,預設都在一個機架上,之所以做機架感知的備份就是為了做到異地容災。因為我現在的叢集都在一個機房,就是做了機架配置,也不能做異地容災。要是機房斷電,誰也不能容災誰。但是如果你的叢集分別存放在2個機房,還是可以考慮做機架配置,然後將備份數量設定為3。

備份數量有利有弊,備份數量多,節點掛個幾個沒影響,資料依然完整。但是你的冗餘資料會增加。如果只設置為1,那就是節點一旦有掛掉的,就是block miss。一般來說,測試情況下建議設定為1,如果實際使用,所有機器都在一個機房,建議配置為2,如果叢集分佈在不同機房,還是試試配置為3吧。

3.       mapred-site.xml配置檔案

Ø  mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum

這個2個引數分別是用來設定的map和reduce的併發數量。實際作用的就是控制同時執行的task的數量。這2個引數實際上在配置的時候是需要結合計算節點的硬體配置以及任務排程模式來配置的。

舉個例子吧。我現在有5臺機器,1臺master,4太slave,配置都是2個4核CPU,8G記憶體,1T硬碟。我配置任務排程模式是預設的FIFO模式。在這樣的模式下,我配置併發map為6,併發的reduce為2。    其實這樣配置不難看出,map和reduce的併發數就等於CPU的總核數。

前段時間看到網上有篇文章說map和reduce的併發數應該設定為相同。最後我考慮了一下,如果使用fair的排程模式,設定成相同,應該是可以的,但是如果是FIFO模式,我個人認為在map或是reduce階段,CPU的核數沒有得到充分的利用,有些可惜,所以,FIFO模式下,還是儘量配置的map併發數量多於redcue併發數量。

因此,我說這個引數的配置不僅僅要考慮硬體配置,還需要考慮到Job的排程模式。需要說明的是,這個配置引數不同的節點可以配置不同。適用於硬體異構的叢集。見下圖:

Ø  mapred.child.java.opts

這個引數是配置每個map或reduce使用的記憶體數量。預設的是200M。對於這個引數,我個人認為,如果記憶體是8G,CPU有8個核,那麼就設定成1G就可以了。實際上,在map和reduce的過程中對記憶體的消耗並不大,但是如果配置的太小,則有可能出現”無可分配記憶體”的錯誤。所以,對於這個配置我總結了一個簡單的公式:map/reduce的併發數量(總和不大於CPU核數)×mapred.child.java.opts < 該節點機器的總記憶體。當然也可以等於,不過有點風險而已。

Ø  mapred.reduce.tasks

設定reduce的數量。一般來說在job裡面都會通過conf來設定reduce的數量,不採用這個引數。至於reduce的數量,可以根據自己的reduce業務邏輯複雜度以及輸出的資料量來調整。

4.       core-sit.xml配置檔案

Ø  webinterface.private.actions

這個引數實際上就是為了方便測試用。允許在web頁面上對任務設定優先順序以及kill任務。需要注意的是,kill任務是個緩慢的過程,它需要殺掉所有的任務task然後才是任務結束。如果task數量多,可能有點慢,需要一些耐心等待。

三、總結

需要說明一下,配置檔案的載入順序是:先載入預設的配置項(看看default檔案就知道預設配置項了),然後載入site檔案裡的配置項,最後載入MR程式碼裡的配置項。所以,個性化的配置還是放在MR程式碼中通過cong.set方法來設定比較合適。

其他的還有一些配置,例如task心跳響應延遲時間(預設10分鐘)、task失敗嘗試次數等等,這個有興趣可以改改試下。對於叢集,hadoop還自帶一些測試的工具,例如叢集的I/O測試,這個是最常用的。用法一般為hadoop jar hadoop-mapred-test-0.21.0.jar TestDFSIO -write -nrFiles 10 -fileSize 1000。執行完成之後會在同級目錄下有TestDFSIO_results.log檔案,檢視就行。

四、附件

這個是我的測試環境,大家可以參考一下:

Ø  資料量:1.3T文字檔案,約31億條資料,每條資料70個欄位。

Ø  業務:過濾所有資料,然後去重排序。

Ø  硬體:叢集共5臺裝置(8G記憶體、2個4核CPU、1T硬碟、千兆網絡卡,千兆交換機器)

Ø  軟體配置見下表:

欄位

blocksize

512M

排程模式

FIFO(就一個任務)

mapred.child.java.opts

1024M

mapred.tasktracker.map.tasks.maximum

6

mapred.tasktracker.reduce.tasks.maximum

2

Reduce數量

200

dfs.replication

1(硬碟空間不夠,就設定了1)

Ø  任務耗時:3小時30分鐘左右。