如何分享全球火花会议?

时间:2019-07-19 04:34:32

标签: apache-spark

实际上,我正在从事一个项目,该项目包括一个由多个任务组成的工作流,而一个任务由多个组件组成。 例如 在join中,我们需要4个组件。 2用于输入(考虑两个表的连接),1用于连接逻辑,1用于输出(写回hdfs)。 这是一项任务。 ,类似“排序”可能是另一项任务。

假设一个工作流程包含这两个任务,并且它们是相互链接的 执行join之后,我们在排序任务中使用join的输出。 但是“加入”和“排序”分别调用“火花会话”。

因此流程类似于,使用spark提交创建了一个用于连接的spark会话,输出保存在hdfs中,并且当前的spark会话已关闭。对于排序,将使用spark提交创建另一个会话,并通过join任务将存储在hdfs的输出提取以进行排序。

但是问题是从hdfs获取数据会产生开销。 那么我有什么办法可以在两个spark-submit之间共享一个会话来执行不同的任务。这样我就不会从连接中丢失结果数据帧,并且可以直接在下一个Spark提交排序中使用它。

所以基本上我有多个与不同任务相关联的spark-submit。但是我想将结果保留在内存中的数据帧中,这样就不必保留它,而是可以将其用于另一个链接的任务(spark-submit)

1 个答案:

答案 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/")