最近用Hadoop統計將近一億行的數據,由於每一行的列再加上Overall的統計 counter數量超過了120,故在Hadoop的運行過程中,拋出如下異常:
- org.apache.hadoop.mapreduce.counters.LimitExceededException: Too many counters: 121 max=120
1. 在conf配置文件job-local.xml中增加修改Configuration的內容
- <property>
- <name>mapreduce.job.counters.limit</name>
- <value>200</value>
- </property>
結果: 失敗
2. 在程序中直接設置mapreduce.job.counters.limit
- 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機羣的配置
- <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