如何在两个Spark上下文之间共享Spark RDD?

8
我有一个RMI集群,每个RMI服务器都有一个Spark上下文。是否有办法在不同的Spark上下文间共享RDD?
3个回答

15

正如Daniel Darabos所说的那样,这是不可能的。在Spark中,每个分布式对象都绑定到特定的上下文中,该上下文已用于创建它(对于RDD来说是SparkContext,对于DataFrame数据集来说是SQLContext)。如果您想在应用程序之间共享对象,则必须使用共享上下文(例如spark-jobserverLivyApache Zeppelin)。 由于RDDDataFrame只是一个小的本地对象,因此真正要共享的内容很少。

分享数据是一个完全不同的问题。您可以使用专门的内存缓存(如Apache Ignite)或分布式内存文件系统(如Alluxio - 前身为Tachyon)来尽量减少在应用程序之间切换时的延迟,但您无法真正避免它。


3
不,RDD 与单个 SparkContext 相关联。一般的想法是你有一个 Spark 集群和一个驱动程序告诉集群该怎么做。这个驱动程序会有 SparkContext 并为 RDD 开始操作。
如果你只想在不同的驱动程序之间移动一个 RDD,解决方法是在第一个驱动程序中将其写入磁盘(S3/HDFS/...),并在另一个驱动程序中从磁盘加载它。

2
根据我的理解,你无法直接处理RDD数据,而是通过转换/过滤原始数据的方式来创建数据。另一个想法是共享最终数据。因此,您可以将RDD存储在数据存储中,例如: - HDFS(parquet文件等) - Elasticsearch - Apache Ignite(内存中)
我认为您会喜欢Apache Ignite:https://ignite.apache.org/features/igniterdd.html Apache Ignite提供了Spark RDD抽象的实现,可以轻松地在多个Spark作业之间共享内存中的状态,无论是在同一应用程序内还是在不同的Spark应用程序之间。
IgniteRDD是作为对分布式Ignite缓存的视图实现的,可以部署在执行Spark作业的进程中、Spark工作节点上或它自己的集群中。(请查阅他们的文档以找到您需要的内容。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接