Recursion Hadoop适用于递归数据处理

Recursion Hadoop适用于递归数据处理,recursion,hadoop,mapreduce,bigdata,Recursion,Hadoop,Mapreduce,Bigdata,我有一个需要递归应用的过滤算法,我不确定MapReduce是否适合这项工作。如果没有给出太多的信息,我可以说每个被过滤的对象都有一个集合(如果是有序列表或队列) 数据不是很大,当我从SQL导出到 CSV 映射步骤很简单:列表的头部包含一个对象,可以将列表分类为属于N映射节点之一。每个节点上的过滤算法对分配给该节点的列表集合起作用,在过滤结束时,列表与过滤前保持不变,或者删除列表的标题 reduce函数也很简单:所有映射作业的列表都集中在一起,可能必须写回磁盘 当所有N节点返回其输出时,将使用这组

我有一个需要递归应用的过滤算法,我不确定MapReduce是否适合这项工作。如果没有给出太多的信息,我可以说每个被过滤的对象都有一个集合(如果是有序列表或队列)

  • 数据不是很大,当我从SQL导出到 CSV
  • 映射步骤很简单:列表的头部包含一个对象,可以将列表分类为属于N映射节点之一。每个节点上的过滤算法对分配给该节点的列表集合起作用,在过滤结束时,列表与过滤前保持不变,或者删除列表的标题
  • reduce函数也很简单:所有映射作业的列表都集中在一起,可能必须写回磁盘
  • 当所有N节点返回其输出时,将使用这组新数据重复映射步骤
  • 注意:N最多可以有2000个节点。 简单,但在满足算法的终止条件之前,可能需要多达1000次递归


    我的问题是这个工作适合Hadoop吗?如果没有,我的选择是什么?

    Q&D,但我建议您阅读MongoDB和Hadoop的比较:


    如果不知道更多,很难说。你可能想两种都试试。发布你的结果,如果你这样做

    Hadoop的主要优势在于它能够在大量机器上透明地分配工作。为了充分受益于Hadoop,您的应用程序必须具备以下三个特点:

  • 处理大量数据(分布在机器集群中的数据)——这些数据不可能存储在一台机器上
  • 数据可并行化(即原始数据块可以独立于其他数据块进行操作)
  • 应用程序试图解决的问题非常适合MapReduce(散射-聚集)模型
  • 在这三个特性中,您的应用程序似乎只有最后两个特性(观察到您正试图递归地使用分散-聚集过程——这意味着大量的作业——等于递归深度;请参见最后一段为什么这可能不适合hadoop)

    考虑到您试图处理的数据量,我看不出有任何理由不在一台机器上完全在内存中进行处理。如果您认为可以从并行处理少量数据中获益,我建议您将重点放在多核处理上,而不是分布式数据密集型处理上。当然,使用网络集群的处理能力很有诱惑力,但这是有代价的:主要是网络通信带来的时间效率低下(网络是hadoop集群中最有竞争力的资源)通过I/O。在非常适合Hadoop框架的场景中,这些低效可以忽略,因为通过分发数据和相关数据工作获得的效率


    正如我所见,你需要1000份工作。所有这些作业的设置和清理对于您的场景来说都是不必要的开销。而且,在我看来,网络传输的开销是不必要的。

    递归算法在分布式系统中很难实现,因为它们会导致快速饥饿。任何为其工作的中间件都需要支持分布式延续,即在不占用调用方资源(如线程)的情况下进行“递归”调用的能力

    是一种本机支持分布式延续的产品

    分布式延续的石蕊测试:尝试使用递归调用在分布式上下文中开发一个朴素的斐波那契实现。下面是使用continuations实现此功能的GridGain


    希望有帮助。

    您是否正在尝试对大量列表执行操作,其中对于每个列表,删除满足某个谓词的最长前缀项,并返回列表的剩余尾部?如果是这样的话,我会在一个MapReduce作业中执行这个操作,在映射器中的一个循环中执行dropWhile操作。这是一个优化问题,每个映射作业解决一个较小的优化问题。reduce步骤结合了所有这些较小优化问题的结果,并重复该过程。您的观察是正确的,切中要害。问题是,N个作业中的每一个都需要大量递归,即生成N个作业,让所有作业完成后,获取输出数据并重复可能的M^2个递归,M是每个列表的平均长度。在一个m/c上,这是不可行的。