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

pepwfjgg  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(207)

我是hadoop新手,已经完成了典型的“在日志中计算ip地址”练习。现在,我尝试通过在第一个mapreduce作业之后立即运行第二个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低。我试过使用比较仪,但没有任何积极的效果。
数据收集的map和reduce作业都是标准的,没有问题。它们输出的列表与上面的代码片段非常相似,但完全没有排序。sortmap、sortreduce和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);

}
}

“排序器”:

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]));
  }
}

这只是一个单节点作业,所以我不认为分区是一个因素。抱歉,如果这是一个琐碎的问题-我花了大量的时间在这个问题上,找不到任何处理这个特殊的排序问题。任何建议都将不胜感激!

mi7gmzs6

mi7gmzs61#

你的数字正在按字母顺序进行比较。这是因为有弦。如果你想象按字母顺序排序,a排在aac前面。如果你把这些转换成数字,1123在113之前。
如果你想要数字比较,你必须把它们转换成整数。

相关问题