Scala 如何仅在需要时启动spark会话

Scala 如何仅在需要时启动spark会话,scala,apache-spark,Scala,Apache Spark,我对spark是个新手。我有一个案例,我不需要执行者和其他的基础设施,直到满足一个条件 def main(args: Array[String]) { try { val request = args(0).toString // Get the spark session val spark = getSparkSession() log.info("Running etl Job") // Pipeline builde

我对spark是个新手。我有一个案例,我不需要执行者和其他的基础设施,直到满足一个条件

def main(args: Array[String]) {
    try {
      val request = args(0).toString


      // Get the spark session
      val spark = getSparkSession()
      log.info("Running etl Job")
      // Pipeline builder
      val pipeline = new PipelineBuilder().build(request)
      pipeline.execute(spark)
      spark.stop()
    } catch {
      case e: Exception => {
        throw new RuntimeException("Failed to successfully run", e)
      }
    }
  }
上面的代码创建一个spark会话并执行一个ETL管道。 然而,我有一个要求,我只需要启动管道,如果基于一个条件。在下面的代码中,我只想在条件为true时启动sparksession

def main(args: Array[String]) {
    try {
      val request = args(0).toString
        if(condition) {
          val spark = getSparkSession()
          log.info("Running etl Job")
          // Pipeline builder
          val pipeline = new PipelineBuilder().build(request)
          pipeline.execute(spark)
          spark.stop()
        } else {
          // DO nothing
        }
    } catch {
      case e: Exception => {
        throw new RuntimeException("Failed to successfully run", e)
      }
    }
  }

这是否确保在条件为假时不会启动sparksession,也不会启动执行器?如果没有,还有其他方法解决这个问题吗?

您可以在scala中使用惰性求值。 在getSparkSession()函数中定义

lazy val spark: SparkSession = ....
根据wikipedia的说法,“惰性计算是一种计算策略,它会延迟表达式的计算,直到需要它的值为止”

懒散评估的几点好处是

  • 延迟计算有助于解决循环依赖关系
  • 它可以通过在需要时才进行计算来提高性能,如果不使用计算,可能根本不会进行计算
  • 它可以将繁重的操作推迟到需要时,从而延长应用程序的响应时间

  • 请参阅了解更多信息。

    即使您启动了spark会话,直到您尚未触发操作,数据仍不会进行实际操作。对。但是一旦我们启动了spark会话,它就不会创建所需的资源吗?这是一个分布式系统。。在触发操作之前不会分配任何内容,spark是懒惰的。。这是核心特性。它将尝试构建一个完整的执行图,尝试优化,然后应用操作,因此不必太担心会话、操作和转换,因为@Pavel所说的对,但为了回答您的问题,如果条件为false,代码将不会被称为hanks@Pavel and Pedro。这很有帮助