Sorting 使用零reduce节点在Mapreduce中实现简单排序程序时出错
我尝试在mapreduce中实现一个排序程序,这样在map阶段之后,排序由hadoop框架内部完成,我只得到排序后的输出。为此,我尝试将reduce任务的数量设置为零,因为不需要任何缩减。现在,当我尝试执行程序时,我不断得到校验和 错误。。我不知道下一步该做什么。当然,在我的上网本上运行这个程序是可能的,因为当我将reduce任务设置为1时,排序确实工作得很好。。请帮忙Sorting 使用零reduce节点在Mapreduce中实现简单排序程序时出错,sorting,hadoop,mapreduce,Sorting,Hadoop,Mapreduce,我尝试在mapreduce中实现一个排序程序,这样在map阶段之后,排序由hadoop框架内部完成,我只得到排序后的输出。为此,我尝试将reduce任务的数量设置为零,因为不需要任何缩减。现在,当我尝试执行程序时,我不断得到校验和 错误。。我不知道下一步该做什么。当然,在我的上网本上运行这个程序是可能的,因为当我将reduce任务设置为1时,排序确实工作得很好。。请帮忙 以下是我为执行排序而编写的全部代码,供您参考: /* * To change this template, cho
以下是我为执行排序而编写的全部代码,供您参考:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author root
*/
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.io.*;
import java.util.*;
import java.io.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.*;
import org.apache.hadoop.conf.*;
public class word extends Configured implements Tool
{
public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable>
{
private static IntWritable one=new IntWritable(1);
private Text word=new Text();
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter report) throws IOException
{
String line=value.toString();
StringTokenizer token=new StringTokenizer(line," .,?!");
String wordToken=null;
while(token.hasMoreTokens())
{
wordToken=token.nextToken();
output.collect(new Text(wordToken), one);
}
}
}
public int run(String args[])throws Exception
{
//Configuration conf=getConf();
JobConf job=new JobConf(word.class);
job.setInputFormat(TextInputFormat.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setOutputFormat(TextOutputFormat.class);
job.setMapperClass(Map.class);
job.setNumReduceTasks(0);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
JobClient.runJob(job);
return 0;
}
public static void main(String args[])throws Exception
{
int exitCode=ToolRunner.run(new word(), args);
System.exit(exitCode);
}
}
因此,请查看0.20.2中第600行附近的
org.apache.hadoop.mapred.MapTask
// get an output object
if (job.getNumReduceTasks() == 0) {
output =
new NewDirectOutputCollector(taskContext, job, umbilical, reporter);
} else {
output = new NewOutputCollector(taskContext, job, umbilical, reporter);
}
如果将reduce任务数设置为零,它将直接写入输出。NewOutputCollector
将使用所谓的MapOutputBuffer
进行溢出、排序、组合和分区
因此,如果不设置减速机,则不会进行排序,即使Tom White在最终指南中指出了这一点。因此,请查看0.20.2中第600行附近的
org.apache.hadoop.mapred.MapTask
// get an output object
if (job.getNumReduceTasks() == 0) {
output =
new NewDirectOutputCollector(taskContext, job, umbilical, reporter);
} else {
output = new NewOutputCollector(taskContext, job, umbilical, reporter);
}
如果将reduce任务数设置为零,它将直接写入输出。NewOutputCollector
将使用所谓的MapOutputBuffer
进行溢出、排序、组合和分区
因此,如果您不设置减速机,则不会进行排序,即使Tom White在最终指南中对此进行了说明。我也遇到了同样的问题(0处的文件部分-00000的校验和错误)。我通过将文件重命名为-00000以外的任何其他名称解决了此问题。我也遇到了同样的问题(0处文件部分-00000的校验和错误)。我通过将文件重命名为-00000以外的任何其他名称解决了这个问题。因此,如果您至少需要一个Reducer来进行内部排序,那么您可以使用IdentityReducer 您可能还希望看到以下讨论:
因此,如果您至少需要一个减速机来进行内部排序,那么您可以使用IdentityReducer 您可能还希望看到以下讨论:
即使在即时映射输出上完成排序,也不会有没有减缩器的排序;)@ThomasJungblut-好吧,谢谢你的回答,但我不认为如果我们不使用减缩器,我们就不能对输出进行排序。我还参考了Tom White的《Hadoop最终指南》一书,如第233页所述,我们当然可以通过将reduce tasks设置为零来对输出进行排序哦,是的,我在hadoop安装的伪分布式模式下工作,那么这与我面临的问题有什么关系吗?Thanx.即使是Tom有时也可能是错的;)看到我的答案了。你能发布校验和堆栈跟踪吗?@Chris-已经发布了上面的校验和错误。如果我的笔记本电脑的硬件配置出现这样的错误,一定要让我知道。我尝试在hadoop示例jar文件中执行其他示例排序程序,但在运行这些程序时仍然出现校验和错误。即使在即时映射输出上完成排序,也不会有没有减缩器的排序;)@ThomasJungblut-好吧,谢谢你的回答,但我不认为如果我们不使用减缩器,我们就不能对输出进行排序。我还参考了Tom White的《Hadoop最终指南》一书,如第233页所述,我们当然可以通过将reduce tasks设置为零来对输出进行排序哦,是的,我在hadoop安装的伪分布式模式下工作,那么这与我面临的问题有什么关系吗?Thanx.即使是Tom有时也可能是错的;)看到我的答案了。你能发布校验和堆栈跟踪吗?@Chris-已经发布了上面的校验和错误。如果我的笔记本电脑的硬件配置出现这样的错误,一定要让我知道。我尝试在hadoop示例jar文件中执行其他示例排序程序,但在运行它们时仍然出现校验和错误。。