这是我第一次使用map / reduce。我想编写一个处理大型日志文件的程序。例如,如果我正在处理一个包含{Student,College和GPA}的记录的日志文件,并希望按大学排序所有学生,那么'map'部分和'reduce'部分是什么? ?尽管我已经阅读了许多教程和示例,但我对这个概念有些困难。
谢谢!
答案 0 :(得分:2)
从技术上讲,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)
然后你的映射器除了将学院的价值观转移到关键词之外别无他法:
map: (s, c, g) -> [(c, s, g)]
以大学为新的关键,Hadoop将按大学排序。那么你的减速机只是一个普通的“减速器”。
如果您在实践中进行排序操作(也就是说,这不是作业问题),请查看Hive或Pig。这些系统大大简化了这些任务。对特定列进行排序变得非常简单。但是,编写一个hadoop流媒体作业来处理你在这里发现的任务,总是很有教育意义,可以让你更好地理解映射器和缩减器。
答案 1 :(得分:2)
雅虎拥有sorted Peta和Tera字节的数据。其他人(包括Google)定期执行此操作,您可以在互联网上搜索排序基准。雅虎已经发布了paper如何做到这一点。
必须稍微修改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博客here上找到更多信息。有一些内置类可以使排序更容易。
订单总分区HADOOP-3019。作为TeraSort记录的衍生产品,Hadoop现在拥有用于高效生成全局排序输出的库类。 InputSampler用于对输入数据的子集进行采样,然后使用TotalOrderPartitioner将地图输出划分为大致相等大小的分区。非常简洁的东西 - 非常值得一看,即使你不需要使用它。