减速机停止工作

时间:2013-09-28 22:04:26

标签: logging hadoop hdfs reduce

我正在关注一个流行的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;

/**
 * @author Anup Saumithri
 */

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%。我尝试过各种各样的东西,比如检查日志(非常神秘而且几乎没用)和增加减速器的数量。但是我对这个问题的理解很少。代码看起来很直接。我非常感谢您在此帮助我了解如何调试此问题。我没有看到这个程序有任何明显的错误。

2 个答案:

答案 0 :(得分:0)

首先,如果您尝试连接字符串,请考虑在reducer中使用StringBuilder进行追加。如果数据的大小很大,那么循环将以更好的方式执行。

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

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

答案 1 :(得分:0)

作为这个问题的补充,我终于成功完成了MapReduce程序。我必须在mapred-site.xml&amp;中将hadoop的内存分配增加到6 Gigs。也可以使用字符串构建器作为JthRocker在上面的帖子中建议。它确实完成了,但是输出文件是不可读的。 ubuntu表示它的大小是258MB,略小于我的输入文件。我想知道这是我的代码本身的缺陷吗?或者如果数据没有以编辑友好格式正确编写,从而给出解释问题?所有投入都非常受欢迎。