我正在开发一个MapReduce项目(特别是我正在使用Python和库MrJob并计划使用亚马逊的EMR运行)。这是一个总结我遇到的问题的例子:
我有数千GB的json文件,其中包含客户数据。我需要对每个客户json行/输入/对象运行每日,每周和每月报告。
因此,对于我目前所做的地图步骤:
map_step(_, customer_json_object)
c_uuid = customer_json_object.uuid
if customer_json_object.time is in daily_time_range:
yield "%s-%s" % (DAILY_CONSTANT, c_uuid), customer_json_object
if customer_json_object.time is in weekly_time_range:
yield "%s-%s" % (WEEKLY_CONSTANT, c_uuid), customer_json_object
if customer_json_object.time is in monthly_time_range:
yield "%s-%s" % (MONTHLY_CONSTANT, c_uuid), customer_json_object
然后是减速器
reducer_step(key, customer_info)
report_type, c_uuid = key.split("-")
yield None, Create_Report(report_type, customer_info)
我的问题是:
我在此保证,所有具有相同密钥的数据(此处是特定客户的所有数据和特定报告类型)都将由同一个减速器处理?我的Create_Report不能分布在多个进程中,因此我需要一个进程处理报表所需的所有数据。
我担心如果某个键的值太多,那么它们可能会在reducers之间展开。然而,根据我的阅读,听起来这就是它的工作原理。
非常感谢!!我刚刚意识到我需要从地图步骤中多次屈服,所以这是我的最后一块拼图。如果可以理解这将是一个巨大的胜利,因为我无法将我的小服务器扩展到更远的地方......
如果从上面的代码中不清楚我有数千个json行客户(或真正的用户,没有人付我任何东西)数据。我希望能够为此数据创建报告,并根据每月,每周或每天的不同生成报告代码。我实际上也是在此之前重复数据,但这是我的最后一步,实际上产生了输出。我非常感谢你花时间阅读并帮助!!
答案 0 :(得分:3)
在MapReduce中,在Phyton库中,MrJob适用于:
reducer在当前步骤中为该键获取一个键和完整值,并返回零个或多个任意(键,值)对作为输出。
来自: MrJob文档 - https://pythonhosted.org/mrjob/guides/concepts.html#mapreduce-and-apache-hadoop
回到你的问题:
我在这里保证所有具有相同密钥的数据都将由相同的减速器处理吗?
是的,此外,属于同一个键的所有值都会传递给reducer的同一个调用。