最近用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