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

时间:2015-01-13 08:30:30

标签: apache-spark rdd

我有一个RMI集群。每个RMI服务器都有一个Spark上下文。 有没有办法在不同的Spark上下文之间共享RDD?

3 个答案:

答案 0 :(得分:15)

正如Daniel Darabos所说,这是不可能的。 Spark中的每个分布式对象都被绑定到用于创建它的特定上下文(在RDD的情况下为SparkContext,在SQLContext数据集的情况下为DataFrame。如果您希望在应用程序之间共享对象,则必须使用共享上下文(例如,请参阅spark-jobserverLivyApache Zeppelin)。由于RDDDataFrame只是一个小的本地对象,因此实际上并没有太多可分享的内容。

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

答案 1 :(得分:3)

不,RDD与单个SparkContext绑定。一般的想法是你有一个Spark集群和一个驱动程序,告诉集群做什么。该驱动程序将具有SparkContext并启动RDD上的操作。

如果您只想将RDD从一个驱动程序移动到另一个驱动程序,解决方案是将其写入第一个驱动程序中的磁盘(S3 / HDFS / ...)并从另一个驱动程序中的磁盘加载。 / p>

答案 2 :(得分:1)

根据我的理解,你本身不能说RDD不是数据,而是通过原始数据的转换/过滤器​​创建数据的方法。

另一个想法是分享最终数据。因此,您将RDD存储在数据存储中,例如: - HDFS(镶木地板文件等..) - Elasticsearch - Apache Ignite(内存中)

我想你会喜欢Apache Ignite:https://ignite.apache.org/features/igniterdd.html

  

Apache Ignite提供了Spark RDD抽象的实现   它允许在多个Spark中轻松共享内存中的状态   工作,在同一个应用程序内或不同的Spark之间   应用

     

IgniteRDD的实现是作为分布式Ignite缓存的视图,   可以在Spark作业执行过程中部署,   或者在Spark工作者或其自己的集群中。

(我让你挖掘他们的文档以找到你要找的东西。)

相关问题