org.apache.hadoop.mapred.TaskTracker 的无限循环
Posted
技术标签:
【中文标题】org.apache.hadoop.mapred.TaskTracker 的无限循环【英文标题】:infinitely loop for org.apache.hadoop.mapred.TaskTracker 【发布时间】:2012-01-24 21:45:18 【问题描述】:我正在运行一个简单的 hadoop 应用程序,它从 64MB 文件中收集信息,映射很快完成,大约在 2 -5 分钟左右,然后 reduce 也快速运行高达 16%,然后它就停止了。
这是程序输出
20 年 11 月 12 日 17:53:46 INFO input.FileInputFormat:要处理的总输入路径:1 20 年 11 月 12 日 17:53:46 信息 mapred.JobClient:正在运行的作业:job_201112201749_0001 11/12/20 17:53:47 INFO mapred.JobClient: map 0% reduce 0% 11/12/20 17:54:06 INFO mapred.JobClient: map 4% reduce 0% 11/12/20 17:54:09 INFO mapred.JobClient: map 15% 减少 0% 11/12/20 17:54:12 INFO mapred.JobClient: 地图 28% 减少 0% 11/12/20 17:54:15 INFO mapred.JobClient: map 40% 减少 0% 11/12/20 17:54:18 INFO mapred.JobClient: map 53% 减少 0% 11/12/20 17:54:21 INFO mapred.JobClient: map 64% 减少 0% 11/12/20 17:54:24 INFO mapred.JobClient: 地图 77% 减少 0% 11/12/20 17:54:27 INFO mapred.JobClient: 地图 89% 减少 0% 11/12/20 17:54:30 INFO mapred.JobClient: map 98% reduce 0% 11/12/20 17:54:33 INFO mapred.JobClient: 地图 100% 减少 0% 11/12/20 17:54:54 INFO mapred.JobClient: 地图 100% 减少 8% 11/12/20 17:54:57 INFO mapred.JobClient: 地图 100% 减少 16%在数据节点日志中,我一次又一次看到大量相同的消息,以下是开始,
2011-12-20 17:54:51,353 信息 org.apache.hadoop.mapred.TaskTracker:attempt_201112201749_0001_r_000000_0 0.083333336% 减少 > 复制(4 个中的 1 个,9.01 MB/s)> 2011-12-20 17:54:51,507 INFO org.apache.hadoop.mapred.TaskTracker.clienttrace:src:127.0.1.1:50060,dest:127.0.0.1:44367,字节:75623263,操作:MAPRED_SHUFFLE,cliID:尝试_200112_0007040 ,持续时间:2161793492 2011-12-20 17:54:54,389 信息 org.apache.hadoop.mapred.TaskTracker:attempt_201112201749_0001_r_000000_0 0.16666667% 减少 > 复制(4 个中的 2 个,14.42 MB/s)> 2011-12-20 17:54:57,433 信息 org.apache.hadoop.mapred.TaskTracker:尝试_201112201749_0001_r_000000_0 0.16666667% 减少 > 复制(4 个中的 2 个,14.42 MB/s)> 2011-12-20 17:55:40,359 信息 org.mortbay.log: org.mortbay.io.nio.SelectorManager$SelectSet@53d3cf JVM BUG(s) - 注入延迟 3 次 2011-12-20 17:55:40,359 INFO org.mortbay.log: org.mortbay.io.nio.SelectorManager$SelectSet@53d3cf JVM BUG(s) - 重新创建选择器 3 次,取消键 72 次 2011-12-20 17:57:51,518 信息 org.apache.hadoop.mapred.TaskTracker:attempt_201112201749_0001_r_000000_0 0.16666667% 减少 > 复制(4 个中的 2 个,14.42 MB/s)> 2011-12-20 17:57:57,536 信息 org.apache.hadoop.mapred.TaskTracker:attempt_201112201749_0001_r_000000_0 0.16666667% 减少 > 复制(4 个中的 2 个,14.42 MB/s)> 2011-12-20 17:58:03,554 信息 org.apache.hadoop.mapred.TaskTracker:attempt_201112201749_0001_r_000000_0 0.16666667% 减少 > 复制(4 个中的 2 个,14.42 MB/s)>...
最多
2011-12-20 17:54:51,353 信息 org.apache.hadoop.mapred.TaskTracker:attempt_201112201749_0001_r_000000_0 0.083333336% 减少 > 复制(4 个中的 1 个,9.01 MB/s)> 2011-12-20 17:54:51,507 INFO org.apache.hadoop.mapred.TaskTracker.clienttrace:src:127.0.1.1:50060,dest:127.0.0.1:44367,字节:75623263,操作:MAPRED_SHUFFLE,cliID:尝试_200112_0007040 ,持续时间:2161793492 2011-12-20 17:54:54,389 信息 org.apache.hadoop.mapred.TaskTracker:attempt_201112201749_0001_r_000000_0 0.16666667% 减少 > 复制(4 个中的 2 个,14.42 MB/s)> 2011-12-20 17:54:57,433 信息 org.apache.hadoop.mapred.TaskTracker:尝试_201112201749_0001_r_000000_0 0.16666667% 减少 > 复制(4 个中的 2 个,14.42 MB/s)> 2011-12-20 17:55:40,359 信息 org.mortbay.log: org.mortbay.io.nio.SelectorManager$SelectSet@53d3cf JVM BUG(s) - 注入延迟 3 次 2011-12-20 17:55:40,359 INFO org.mortbay.log: org.mortbay.io.nio.SelectorManager$SelectSet@53d3cf JVM BUG(s) - 重新创建选择器 3 次,取消键 72 次 2011-12-20 17:57:51,518 信息 org.apache.hadoop.mapred.TaskTracker:attempt_201112201749_0001_r_000000_0 0.16666667% 减少 > 复制(4 个中的 2 个,14.42 MB/s)> 2011-12-20 17:57:57,536 信息 org.apache.hadoop.mapred.TaskTracker:attempt_201112201749_0001_r_000000_0 0.16666667% 减少 > 复制(4 个中的 2 个,14.42 MB/s)> 2011-12-20 17:58:03,554 信息 org.apache.hadoop.mapred.TaskTracker:attempt_201112201749_0001_r_000000_0 0.16666667% 减少 > 复制(4 个中的 2 个,14.42 MB/s)>这里是代码
包 com.bluedolphin; 导入 java.io.IOException; 导入 java.util.Iterator; 导入 org.apache.hadoop.conf.Configuration; 导入 org.apache.hadoop.fs.Path; 导入 org.apache.hadoop.io.LongWritable; 导入 org.apache.hadoop.io.Text; 导入 org.apache.hadoop.mapreduce.Job; 导入 org.apache.hadoop.mapreduce.Mapper; 导入 org.apache.hadoop.mapreduce.Reducer; 导入 org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 导入 org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 导入 org.apache.hadoop.util.GenericOptionsParser; 公共课我的工作 private final static LongWritable one = new LongWritable(1); private final static Text word = new Text(); 公共静态类 MyMapClass 扩展 Mapper公共无效映射(LongWritable 键, 文本值, 上下文上下文)抛出 IOException,InterruptedException String[] 引用 = value.toString().split(","); word.set(引文[0]); context.write(word, one); 公共静态类 MyReducer 扩展 Reducer 私有 LongWritable 结果 = 新 LongWritable(); 公共无效减少( 文字键, 迭代器 值, 上下文上下文)抛出 IOException,InterruptedException 整数总和 = 0; while (values.hasNext()) sum += values.next().get(); 结果集(总和); context.write(key, result); 公共静态 void main(String[] args) 抛出异常 配置 conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 2) System.err.println("用法:myjob "); System.exit(2); Job job = new Job(conf, "专利引用"); job.setJarByClass(MyJob.class); job.setMapperClass(MyMapClass.class); // job.setCombinerClass(MyReducer.class); // job.setReducerClass(MyReducer.class); job.setNumReduceTasks(0); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(LongWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1);
我不知道如何进一步排除故障。
提前感谢。
【问题讨论】:
看起来reducer 正在打乱和排序阶段。如果您能说出您的映射器发出的键值对会更好。 我上传了代码。减速器非常简单,我看不出它可能有无限循环。而且 CPU 使用率似乎还不错,我可以做其他工作,例如浏览,甚至可以安装和测试 mahout,而不会感觉很慢。 【参考方案1】:我在您的代码中注意到的几件事:
由于您要分别更新 map 中的 Text 对象“word”和 reduce 中的 LongWritable 对象“result”,以便分别调用 map 和 reduce,您可能不应该将它们声明为 final(尽管我不认为这是在这种情况下是一个问题,因为对象只是在改变状态)。
您的代码看起来类似于琐碎的字数统计,唯一的区别是您只是在 map 中的每条记录发出一个值。您可以直接消除 reduce(即运行仅 map 的作业),然后查看您是否从 map 中得到了预期的结果。
【讨论】:
我把结果注释掉了,就像你说的,我觉得没关系。然后我注释掉了 job.setCombinerClass(MyReducer.class);和 job.setReducerClass(MyReducer.class);似乎工作有自己的减少类。所以无论如何,它在减少时仍然停留在 16%。 在仅地图作业中,reducer 甚至不应该运行。尝试设置“job.setNumReduceTasks(0);” .这明确地将减速器的数量设置为 0。如果您仍然遇到该错误,我鼓励您提供一些输入样本。 我设置了job.setNumReduceTasks(0),然后只有map工作,成功结束。数据为样本数据nber.org/patents/Cite75_99.zip,提取到文本文件。我注意到在挂起之后,下次我 stop-all 然后 start-all 时,namenode 将不会启动。我必须做 hadoop namenode -format 才能让它再次工作。我有两个数据节点,一个主节点。我也更新了代码。 我要求您提供示例数据,您上传了一个 65 MB 的文件。样本数据可能是 10-100 条输入记录,如果您的程序在样本数据上为您提供了预期的输出,那么在实际数据上运行时它应该为您提供预期的输出。我基本上想看看你输入的格式。 哦,不好意思,我放的是真实数据。它不是样本数据。数据的格式很简单,就是成对的“CITING”,“CITED”:3858241,956203 3858241,1324234 3858241,3398406 3858241,3557384 3858241,3634889【参考方案2】:我想出了解决方案,在reduce方法签名中,我应该一直使用Iterable,而不是Iterator。因此,reduce 方法实际上没有被调用。它现在运行良好,但我不知道它之前挂起的内部原因。
【讨论】:
【参考方案3】:在减少工作期间我也有这个无限循环。折腾了一天,解决办法是调整 /etc/hosts 文件。
似乎条目“127.0.1.1 your_Machine's_Name”的存在混淆了 Hadoop。一个证明是无法从主机访问从机上的任务跟踪器 slave:50060。
只要删除这个“127.0.1.1 your_machine's_name”条目并在“127.0.0.1 localhost”条目末尾添加“your_machine's_name”,我的问题就没有了。
我希望这个观察可以有所帮助。
【讨论】:
以上是关于org.apache.hadoop.mapred.TaskTracker 的无限循环的主要内容,如果未能解决你的问题,请参考以下文章
org.apache.hadoop.mapred.TaskTracker 的无限循环
Apache Sqoop 启动配置错误:org.apache.hadoop.mapred.YarnClientProtocolProvider not a subtype
Mesos 上的 Hadoop 因“无法找到或加载主类 org.apache.hadoop.mapred.MesosExecutor”而失败
hadoop错误org.apache.hadoop.mapred.TaskAttemptListenerImpl Progress of TaskAttempt
解决 mapreduce.Cluster 无法使用 org.apache.hadoop.mapred.YarnClientProtocolProvider 由于实例化 YarnClient 错误
java.lang.NullPointerException Ignoring exception during close for org.apache.hadoop.mapred.MapTask$