我们正在pyspark中构建数据摄取框架。 第一步是使用我们的应用名称获取/创建sparksession。 dataLoader.py 的结构概述如下。
spark = SparkSession \
.builder \
.appName('POC') \
.enableHiveSupport() \
.getOrCreate()
#create data frame from file
#process file
如果我必须同时执行此 dataLoader.py 来加载不同的文件,那么具有相同的spark会话会引起问题吗? 我是否必须为每次摄取创建一个单独的启动会话?
答案 0 :(得分:1)
否,您不会创建多个Spark会话。每个Spark应用程序只能创建一次Spark会话。 Spark不支持此操作,如果在同一个Spark作业中使用多个Spark会话,则作业可能会失败。这是SPARK-2243,spark已关闭票证并表示无法修复。
如果您想使用dataLoader.py
加载其他文件,则有2个选项
依次加载和处理文件。在这里,您一次加载一个文件;将其保存到数据框并处理该数据框。
为不同的文件创建不同的dataLoader.py
脚本,并并行运行每个spark作业。这里每个spark作业都有其自己的sparkSession。
答案 1 :(得分:0)
每个spark作业都是独立的,每个JVM只能有一个SparkSession(和SparkContext)实例。您将无法创建多个会话实例。
答案 2 :(得分:0)
您想为每个文件创建一个新的spark应用程序,因为每个spark应用程序将具有1个对应的spark会话,因此肯定可以,但是(通常)不建议这样做。您可以使用同一个spark会话加载多个文件通常是首选对象。
答案 3 :(得分:0)
另一种选择是一次创建一个Spark会话,在几个线程之间共享它,并启用FAIR作业调度。每个线程将执行一个单独的火花作业,即在数据帧上调用collect或其他操作。最佳线程数取决于您的工作复杂性和群集的大小。如果作业太少,则集群可能会负载不足并浪费其资源。如果线程过多,群集将饱和,一些作业将处于空闲状态,并等待执行程序释放。