【发布时间】:2019-12-31 01:09:41
【问题描述】:
我有大约 10 个 Spark 作业,每个作业都会进行一些转换并将数据加载到数据库中。 Spark 会话必须为每个作业单独打开并关闭,并且每次初始化都会消耗时间。
是否可以只创建一次 Spark 会话并在多个作业中重复使用相同的会话?
【问题讨论】:
-
重用 spark session 对象...
标签: apache-spark pyspark apache-spark-sql
我有大约 10 个 Spark 作业,每个作业都会进行一些转换并将数据加载到数据库中。 Spark 会话必须为每个作业单独打开并关闭,并且每次初始化都会消耗时间。
是否可以只创建一次 Spark 会话并在多个作业中重复使用相同的会话?
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql
从技术上讲,如果您使用单个 Spark 会话,您最终将拥有一个 Spark 应用程序,因为您必须在单个 JAR 文件中打包和运行多个 ETL(提取、转换和加载)。
如果您在生产集群中运行这些作业,很可能您正在使用spark-submit 来执行您的应用程序jar,每次您通过 Spark Master -> Workers 提交作业时,它都必须经过初始化阶段在client 模式下。
一般来说,长时间运行的 spark 会话主要适用于原型设计、故障排除和调试目的,例如可以在 spark-shell 或任何其他交互式开发环境中利用单个 spark 会话,例如 Zeppelin;但是,据我所知,spark-submit 不是。
总而言之,这里有几个设计/业务问题值得考虑;将多个 ETL 作业合并在一起会生成易于维护、管理和调试的代码吗?它是否提供了所需的性能增益?风险/成本分析 ?等等
希望这会有所帮助
【讨论】:
您可以提交一次您的工作,换句话说,只需 spark-submit 一次。在提交的代码中,您可以有 10 个调用,每个调用都进行一些转换并将数据加载到数据库中。
val spark : SparkSession = SparkSession.builder
.appName("Multiple-jobs")
.master("<cluster name>")
.getOrCreate()
method1()
method2()
def method1():Unit = {
//it will give the same spark session created outside the method.
val spark = SparkSession.builder.getOrCreate()
//work
}
但是,如果这项工作很耗时,比如需要 10 分钟,那么相比之下,您将不会花费大量时间来创建单独的 spark 会话。我不会担心每个工作有 1 个火花会话。但是,如果每个方法或每个单元测试用例创建一个单独的 Spark 会话,我会担心,这就是我将保存 Spark 会话的地方。
【讨论】: