Scala 如何仅在需要时启动spark会话
我对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
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。这很有帮助