如何做并行管道?

时间:2016-03-30 10:18:29

标签: scala apache-spark dataflow apache-spark-ml

我在Spark v.1.6.0中构建了一个scala应用程序,它实际上结合了各种功能。我有用于扫描某些条目的数据帧的代码,我有在数据帧上执行某些计算的代码,我有用于创建输出的代码等。

目前组件是“静态”组合的,即在我的代码中我调用组件X进行计算的代码,我获取结果数据并调用组件{{1}的方法将数据作为输入。

我想让这个更灵活,让用户只需指定一个管道(可能是一个具有并行执行的管道)。我认为工作流程相当小而简单,如下图所示:

exemplary workflow

但是,我不知道如何最好地解决这个问题。

  • 我可以自己构建整个管道逻辑,这可能会导致相当多的工作,也可能会出现一些错误......
  • 我已经看到Apache Spark在ML包中附带了一个Y类,但是,如果我理解正确的话,它不支持并行执行(在示例中,两个ParquetReader可以读取和处理数据)同时)
  • 显然Luigi project可能正是这样做的(但是,它在页面上说Luigi用于长时间运行的工作流程,而我只需要短时间运行的工作流程; Luigi可能有点矫枉过正?)?

您建议在Spark中构建工作/数据流吗?

1 个答案:

答案 0 :(得分:1)

我建议使用Spark的MLlib管道功能,你所描述的听起来很合适。关于它的一个好处是它允许Spark以一种可能比你更聪明的方式为你优化流量。

您提到它无法并行读取两个Parquet文件,但它可以以分布式方式读取每个单独的文件。因此,不是让N / 2个节点分别处理每个文件,而是让N个节点按顺序处理它们,我期望给你一个类似的运行时,特别是如果映射到y-c是1-到1。基本上,您不必担心Spark未充分利用您的资源(如果您的数据已正确分区)。

但事实上事情甚至可能更好,因为Spark在优化流程方面比你更聪明。需要记住的一件重要事情是,Spark可能无法完全按照您定义它们的方式和单独步骤执行操作:当您告诉它计算y-c时,它实际上并没有立即执行此操作。它是懒惰的(以一种好的方式!)等待,直到你建立了整个流程并向它寻求答案,此时它分析流程,应用优化(例如,一种可能性是它可以找出它没有必要读取和处理一个或两个Parquet文件的大块,特别是partition discovery),然后才执行最终计划。

相关问题