考虑以下问题:
编辑:如果下面的算法没有什么意义,请忽略。我只是把它放在那里。我们的想法是 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, ...
是 false
,函数递归得到某种最优解 A
条件是什么 true
.
现在考虑mapreduce可以单独应用于程序的不同部分,例如转换 A
至 a0, a1, a2, ...
然后得到 modifiedA
然后 someFuncI
如果使用mapreduce都是可能的,那么递归如何适应这个mapreduce实现?
考虑到这一点,hadoop流媒体是不可能的,因为我不知道如何用递归实现它。唯一的另一种可能性是做一些形式的python-hadoop流 Package 器,例如 dumbo
或者 mrjob
在编写代码时忽略了递归的存在,当 doFunc
递归调用。我想知道这是如何与mapreduce结合的,以及可伸缩性是什么样的。
问题:我问了上面课文中的问题,但可能不够清楚。所以我要把它们放在这里。
mapreduce在递归中表现良好吗?
如果是这样的话,它的伸缩性好吗?
有没有一种方法可以用包含递归的函数实现hadoop流?
2条答案
按热度按时间g2ieeal71#
在hadoop中唯一可以实现的递归形式是尾部递归,这意味着递归调用必须在当前调用的末尾。严格地说,在hadoop中根本不能模拟递归,因为框架不能在下一个作业(递归调用)执行时保存当前作业的状态,然后重新加载当前作业并恢复其执行。但是,尾部递归可以通过链接作业来模拟,即当一个作业结束时开始下一个作业。
我已经成功地链接了几十/几百个工作。因此,在一个序列中融合几个(甚至可能几千个)工作并没有特别的问题。但是,由于3个主要原因,这种做法会导致性能下降:设置/拆除作业需要时间,作业可能会失败并需要重新启动,作业的机器可能较慢,从而延迟作业的终止。
但是,除了这些细节,我认为您应该做的是确保hadoop是您所需要的。hadoop是一个非常专业化的框架,因为它处理的任务是“数据可并行化”的,即处理(通常)大数据的任务,这些任务可以一次应用于整个数据集,也可以重复应用于小数据块,并且最终实现与应用于整个数据集时相同的结果。你所描述的似乎不属于这一类。
ubof19bj2#
我认为您没有很好地解释您的问题,或者您误解了mapreduce。
通过说递归,如果你的意思是你想把一个递归函数放在map或reducey函数中,答案是肯定的。两个阶段都可以使用递归函数。但是,如果您想定义递归mapreduce作业,并且希望在hadoop中这样做,那么在hadoop中定义递归函数是不可能的,或者至少是不安全的。
第二个和第三个问题的答案是一样的:第一种情况是可能的,如果你指的是递归作业,那就不可能了。