我有一个RMI集群。每个RMI服务器都有一个Spark上下文。 有没有办法在不同的Spark上下文之间共享RDD?
答案 0 :(得分:15)
正如Daniel Darabos所说,这是不可能的。 Spark中的每个分布式对象都被绑定到用于创建它的特定上下文(在RDD的情况下为SparkContext
,在SQLContext
数据集的情况下为DataFrame
。如果您希望在应用程序之间共享对象,则必须使用共享上下文(例如,请参阅spark-jobserver
,Livy或Apache Zeppelin)。由于RDD
或DataFrame
只是一个小的本地对象,因此实际上并没有太多可分享的内容。
共享数据是一个完全不同的问题。您可以使用专门的内存缓存(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工作者或其自己的集群中。
(我让你挖掘他们的文档以找到你要找的东西。)