实际上,我正在从事一个项目,该项目包括一个由多个任务组成的工作流,而一个任务由多个组件组成。 例如 在join中,我们需要4个组件。 2用于输入(考虑两个表的连接),1用于连接逻辑,1用于输出(写回hdfs)。 这是一项任务。 ,类似“排序”可能是另一项任务。
假设一个工作流程包含这两个任务,并且它们是相互链接的 执行join之后,我们在排序任务中使用join的输出。 但是“加入”和“排序”分别调用“火花会话”。
因此流程类似于,使用spark提交创建了一个用于连接的spark会话,输出保存在hdfs中,并且当前的spark会话已关闭。对于排序,将使用spark提交创建另一个会话,并通过join任务将存储在hdfs的输出提取以进行排序。
但是问题是从hdfs获取数据会产生开销。 那么我有什么办法可以在两个spark-submit之间共享一个会话来执行不同的任务。这样我就不会从连接中丢失结果数据帧,并且可以直接在下一个Spark提交排序中使用它。
所以基本上我有多个与不同任务相关联的spark-submit。但是我想将结果保留在内存中的数据帧中,这样就不必保留它,而是可以将其用于另一个链接的任务(spark-submit)
答案 0 :(得分:0)
spark会话构建器具有获取或创建SparkSession的功能。
val spark = SparkSession.builder()
.master("local[*]")
.appName("AzuleneTest")
.getOrCreate()
但是阅读您的描述,您最好在两个函数之间传递数据帧(这些函数持有对spark会话的引用)。这样可以避免创建多个spark实例。例如
//This is run within a single spark application
val df1 = spark.read.parquet("s3://bucket/1/")
val df2 = spark.read.parquet("s3://bucket/1/")
val df3 = df1.join(df2,"id")
df3.write.parquet("s3://bucket/3/")