hadoop 报错 org.apache.hadoop.mapred.TaskTracker: Process Thread Dump: lost task

本文介绍Hadoop中TaskTracker超时问题的原因与解决办法,包括调整超时时间及通过代码自动报告状态来避免超时。同时分享了一个实例,即因集群时间不同步导致的死循环问题及其解决方案。

项目最近报错,形如:

org.apache.hadoop.mapred.TaskTracker: Process Thread Dump: lost task
Thread 2958 (process reaper):
   State: RUNNABLE
    Blocked count: 0
   Waited count: 0
   Stack:
     java.lang.UNIXProcess.waitForProcessExit(Native Method)
     java.lang.UNIXProcess.access$900(UNIXProcess.java:20)
     java.lang.UNIXProcess$1$1.run(UNIXProcess.java:132)
Thread 2957 (JVM Runner jvm_201005091721_0012_m_209736581 spawned.):
   State: WAITING
   Blocked count: 1
   Waited count: 2
   Waiting on [url=mailto:java.lang.UNIXProcess@874c04]java.lang.UNIXProcess@874c04[/url]
   Stack:
     java.lang.Object.wait(Native Method)
     java.lang.Object.wait(Object.java:485)
     java.lang.UNIXProcess.waitFor(UNIXProcess.java:165)
    org.apache.hadoop.util.Shell.runCommand(Shell.java:186)
    org.apache.hadoop.util.Shell.run(Shell.java:134)
    org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:286)        org.apache.hadoop.mapred.JvmManager$JvmManagerForType$JvmRunner.runChild(JvmManager.java:335)   org.apache.hadoop.mapred.JvmManager$JvmManagerForType$JvmRunner.run(JvmManager.java:324)

 错误是因为tasktracker没有在timeout规定时间内返回心跳状态,所以jobtracker就认为这个tasktracker死了,需要检查代码是否有死循环,或是处理时间过长等等。默认的timeout是10分钟

 

解决方法:

1. 设置超时时间:mapred.task.timeout : 1800000 设置为30分钟

或是设置为0,则不检查超时,这需要有信息代码是绝对没问题的,不建议设置为0,因为每个tasktracker就是slaver上的一个child进程,要是放任不管,这个进程会一直存在

 

2. 自动返回tasktracker状态:

context.progress();

 

 

在项目中,发现代码出现死循环,是因为集群时间不同步,不断的出现请求elasticsearch出错,在昨晚时钟同步后,bug解决了

 

 

 

 

