2010-08-01 98 views
14

我在執行大量模式匹配的情況下對1,5 TB數據運行Hadoop作業。我有幾臺機器,每臺都有16GB內存,而且我總是通過這些數據獲得OutOfMemoryException這個數據(我正在使用Hive)。如何在運行Hadoop時避免OutOfMemoryException?

我想知道如何在文件hadoop-env.sh中優化設置選項HADOOP_HEAPSIZE,所以我的工作不會失敗。是否有可能設置此選項,以便我的作業不會失敗?

當我將HADOOP_HEAPSIZE設置爲1,5 GB並從查詢中刪除了一半模式匹配時,作業成功運行。那麼,如果這無助於避免工作失敗,那麼這種選擇是什麼?

我希望做更多的試驗以獲得最佳的設置,但由於這些工作需要超過10小時才能運行,所以我在徵求您的建議。

+0

什麼讓你覺得'HADOOP_HEAPSIZE'不*有助於避免失敗?聽起來像你的經驗,它的確如此。由於只能通過檢查數據/作業才能知道的原因,您的情況要求堆大小至少是這麼大。你可以重構你的工作,以便它不需要這麼大的堆? – 2010-08-01 23:29:58

+0

我修改了我的工作,所以它沒有使用這麼大的堆,但是在這個時候我已經改變了'HADOOP_HEAPSIZE'。我沒有看到這個金字塔的真實結果,我的意思是:爲什麼設置堆比:amount_of_my_RAM/number_of_mappers_or_reducers? – wlk 2010-08-02 07:14:39

回答

13

作業是否失敗或服務器崩潰?如果您的作業由於節點上的OutOfMemmory而失敗,那麼您可以調整最大映射和縮減器的數量,併爲每個節點選擇JVM,以便永遠不會發生。 mapred.child.java.opts(默認爲200Xmx)通常必須根據您的數據節點特定的硬件增加。

http://allthingshadoop.com/2010/04/28/map-reduce-tips-tricks-your-first-real-cluster/

最大任務可以在名稱節點設置或重寫(並設定最終)上可以具有不同的硬件配置的數據節點。最大的任務是爲mappers和reducer設置的。要計算它,它基於CPU(內核)和RAM的數量以及您在mapred.child.java.opts中設置的JVM最大值(默認值爲200)。 Datanode和Tasktracker分別設置爲1GB,因此對於8GB的計算機,mapred.tasktracker.map.tasks.maximum可以設置爲7,mapred.tasktracker.reduce.tasks.maximum可以設置爲7以及mapred.child.java .opts設置爲-400Xmx(假設有8個內核)。請注意,如果您只有1個CPU和1個內核,那麼您可以通過CPU完成這些任務最多,然後是爲數據節點獲取新硬件或將掩碼任務設置爲1的時間。如果您有1個4核的CPU,則將map設置爲3並減少到3會很好(爲守護進程節省1個內核)。

默認情況下,只有一個reducer,並且您需要將mapred.reduce.tasks配置爲多個。這個值應該是每個節點最多任務數量乘以數據節點數量的.95到1.75倍之間的某個值。因此,如果您有3個數據節點,並且設置最大任務數爲7,則將其配置爲25到36.

如果您的服務器因OutOfMemory問題而崩潰,那麼HADOOP_HEAPSIZE僅用於進程堆(不是任務的執行)。

最後,如果您的工作持續了很長時間,您可以檢查是否有另一個良好的配置,此外還有mapred.compress.map.output。將這個值設置爲true應該(壓縮時間與傳輸時間之間的平衡)加速減速器的複製,特別是在處理大型數據集時。通常的工作需要時間,但也有選項來調整,以幫助加快速度= 8 ^)

相關問題