【问题标题】:Why does reducer stop working after this code?为什么reducer在这段代码之后停止工作?
【发布时间】:2013-10-05 00:18:01
【问题描述】:

我正在关注一本流行的 hadoop 教科书中提供的简单示例。代码如下:- [我的问题的解释在程序之后]

package src.main.myjob;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.Set;

import javax.lang.model.SourceVersion;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.KeyValueTextInputFormat;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class MyJob extends Configured implements Tool
{
    public static class MapClass extends MapReduceBase implements Mapper<Text, Text, Text, Text>
    {

        @Override
        public void map(Text key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException 
        {
        output.collect(value, key); 
        }
    }

    public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, Text>
    {
            public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException
            {
                String csv = "";
                while(values.hasNext())
                {
        csv += values.next().toString();
                        csv += ",";
                }
                output.collect(key, new Text(csv));
            }
    }


    @Override
    public int run(String[] args) throws Exception
    {
        Configuration conf = new Configuration();
        JobConf job = new JobConf(conf, MyJob.class);

        Path in = new Path(args[0]);
        Path out = new Path(args[1]);

        FileInputFormat.setInputPaths(job, in);
        FileOutputFormat.setOutputPath(job, out);

        job.setJobName("MyJob");
        job.setMapperClass(MapClass.class);
        job.setReducerClass(Reduce.class);

        job.setInputFormat(KeyValueTextInputFormat.class);
        job.setOutputFormat(TextOutputFormat.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        job.set("key.value.seperator.in.input.line", ",");

        JobClient.runJob(job);

        return 0;
    }

    public static void main(String[] args) throws Exception
    {
        int res = ToolRunner.run(new Configuration(), new MyJob(), args);

        System.exit(res);
    }


}

现在为了读者的利益,所有这个程序都会处理一个包含引用专利 ID 和被引用专利 ID 行的文件 [巨大文件] 并将其反转。因此,实质上,输出文件列出了所有专利 ID,每个专利 ID 后跟一个逗号分隔的引用专利 ID 列表。

当我尝试执行它时,Map 任务运行良好,但是 reduce 任务卡在 66%。我尝试了各种方法,例如检查日志(非常神秘且几乎没有用)和增加减速器的数量。但是,我在理解这个问题方面几乎没有成功。代码对我来说是直截了当的。我非常感谢您的意见,帮助我了解如何在此处调试此问题。我看不出这个程序有什么明显的问题。

【问题讨论】:

    标签: logging hadoop hdfs reduce


    【解决方案1】:

    首先,如果您尝试连接字符串,请考虑在reducer 中使用StringBuilder 来追加。如果数据量很大,那么该循环将执行得更好。

    StringBuilder sb = new StringBuilder();
    sb.append(values.next().toString());
    

    如果要处理大量数据,请确保减速器中有足够的内存。

    【讨论】:

    • 感谢您的回复,我希望我可以对此进行测试,但是数据节点没有启动。我想知道为什么 Hadoop 的行为如此不一致。开发 MapReduce 应用程序似乎比管理 Hadoop/HDFS 容易得多 => 最难的部分是调试/管理而不是开发......
    • 我认为您没有足够的磁盘空间。你检查过吗?
    • 将 Datanode 日志放在这里需要一些等待。我现在无法访问我的 Hadoop 开发人员 PC....
    • 好的,我进行了研究并查看了日志,这似乎是命名空间ID 不匹配的问题。看起来这是一个有据可查的问题,但只是为了记录我通过删除 ....hadoop/tmp/dfs/name/....” 目录解决了它......这解决了这个问题。现在我要去测试你的建议。希望减速器能完成它的任务。我会把结果发回......
    【解决方案2】:

    作为这个问题的补充,我终于成功地完成了我的 MapReduce 程序。我不得不在 mapred-site.xml 中将 hadoop 的内存分配增加到 6 Gig,并且还使用了 JthRocker 在上述帖子中建议的字符串生成器。它确实完成了,但是输出文件不可读。 ubuntu 表示它的大小是 258MB,比我的输入文件略小。我想知道这是我的代码本身的缺陷吗?或者如果数据没有以编辑友好的格式正确写入,会导致解释问题?对此的所有投入都受到高度赞赏。

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多