要创建多少个Spark Session?

时间:2018-09-19 16:19:04

标签: apache-spark pyspark

我们正在pyspark中构建数据摄取框架。 第一步是使用我们的应用名称获取/创建sparksession。 dataLoader.py 的结构概述如下。

spark = SparkSession \
            .builder \
            .appName('POC') \
            .enableHiveSupport() \
            .getOrCreate()
 #create data frame from file
 #process file 

如果我必须同时执行此 dataLoader.py 来加载不同的文件,那么具有相同的spark会话会引起问题吗? 我是否必须为每次摄取创建一个单独的启动会话?

4 个答案:

答案 0 :(得分:1)

否,您不会创建多个Spark会话。每个Spark应用程序只能创建一次Spark会话。 Spark不支持此操作,如果在同一个Spark作业中使用多个Spark会话,则作业可能会失败。这是SPARK-2243,spark已关闭票证并表示无法修复。

如果您想使用dataLoader.py加载其他文件,则有2个选项

  1. 依次加载和处理文件。在这里,您一次加载一个文件;将其保存到数据框并处理该数据框。

  2. 为不同的文件创建不同的dataLoader.py脚本,并并行运行每个spark作业。这里每个spark作业都有其自己的sparkSession。

答案 1 :(得分:0)

每个spark作业都是独立的,每个JVM只能有一个SparkSession(和SparkContext)实例。您将无法创建多个会话实例。

答案 2 :(得分:0)

您想为每个文件创建一个新的spark应用程序,因为每个spark应用程序将具有1个对应的spark会话,因此肯定可以,但是(通常)不建议这样做。您可以使用同一个spark会话加载多个文件通常是首选对象。

答案 3 :(得分:0)

另一种选择是一次创建一个Spark会话,在几个线程之间共享它,并启用FAIR作业调度。每个线程将执行一个单独的火花作业,即在数据帧上调用collect或其他操作。最佳线程数取决于您的工作复杂性和群集的大小。如果作业太少,则集群可能会负载不足并浪费其资源。如果线程过多,群集将饱和,一些作业将处于空闲状态,并等待执行程序释放。