最近用Hadoop統計将近一億行的資料,由于每一行的列再加上Overall的統計 counter數量超過了120,故在Hadoop的運作過程中,抛出如下異常:
[java] view plain copy print ?

- org.apache.hadoop.mapreduce.counters.LimitExceededException: Too many counters: 121 max=120
由于無法修改Hadoop的配置(因為很多人在用),解決這個異常,我嘗試了如下方法進行解決:
1. 在conf配置檔案job-local.xml中增加修改Configuration的内容
[html] view plain copy print ?

- <property>
- <name>mapreduce.job.counters.limit</name>
- <value>200</value>
- </property>
運作的時候加上這個參數: *********** -conf job-local.xml ,運作後還是抛上面的LimitExceededException異常,但是在程式中輸出con.get("mapreduce.job.counters.limit")的結果已經由120 變為了 200, 說明參數已經設定到con中,但是并沒有起作用.
結果: 失敗
2. 在程式中直接設定mapreduce.job.counters.limit
[java] view plain copy print ?

- con.set("mapreduce.job.counters.limit", "200");
- ....
- ....
- logger.info(con.get("mapreduce.job.counters.limit"));
結果輸出已經是200了,但是運作後還是抛出上面的LimitExceededException異常
結果: 失敗, 方法 1 和方法 2 的設定過程和結果都是一樣的,但是并沒有起作用
3. 在Hadoop的配置檔案mapred-default.xml 如下内容, 詳細見部落格: http://blog.csdn.net/xin_jmail/article/details/24086919 , 但是前面說了因為很多項目在用Hadoop機群,不可能因為我的原因就修改整個Hadoop機群的配置
[html] view plain copy print ?

- <property>
- <name>mapreduce.job.counters.limit</name>
- <value>120</value>
- <description>Limit on the number of counters allowed per job. </description>
- </property>
結果 : 僞失敗
4. 修改程式,或者減少counter(臨時方法,最終滿足不了需求), 或者講mapper的結果放到檔案中,然後reduce進行統計并讀取檔案,請檢視我的另一篇博文《Hadoop Map Reduce的Counter數量超過預設值120的解決方案》
結果: 可實作
知識點:
1. mapreduce.job.counters.max已經取代了mapreduce.job.counters.limit,但是考慮相容性, 兩者都可以用,代表的是一個數值
2. 在job level是無法修改mapreduce.job.counters.limit(或mapreduce.job.counters.max)的值的,這應該是個BUG, hadoop的mail list有人提過,但Resolution狀态是Won't Fix,原因是 I'm marking this JIRA as won't fix. We can consider re-opening.it if you propose a compelling use case