我大约有10个Spark作业,每个作业都会进行一些转换并将数据加载到数据库中。必须为每个作业分别打开和关闭Spark会话,并在每次初始化消耗时间时关闭它。
是否可以仅创建一次Spark会话,然后在多个作业中重复使用同一会话?
答案 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会话。