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$