这是我第一次使用map/reduce我想写一个程序来处理一个大的日志文件。例如,如果我正在处理一个日志文件,其中包含{Student, College和GPA}的记录,并希望按大学对所有学生进行排序,那么"map"部分是什么,"reduce"部分是什么?尽管我已经看了很多教程和例子,但我对这个概念还是有一些困难。
谢谢!
从技术上讲,Hadoop MapReduce将所有内容视为键值对;您只需要定义键是什么和值是什么。map和reduce的签名为
map: (K1 x V1) -> (K2 x V2) list
reduce: (K2 x V2) list -> (K3 x V3) list
,在map和reduce之间的中间shuffle阶段对K2值进行排序。
如果你的输入是
Student x (College x GPA)
那么你的映射器只需要将College值获取到键:
map: (s, c, g) -> [(c, s, g)]
以大学作为新的关键字,Hadoop将为你按大学排序。那么你的减速机,就是一个普通的恒等减速机
如果您在实践中执行排序操作(也就是说,这不是作业问题),那么请查看Hive或Pig。这些系统极大地简化了这类任务。对特定列进行排序变得相当琐碎。然而,编写一个hadoop流作业来完成像你在这里所确定的任务总是有教育意义的,这会让你更好地理解映射器和reducer。
雅虎对Peta和Tera字节的数据进行了排序。其他公司(包括Google)定期这样做,您可以在互联网上搜索排序基准。雅虎已经发表了一篇关于他们如何做到这一点的论文。
Ray的方法需要稍微修改一下才能得到最终的输出排序。必须对输入数据进行采样,并写入自定义分区,以便将键范围发送到特定的reducer。然后N个约简器的输出只需要连接起来。雅虎的文章对此有更详细的解释。
"org.apache.hadoop.examples。Terasort '包有用于排序数据的示例代码。
如果您是MapReduce的新手,我建议您观看以下视频。它们有点长,但值得。
http://www.youtube.com/watch?v=yjPBkvYh-ss
http://www.youtube.com/watch?v=-vD6PUdf3Js
http://www.youtube.com/watch?v=5Eib_H_zCEY
http://www.youtube.com/watch?v=1ZDybXl212Q
http://www.youtube.com/watch?v=BT-piFBP4fE
编辑:在Cloudera博客这里找到了更多信息。有一些内置的类使排序更容易。
HADOOP-3019的总顺序分区。作为TeraSort记录的衍生产品,Hadoop现在拥有用于高效生成全局排序输出的库类。使用InputSampler对输入数据的一个子集进行采样,然后使用TotalOrderPartitioner将映射输出划分为大小大致相等的分区。非常整洁的东西——非常值得一看,即使你不需要使用它。