【问题标题】:MapReduce with Recursion带递归的 MapReduce
【发布时间】:2013-11-21 20:10:48
【问题描述】:

考虑以下问题:

编辑:如果下面的算法没有多大意义,请忽略。我只是为了它而把它放在那里。这个想法是 doFunc 在某种程度上是递归的。

doFunc(A):
    [a0, a1, a2, ...] <- A
    If (someCondition([a0, a1, a2, ...]) == False)
        A <- modified(A)
        r = doFunc(modified(A))
        A <- convertR(r)
    B <- someFunc1(A)
    C <- someFunc2(B)
    r <- lastFunc(D)
    return r

在这种情况下,r 是递归函数 doFunc 的结果,其中 a0, a1, a2, ... 列表中的 someCondition 是 false,函数递归以获得某种最优 A,其条件为true.

现在考虑 MapReduce 可以单独应用于程序的不同部分 - 例如将 A 转换为 a0, a1, a2, ... 然后获取 modifiedA 然后 someFuncI 都可以使用 MapReduce,如何递归适合这个 MapReduce 实现吗?

考虑到这一点,Hadoop Streaming 是不可能的,因为我不明白如何使用递归来实现它。唯一的另一种可能性是使用某种形式的 Python Hadoop Streaming Wrapper,例如 dumbomrjob 编写代码,忽略递归调用 doFunc 时显然会展开的代码。我想知道 MapReduce 是如何影响这些因素的,以及可扩展性是什么样的。

问题:我已经在上面的文字中提出了问题,但它们可能不够清楚。所以我会把它们放在这里。

  1. MapReduce 在递归方面表现良好吗?
  2. 如果是,它是否可以很好地扩展?
  3. 有没有办法使用涉及递归的函数来实现 Hadoop Streaming?

【问题讨论】:

  • Python 标签与这个问题无关。 MRjob 是 Hadoop API 的封装,服务于基于 python 的作业运行和监控的需求,并且不添加任何额外的功能,Hadoop 框架中没有提供

标签: java hadoop recursion mapreduce


【解决方案1】:

可以在 Hadoop 中实现的唯一递归形式是尾递归,这意味着递归调用必须在当前调用结束时进行。严格来说,在 Hadoop 中根本无法模拟递归,因为框架无法在下一个(递归调用)执行时保存当前作业的状态,然后重新加载当前作业并恢复其执行。然而,尾递归可以通过链接作业来模拟,即当一个结束时开始下一个(s)。

我已成功链接了数十/数百个工作。因此,按顺序融合几个(可能甚至数千个)作业没有特别的问题。但是,由于 3 个主要原因,这种做法会带来性能损失:设置/拆除作业需要时间,作业可能会失败并需要重新启动,作业可能具有较慢的机器,从而延迟了该作业的终止。

但是,除了这些细节之外,我认为您应该做的是确保 Hadoop 是您所需要的。 Hadoop 是一个非常专业的框架,因为它处理“数据可并行化”的任务,即处理(通常)大数据并且可以一次应用于整个数据集或重复应用于该数据的小块,最终获得与应用于整个数据集时相同的结果。你所描述的似乎不属于这一类。

【讨论】:

    【解决方案2】:

    我认为您没有很好地解释您的问题,或者您可能误解了 MapReduce。

    说递归,如果你的意思是想在 Map 或 Reducey 函数中放一个递归函数,答案是肯定的。您可以在两个阶段中使用递归函数。 但是,如果您要定义一个递归 MapReduce 作业并且您想在 Hadoop 中执行此操作,那么在 Hadoop 中定义递归函数是不可能的,或者至少是不安全和直接的。
    第二个和第三个问题的答案是一样的:第一种情况是可能的,如果你指的是递归作业,则不可能。

    【讨论】:

    • 谢谢。我实际上是指递归工作。例如Input -&gt; MapperX -&gt; ReducerX -&gt; Results -&gt; MapperX -&gt; ReducerX -&gt; Results...,除非某些条件变为truefalse。我会将其描述为一项递归工作。
    • 不,这实际上更通常称为迭代作业。现在,可以使用递归定义迭代过程,但这是另一回事。
    • -1 只是为了音调,这甚至可能不是故意的。关于 OP 不理解问题的评论对于答案来说是不必要的,尤其是没有所有的感叹号。重复使用“U”似乎会增加这种指责/否定的反应。如果不是故意的,清理答案会很好,因为它本来就不错。
    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2019-07-24
    • 2012-12-28
    • 1970-01-01
    • 2011-06-26
    • 2013-06-03
    相关资源
    最近更新 更多