scala - 如何提交运行时生成的Spark作业?

标签 scala apache-spark playframework sbt

因此,对于我的用例,我需要在运行时创建和提交 Spark 流作业。做了一些谷歌搜索后,我认为没有先创建 jar 文件就可以执行 Spark 作业的简单方法...

我的想法是对 Spark/Scala 代码进行类似构建器的抽象,在运行时通过注入(inject)相关对象对其进行配置,然后将该抽象转换为实际的原始 Scala 代码并将其写入磁盘。

然后我会使用 ProcessBuilder 或其他工具在该 Scala 代码上运行 sbt 包并以这种方式构建 jar。然后我应该能够使用 SparkLauncher 或再次通过运行 spark-submit 命令的 ProcessBuilder 以编程方式提交作业。

老实说,这一切看起来有点愚蠢。对于以编程方式提交作业,有没有人有更好的想法?


使用 SparkLauncher 的缺点是我必须预先打包一个巨大的 Spark 作业 jar,其中包含它可能执行的所有功能。然后我可以使用 SparkLauncher 提交它并为其提供相关的 -D 参数以在运行时修复特定功能。

最佳答案

我曾经有一个客户有过这样的需求,我创建了一个通用的 Spark 应用程序,它接受可以指定低级别配置细节(如 ML 算法)的参数,效果很好。对于那个通用的 Spark 应用程序,您将使用 SparkLauncher提交执行(您将在其中指定主 URL 和特定于部署的参数)。

实际上,如果您使用 Spark MLlib 和 Spark 支持的不同 ML 算法,那么从通用 Spark 应用程序中抽象出来的事情就很容易,因为您可以编写一个 ML 管道来进行预处理并选择估算器(算法)名称,可能是类名。

您还可以将预处理部分(Spark SQL/ML 转换器)和主要 ML 管道拆分为两个独立的类,主要通用 Spark 应用程序将使用这些类。

参见 Spark MLlib 的 ML Pipelines在官方文档中。


既然你担心...

The downside of using SparkLauncher is that I'll have to prepackage a huge Spark job jar with all the functionality that it can possibly do.

我怀疑这是个问题。如果不首先查看需求,就很难说您的 Spark 应用程序 jar 会有多大,但如果是关于 Spark MLlib,我相信 ML Pipeline 功能会将线路减少到最少。

贾尼诺

您还可以考虑像 Spark SQL 在 WholeStageCodegenExec 中那样动态生成代码和其他物理运算符(operator)。

Spark SQL uses Janino compiler for code generation因此回顾 Spark 的这一部分将向您展示另一种(非常低级的)在运行时进行代码编译的方法,这将为您提供最大的灵 active 。

缺点是审查或测试代码以生成最终代码可能需要大量工作,很少有人会帮助您。


谈到这个不纯且非常命令式的 Janino 编译器世界,引发了使用高阶抽象(如无标记最终或类似的)的想法。 我跑题了

关于scala - 如何提交运行时生成的Spark作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47481554/

相关文章:

Scala工具和库的愿望 list

apache-spark - (gcloud.dataproc.batches.submit.spark) 无法识别的参数 : --subnetwork=

hadoop - mapreduce split和spark partition的区别

scala - 运行 AKKA 远程 Actor 时出现 "Dead Letters encountered"错误

java - Scala 遗传算法 (GA) 库中的模拟二进制交叉 (SBX) 交叉运算符

scala - Scalaz 中 *> 和 <* 的用途是什么

scala - 如何使用apache spark在mysql数据库中创建表

web-services - 使用 SOAP 网络服务 Play 框架 2.1.2

javascript - 用于 backbone.js 验证的自定义验证器

scala - 如何使用 play 2.4 和激活器指定配置文件