1. 程式人生 > >Hadoop Map&Reduce個數優化設定以及JVM重用

Hadoop Map&Reduce個數優化設定以及JVM重用

來源:http://irwenqiang.iteye.com/blog/1448164 

      Hadoop與JVM重用對應的引數是mapred.job.reuse.jvm.num.tasks,預設是1,表示一個JVM上最多可以順序執行的task數目(屬於同一個Job)是1。也就是說一個task啟一個JVM。

       比如在叢集中配置每個slave節點最多同時執行16個map和2個reduce。那麼在map階段,slave節點會啟動最多16個JVM用於map。如下:

[email protected]:/usr/local/hadoop/conf$ jps

4883 Child

4924 Child

4680 Child

4622 Child

4743 Child

4838 Child

4719 Child

4650 Child

4649 Child

5299 Jps

32296 TaskTracker

4663 Child

4767 Child

4897 Child

4794 Child

4878 Child

4698 Child

4633 Child

32049 DataNode

[email protected]:/usr/local/hadoop/conf$ ps -e | grep java

12597 ?        00:00:02 java

12624 ?        00:00:02 java

12646 ?        00:00:02 java

12661 ?        00:00:02 java

12695 ?        00:00:01 java

12707 ?        00:00:02 java

12710 ?        00:00:02 java

12715 ?        00:00:02 java

12741 ?        00:00:02 java

12787 ?        00:00:01 java

12818 ?        00:00:01 java

12823 ?        00:00:02 java

12831 ?        00:00:01 java

12870 ?        00:00:01 java

12895 ?        00:00:01 java

12922 ?        00:00:01 java

32049 ?        00:00:38 java

32296 ?        00:00:14 java

      其中前兩個是固定的程序。

       為每個task啟動一個新的JVM將耗時1秒左右,對於執行時間較長(比如1分鐘以上)的job影響不大,但如果都是時間很短的task,那麼頻繁啟停JVM會有開銷。

       如果我們想使用JVM重用技術來提高效能,那麼可以將mapred.job.reuse.jvm.num.tasks設定成大於1的數。這表示屬於同一job的順序執行的task可以共享一個JVM,也就是說第二輪的map可以重用前一輪的JVM,而不是第一輪結束後關閉JVM,第二輪再啟動新的JVM。

       那麼最多一個JVM能順序執行多少個task才關閉呢?這個值就是mapred.job.reuse.jvm.num.tasks。如果設定成-1,那麼只要是同一個job的task(無所謂多少個),都可以按順序在一個JVM上連續執行。

       如果task屬於不同的job,那麼JVM重用機制無效,不同job的task需要不同的JVM來執行。

       JVM重用技術不是指同一Job的兩個或兩個以上的task可以同時運行於同一JVM上,而是排隊按順序執行。

       一個tasktracker最多可以同時執行的task數目由mapred.tasktracker.map.tasks.maximummapred.tasktracker.reduce.tasks.maximum

決定,並且這兩個引數在mapred-site.xml中設定。其他方法,如在JobClient端通過命令列-Dmapred.tasktracker.map.tasks.maximum=number或者conf.set("mapred.tasktracker.map.tasks.maximum","number")設定都是無效的。

mapred.tasktracker.map.tasks.maximummapred.tasktracker.reduce.tasks.maximum的設定可參考: