gpt4 book ai didi

java - 带递归的 MapReduce

转载 作者:可可西里 更新时间:2023-11-01 16:16:24 27 4
gpt4 key购买 nike

考虑以下问题:

编辑:如果下面的算法没有多大意义,请忽略。我只是为了它把它放在那里。这个想法是 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 是不可能的,因为我不明白如何使用 Recursion 来实现它。唯一的另一种可能性是做某种形式的 Python Hadoop Streaming Wrapper,例如 dumbomrjob 来编写代码,忽略存在递归,当 doFunc 被递归调用。我想知道这如何影响 MapReduce 以及可扩展性。

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

  1. MapReduce 与 Recursion 配合得好吗?
  2. 如果是,它的扩展性好吗?
  3. 有没有一种方法可以使用涉及递归的函数来实现 Hadoop Streaming?

最佳答案

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

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

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

关于java - 带递归的 MapReduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20130934/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com