<think>我们面临的问题是Hadoop MapReduce作业中出现的计数器超过限制的异常:`org.apache.hadoop.mapreduce.counters.LimitExceededException: Too many counters: 121 max=120`。根据引用[1]、[2]、[3]、[4]的内容,解决方法主要是修改Hadoop配置文件中关于计数器数量的参数。 ### 解决方法 1. **修改配置文件**: 需要修改Hadoop的`mapred-site.xml`配置文件,增加或修改`mapreduce.job.counters.max`属性(引用[1]、[3])或`mapreduce.job.counters.limit`属性(引用[2]、[4]),将其值设置为大于当前计数器数量的值(例如200或更高)。 2. **配置文件位置**: 配置文件通常位于Hadoop的配置目录`$HADOOP_HOME/etc/hadoop/`下。 3. **配置示例**: 在`mapred-site.xml`中添加或修改以下属性: ```xml <property> <name>mapreduce.job.counters.max</name> <value>200</value> <description>设置作业计数器的最大数量</description> </property> ``` 或者(根据引用[2]和[4]): ```xml <property> <name>mapreduce.job.counters.limit</name> <value>200</value> <description>Limit on the number of counters allowed per job.</description> </property> ``` 4. **重启Hadoop服务**: 修改配置文件后,需要重启Hadoop集群以使配置生效(引用[1])。 ### 注意事项 - 根据不同的Hadoop版本,配置项名称可能略有不同。在Hadoop 2.x和3.x中,通常使用`mapreduce.job.counters.max`(引用[1]、[3]),但引用[2]和[4]提到`mapreduce.job.counters.limit`。如果其中一个无效,可以尝试另一个。 - 设置的值应大于当前作业所需的计数器数量。例如,当前报错显示121个计数器,那么可以将值设为130或更高以留有余地。 ### 操作步骤 1. 使用命令行或文本编辑器打开`$HADOOP_HOME/etc/hadoop/mapred-site.xml`。 2. 在`<configuration>`标签内添加上述属性。 3. 保存文件。 4. 重启Hadoop服务(如HDFS、YARN等)。 ### 验证 提交相同的作业,观察是否还会出现计数器超限的异常。 ### 潜在问题 - 如果计数器数量持续增长,可能需要检查作业逻辑,避免创建过多计数器(例如在循环中动态创建计数器)。 ### 引用说明 - 修改`mapred-site.xml`文件并重启服务的方案参考了引用[1]、[2]、[3]、[4]的内容。 §§相关问题§§ 1. 如何查看Hadoop作业中计数器的使用情况? 2. 除了修改配置,还有哪些方法可以减少计数器的数量? 3. Hadoop中计数器的具体作用是什么? 4. 如何优化MapReduce作业以避免创建过多计数器? </think>### 解决 Hadoop MapReduce 中 "Too many counters: 121 max=120" 报错的方法 根据引用[1][2][3][4],该错误是由于作业计数器数量超过 Hadoop 默认限制(120个)导致的。以下是完整解决方案: #### 1️⃣ **修改 Hadoop 配置文件**(核心步骤) 在 `mapred-site.xml` 中增加计数器上限配置(需在所有集群节点执行): ```xml <!-- 文件路径:$HADOOP_HOME/etc/hadoop/mapred-site.xml --> <configuration> <property> <name>mapreduce.job.counters.max</name> <!-- 或 mapreduce.job.counters.limit --> <value>200</value> <!-- 建议设置比121更大的值 --> <description>Maximum number of counters per job</description> </property> </configuration> ``` **关键说明**: - 配置项名称可能因版本而异: - Hadoop 2.x 通常用 `mapreduce.job.counters.max`(引用[1][3]) - Hadoop 3.x 可能用 `mapreduce.job.counters.limit`(引用[2][4]) - 值设置为当前计数器数量(121)的 **1.5-2 倍**更安全(如200) #### 2️⃣ **重启 Hadoop 服务** 修改后需重启服务使配置生效: ```bash # 在NameNode和ResourceManager节点执行 $HADOOP_HOME/sbin/stop-yarn.sh $HADOOP_HOME/sbin/stop-dfs.sh $HADOOP_HOME/sbin/start-dfs.sh $HADOOP_HOME/sbin/start-yarn.sh ``` #### 3️⃣ **作业级临时解决方案**(不重启集群) 在提交作业时通过命令行参数覆盖配置: ```bash hadoop jar your-job.jar \ -D mapreduce.job.counters.max=200 \ -D mapreduce.job.counters.limit=200 ``` #### 4️⃣ **根本原因分析与优化建议** | 原因类型 | 检测方法 | 优化方案 | |---------|---------|---------| | **作业设计问题** | 检查代码中`context.getCounter()`调用次数 | 合并相关计数器(如将10个状态计数器合并为1个复合计数器) | | **框架自动生成** | 查看作业日志中计数器列表 | 升级Hive/Spark版本(新版本优化了计数器生成逻辑)[^3] | | **数据倾斜导致** | 检查`Counter`名是否包含动态key | 避免在计数器名称中使用变量(如不要用`"GROUP_"+userID`) | > **验证方法**:提交作业后查看ResourceManager Web UI的计数器数量,确保低于设置值[^1]。 #### ⚠️ 版本兼容性注意事项 - CDH 5.x:仅支持 `mapreduce.job.counters.max` - Hadoop 3.3+:优先使用 `mapreduce.job.counters.limit` - Hive-on-Spark:需同时在Spark配置(`spark-defaults.conf`)中设置 `spark.hadoop.mapreduce.job.counters.max=200`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值