我已经设置了一个简单的Spark-ML应用程序,我有一个独立的变换器管道,可以将列添加到原始数据的数据框中。由于变压器不看彼此的输出,我希望我可以在非线性(DAG)管道中并行运行它们。我可以找到关于此功能的所有内容来自the Spark ML-Guide:
只要数据流动,就可以创建非线性管道 图形形成有向无环图(DAG)。这个图表目前是 基于输入和输出列名隐式指定 每个阶段(通常指定为参数)。如果管道形成 一个DAG,然后必须按照拓扑顺序指定各个阶段。
我对段落的理解是,如果我为每个变换器设置inputCol(s),outputCol参数并在创建管道时以拓扑顺序指定阶段,那么引擎将使用该信息来构建执行DAG s.t.一旦输入就绪,DAG的各个阶段就可以运行。
有关此问题的一些问题:
答案 0 :(得分:6)
我的理解是否正确?
不完全是。因为阶段是以拓扑顺序提供的,所以您需要做的就是以正确的顺序遍历图表,从左到右应用PipelineStages
。这就是你致电PipelineTransform
时会发生什么。
阶段的顺序遍历两次:
transformSchema
which is simply implemented as stages.foldLeft(schema)((cur, stage) => stage.transformSchema(cur))
验证架构。这是执行实际模式验证的部分。 Transformers
并使Estimators
适合实际变换数据。这只是a simple for loop which applies stages sequentially one by one。同样,如果其中一个阶段我没有指定inputCol(s)会发生什么?
几乎没什么有趣的。由于阶段是按顺序应用的,并且在实际转换开始之前,给定Transformer
使用其transformSchema
方法应用了唯一的模式验证,因此它将作为任何其他阶段进行处理。
如果变换器向数据帧添加两列
,会发生什么
与上述相同。只要它为后续阶段生成有效的输入模式,它就与任何其他Transformer
没有区别。
变形金刚不看彼此的输出我希望我能并行运行它们
理论上,您可以尝试构建一个自定义复合变换器,它封装了多个不同的变换,但唯一可以独立执行并从此类操作中受益的部分是模型拟合。在一天结束时,您必须返回一个可以被下游阶段使用的单个转换DataFrame
,并且实际转换最有可能被安排为单个数据扫描。
如果真的值得付出努力,问题仍然存在。虽然可以同时执行多个作业,但如果可用资源的数量与处理单个作业所需的工作量相比相对较高,则它仅提供一些优势。它通常需要一些低级别管理(分区数量,shuffle分区数量),这不是Spark SQL的最强功能。