Hadoop Streaming“comparator.options”没有受到尊重

时间:2013-12-27 14:18:52

标签: python hadoop mapreduce streaming bigdata

我有一个python mapper和reducer,我正在使用Hadoop流API。 在命令行上,这些脚本可以正常工作并执行预期的工作。

我有一个示例NASA Web访问日志,您可以在此处看到该日志已正确处理和排序。

tail -n 10 NASA_access_log_Jul95  | ./mapper.py | sort | ./reducer.py | sort -r -k1,1
4   163.205.53.14
1   tornado.umd.edu

在地图缩小作业中尝试相同时,排序不受尊重。

hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.4.0.jar 
-D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator     
-D mapred.text.key.comparator.options=-rk1,1
-file mapper.py -mapper mapper.py 
-file reducer.py -reducer reducer.py 
-input /user/cloudera/logcount/input 
-output /user/cloudera/logcount/output

具体参数:      的 mapred.text.key.comparator.options = -rk1,1

这份工作的最终结果是:

 hadoop fs -cat /user/cloudera/logcount/output/part-00000 | more
 16 ***.novo.dk
 32735  /
 161    /"
 1  /%20%20history/apollo/apollo-13/apollo-13.html
 4  /%20history/apollo/apollo-13/apollo-13.html

哪个值已排序,而不是我想要的键。 我也试过放掉'r'但它没有效果。

如果不清楚,我正在尝试按命中/视图(第一列)对结果进行排序。

任何帮助表示赞赏! TIA。

1 个答案:

答案 0 :(得分:2)

您正在尝试对reducer的输出进行排序,而不是映射器。请注意,排序阶段发生在map和reduce之间,这意味着mapred.text.key.comparator.options用于对mapper的输出进行排序。所以我猜你有两个选择:

  1. 重写mapper和reducer以将reducer的作业集成到mapper中,并且在reducer中什么都不做。
  2. 在此之后创建另一个mapreduce作业,用于按计数对输出进行排序。