Java 带递归的MapReduce

Java 带递归的MapReduce,java,hadoop,recursion,mapreduce,Java,Hadoop,Recursion,Mapreduce,考虑以下问题: 编辑:如果下面的算法没有多大意义,则忽略。我只是为了它才放在那里的。其思想是,doFunc以某种方式是递归的 doFunc(A): [a0, a1, a2, ...] <- A If (someCondition([a0, a1, a2, ...]) == False) A <- modified(A) r = doFunc(modified(A)) A <- convertR(r) B &

考虑以下问题:

编辑:如果下面的算法没有多大意义,则忽略。我只是为了它才放在那里的。其思想是,
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
doFunc(A):

[a0,a1,a2,…]我认为您没有很好地解释您的问题,或者您可能误解了MapReduce

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

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

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


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

谢谢。我实际上是指递归工作。例如
Input->MapperX->ReducerX->Results->MapperX->ReducerX->Results…
除非某些条件变为
true
false
。我会把它描述为一个递归作业。不,它实际上更典型地被称为迭代作业。现在,可以使用递归定义一个迭代过程,但这是一个单独的问题。-1仅用于音调,这可能不是有意的。关于OP不理解这个问题的评论对于答案来说是不必要的,尤其不是所有的感叹号。重复使用“U”似乎会堆积在这种指责/否定的反应上。如果不是有意的话,最好把答案整理一下,否则会很不错。Python标记与这个问题无关。MRjob是围绕hadoopapi的包装器,服务于运行和监视基于python的作业的需要,并且不添加Hadoop框架中没有的任何附加功能