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.maximum和mapred.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.maximum和mapred.tasktracker.reduce.tasks.maximum的設定可參考: