【问题标题】:Reuse Spark session across multiple Spark jobs跨多个 Spark 作业重用 Spark 会话
【发布时间】:2019-12-31 01:09:41
【问题描述】:

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

是否可以只创建一次 Spark 会话并在多个作业中重复使用相同的会话?

【问题讨论】:

  • 重用 spark session 对象...

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


【解决方案1】:

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

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

一般来说,长时间运行的 spark 会话主要适用于原型设计、故障排除和调试目的,例如可以在 spark-shell 或任何其他交互式开发环境中利用单个 spark 会话,例如 Zeppelin;但是,据我所知,spark-submit 不是。

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

希望这会有所帮助

【讨论】:

    【解决方案2】:

    您可以提交一次您的工作,换句话说,只需 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 会话的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 2020-02-18
      • 1970-01-01
      • 2014-07-22
      相关资源
      最近更新 更多