我有一个MapReduce项目正在进行中(特别是我正在使用Python和库MrJob,并计划使用亚马逊的EMR运行)。下面是一个例子来总结我遇到的问题:
我有数千GB的json文件,其中充满了客户数据。我需要对每个客户json行/input/object运行每日、每周和每月的报告。
因此,对于我目前所做的地图步骤:
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)
我的问题是:
我在这里是否保证我的所有具有相同密钥的数据(这里指的是特定客户和特定报告类型的所有数据)都将由同一个reducer处理?我的Create_Report不能分布在多个进程中,因此我需要由一个进程处理报告所需的所有数据。
我担心,如果一个键的值太多,那么它们可能会分布在减速器或其他什么中。然而,从我读到的内容来看,这听起来就是它的工作原理。
非常感谢!!我刚刚意识到我需要从地图步骤中多次屈服,所以这是我拼图的最后一块。如果能解决这个问题,那将是一个巨大的胜利,因为我无法将我的小服务器垂直扩展得更远。。。
如果从上面的代码中不清楚,我有数千个json行的客户(或者真正的用户,没有人向我支付任何费用)数据文件。我希望能够为这些数据创建报告,并且报告代码的生成方式会有所不同,这取决于它是每月、每周还是每天。实际上,在此之前我也在对数据进行反复制,但这是我的最后一步,实际上是生成输出。我真的很感谢你花时间阅读并提供帮助!!
在MapReduce和Phyton库MrJob中,它适用于:
reducer在当前步骤中获取一个键和该键的完整值集,并返回零个或多个任意(键,值)对作为输出。
来自:MrJob文档-https://pythonhosted.org/mrjob/guides/concepts.html#mapreduce-和apache hadoop
那么回到你的问题:
我在这里保证我所有的数据都有相同的密钥。。。将由同一个减速器处理?
是的,此外,属于同一个键的所有值都会传递给reducer的同一个调用。