跨多个Spark作业重用Spark会话

时间:2019-04-15 14:16:02

标签: apache-spark pyspark apache-spark-sql

我大约有10个Spark作业,每个作业都会进行一些转换并将数据加载到数据库中。必须为每个作业分别打开和关闭Spark会话,并在每次初始化消耗时间时关闭它。

是否可以仅创建一次Spark会话,然后在多个作业中重复使用同一会话?

2 个答案:

答案 0 :(得分:1)

从技术上讲,如果使用单个Spark会话,最终将只有一个Spark应用程序,因为您将必须在单个JAR文件中打包并运行多个ETL(提取,转换和加载)。

如果您正在生产集群中运行这些作业,则很可能正在使用spark-submit执行应用程序jar,每次通过Spark提交作业时,该程序都必须经过初始化阶段Master-> client模式下的工作人员。

通常,具有较长运行时间的Spark会话最适合用于原型设计,故障排除和调试目的,例如,可以在spark-shell或任何其他交互式开发环境(如{{3 }};但是据我所知,spark-submit还没有。

总而言之,这里有几个设计/业务问题值得考虑;将多个ETL作业合并在一起是否会生成易于维护,管理和调试的代码?它提供所需的性能提升吗?风险/成本分析等

希望这会有所帮助

答案 1 :(得分:0)

您可以一次提交工作,换句话说,一次提交。在提交的代码中,您可以进行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分钟,那么相比之下,您将不会花费大量时间来创建单独的启动会话。我不用担心每个工作1次火花会议。但是,我将担心是否为每个方法或每个单元测试用例创建了单独的Spark会话,这将保存Spark会话。