Python 使用MapReduce是否可以保证具有相同键的所有值都将转到同一个reducer?

Python 使用MapReduce是否可以保证具有相同键的所有值都将转到同一个reducer?,python,hadoop,mapreduce,bigdata,mrjob,Python,Hadoop,Mapreduce,Bigdata,Mrjob,我有一个MapReduce项目(具体来说,我正在使用Python和库,并计划使用Amazon的EMR运行)。下面是一个例子来总结我面临的问题: 我有数千GB的json文件,其中包含客户数据。我需要在每个客户json行/输入/对象上运行每日、每周和每月报告 因此,对于映射步骤,我目前执行: map_step(_, customer_json_object) c_uuid = customer_json_object.uuid if customer_json_object.time

我有一个MapReduce项目(具体来说,我正在使用Python和库,并计划使用Amazon的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_报告不能跨多个进程分发,因此我需要一个进程处理报告所需的所有数据

我担心,如果一个键有太多的值,那么它们可能会分布在减缩器或其他东西中。然而,从我读到的情况来看,它的工作原理是这样的

非常感谢你!!我刚刚意识到我需要从映射步骤中多次让步,所以这是我的最后一块拼图。如果这能被解决,这将是一个巨大的胜利,因为我不能再垂直扩展我的小服务器了


如果上面的代码不清楚,我有数千个json文件行的客户(或者真正的用户,没有人付给我任何东西)数据。我希望能够为这些数据创建报告,并且根据其每月、每周或每日生成的报告代码不同。在此之前,我实际上也在对数据进行重复数据消除,但这是我的最后一步,实际生成输出。我真的很感谢你花时间阅读这篇文章并提供帮助

在MapReduce和Phyton library MrJob中,它适用于:

reducer在当前步骤中获取一个键和该键的完整的值集,并返回零个或多个任意(键、值)对作为输出

发件人:MrJob文档-

回到你的问题上来:

我在这里保证我所有的数据都是同一个密钥。。。是否将由同一减速器处理


是的,此外,在这种情况下,属于同一个键的所有值都被传递到同一个reducer调用。

没有阅读全部内容,但从主题行开始,请使用partitiononer来保证。非常感谢!当我开始在map reduce上重新阅读时,我到处都能看到这条评论,但我很难相信它,因为那个简单的缺失部分(我错过了那个事实)让我无法让我的项目工作这么长时间。。非常感谢你!那么,你在这里添加的是“同一个reducer调用”。这不仅是同一个reducer,而且是同一个“方法调用”,它正确地获取了一个键的所有值吗?因此,每个reducer不需要针对客户的任何一种特定报告类型(这是我的关键),它们可以为客户创建所有不同的报告类型?单个reducer可以处理多个键(从而减少调用),以避免产生过多reducer的开销,但是默认情况下,还原器的密钥分配是通过密钥的散列来完成的,因此,要收集还原器正在处理的密钥列表没有什么意义。