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

时间:2015-02-17 06:51:09

标签: python hadoop mapreduce bigdata mrjob

我正在开发一个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行客户(或真正的用户,没有人付我任何东西)数据。我希望能够为此数据创建报告,并根据每月,每周或每天的不同生成报告代码。我实际上也是在此之前重复数据,但这是我的最后一步,实际上产生了输出。我非常感谢你花时间阅读并帮助!!

1 个答案:

答案 0 :(得分:3)

在MapReduce中,在Phyton库中,MrJob适用于:

  

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

来自: MrJob文档 - https://pythonhosted.org/mrjob/guides/concepts.html#mapreduce-and-apache-hadoop

回到你的问题:

  

我在这里保证所有具有相同密钥的数据都将由相同的减速器处理吗?

是的,此外,属于同一个键的所有值都会传递给reducer的同一个调用。