Hadoop排序问题(备用标题:1175不小于119!)



我是Hadoop的新手,已经完成了典型的"在日志中计算IP地址"练习。现在,我正试图通过在第一个作业之后立即运行第二个MapReduce作业来对输出进行排序。除了输出收集器没有完全按照我想要的方式处理排序之外,几乎所有的东西都在工作。以下是我的输出片段:

-101   71.59.196.132
-115   59.103.11.163
-1175  59.93.51.231
-119   127.0.0.1
-1193  115.186.128.19
-1242  59.93.64.161
-146   192.35.79.70

例如,我不明白为什么1175被认为比119低。我试过和Comparators一起玩,但没有任何积极的效果。

数据收集的Map和Reduce作业都是标准作业,也没有问题。它们输出的列表很像上面的片段,但完全没有排序。SortMap、SortRuce和Runner类有点不同。这是我的跑步类:

public class Runner {
public static void main(String[] args) throws Exception
{
JobConf conf = new JobConf(Runner.class);
JobConf sortStage = new JobConf(Runner.class);
conf.setJobName("ip-count");
conf.setMapperClass(IpMapper.class);
conf.setMapOutputKeyClass(Text.class);
conf.setMapOutputValueClass(IntWritable.class);
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);       
conf.setReducerClass(IpReducer.class);
conf.setOutputValueGroupingComparator(IntWritable.Comparator.class);

//Input and output from command line...
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
sortStage.setJobName("sort-stage");
sortStage.setMapperClass(SortMapper.class);
sortStage.setMapOutputKeyClass(Text.class);
sortStage.setMapOutputValueClass(IntWritable.class);
sortStage.setReducerClass(SortReducer.class);
sortStage.setOutputKeyClass(IntWritable.class);
sortStage.setOutputValueClass(IntWritable.class);
//Input and output from command line...
FileInputFormat.setInputPaths(sortStage, new Path(args[2]));
FileOutputFormat.setOutputPath(sortStage, new Path(args[3]));
JobClient.runJob(conf);
JobClient.runJob(sortStage);
}
}

"SortMapper":

public class SortMapper extends MapReduceBase 
implements Mapper<LongWritable, Text, Text, IntWritable>
{
private static final IntWritable one = new IntWritable(1);  
public void map(LongWritable fileOffset, Text lineContents,
OutputCollector<Text, IntWritable> output, Reporter reporter)
throws IOException {
{
//Grab the whole string, formatted as (Count /t IP), e.g., 101  128.10.3.40
String ip = lineContents.toString();
//Output it with a count of 1
output.collect(new Text(ip), one);
}
}
}

"分拣减速器":

public class SortReducer extends MapReduceBase implements Reducer<Text, IntWritable,      
IntWritable, Text> 
{
public void reduce(Text ip, Iterator<IntWritable> counts,
OutputCollector<IntWritable, Text> output, Reporter reporter)
throws IOException{
String delimiter = "[t]";
String[] splitString = ip.toString().split(delimiter);
//Count represented as 0-count to easily sort in descending order vs. ascending
int sortCount = 0-Integer.parseInt(splitString[0]);
output.collect(new IntWritable(sortCount), new Text(splitString[1]));
}
}

这只是一个单节点作业,所以我不认为分区是一个因素。如果这是一件小事,我很抱歉——我在这个问题上花了大量令人尴尬的时间,却找不到任何能处理这个特定排序问题的东西。如有任何建议,我们将不胜感激!

正在按"字母顺序"比较您的数字。这是因为有字符串。如果你想象按字母排序,aabc在aac之前。如果你把这些变成数字,1123在113之前。

如果你想要数字比较,你必须将它们转换为整数。

最新更新