Apache Spark中的非线性(DAG)ML管道

时间:2016-05-31 09:19:32

标签: apache-spark apache-spark-mllib apache-spark-ml

我已经设置了一个简单的Spark-ML应用程序,我有一个独立的变换器管道,可以将列添加到原始数据的数据框中。由于变压器不看彼此的输出,我希望我可以在非线性(DAG)管道中并行运行它们。我可以找到关于此功能的所有内容来自the Spark ML-Guide

  

只要数据流动,就可以创建非线性管道   图形形成有向无环图(DAG)。这个图表目前是   基于输入和输出列名隐式指定   每个阶段(通常指定为参数)。如果管道形成   一个DAG,然后必须按照拓扑顺序指定各个阶段。

我对段落的理解是,如果我为每个变换器设置inputCol(s),outputCol参数并在创建管道时以拓扑顺序指定阶段,那么引擎将使用该信息来构建执行DAG s.t.一旦输入就绪,DAG的各个阶段就可以运行。

有关此问题的一些问题:

  • 我的理解是否正确?
  • 如果其中一个阶段/变换器我没有指定输出列(例如,舞台只过滤某些行),会发生什么?是否会假设为DAG创建目的,阶段正在更改所有列,以便所有后续阶段都应该等待它?
  • 同样,如果其中一个阶段我没有指定inputCol,会发生什么?舞台是否会等到所有前一阶段都完成?
  • 似乎我可以指定多个输入列但只能指定一个输出列。如果变换器向数据帧添加两列(Spark本身没有问题)会发生什么?有没有办法让DAG创建引擎了解它?

1 个答案:

答案 0 :(得分:6)

  

我的理解是否正确?

不完全是。因为阶段是以拓扑顺序提供的,所以您需要做的就是以正确的顺序遍历图表,从左到右应用PipelineStages。这就是你致电PipelineTransform时会发生什么。

阶段的顺序遍历两次:

  

同样,如果其中一个阶段我没有指定inputCol(s)会发生什么?

几乎没什么有趣的。由于阶段是按顺序应用的,并且在实际转换开始之前,给定Transformer使用其transformSchema方法应用了唯一的模式验证,因此它将作为任何其他阶段进行处理。

  

如果变换器向数据帧添加两列

,会发生什么

与上述相同。只要它为后续阶段生成有效的输入模式,它就与任何其他Transformer没有区别。

  变形金刚不看彼此的输出我希望我能并行运行它们

理论上,您可以尝试构建一个自定义复合变换器,它封装了多个不同的变换,但唯一可以独立执行并从此类操作中受益的部分是模型拟合。在一天结束时,您必须返回一个可以被下游阶段使用的单个转换DataFrame,并且实际转换最有可能被安排为单个数据扫描。

如果真的值得付出努力,问题仍然存在。虽然可以同时执行多个作业,但如果可用资源的数量与处理单个作业所需的工作量相比相对较高,则它仅提供一些优势。它通常需要一些低级别管理(分区数量,shuffle分区数量),这不是Spark SQL的最强功能。