【发布时间】:2018-02-10 02:35:50
【问题描述】:
我有一个 RMI 集群。每个 RMI 服务器都有一个 Spark 上下文。 有没有办法在不同的 Spark 上下文之间共享一个 RDD?
【问题讨论】:
标签: apache-spark rdd
我有一个 RMI 集群。每个 RMI 服务器都有一个 Spark 上下文。 有没有办法在不同的 Spark 上下文之间共享一个 RDD?
【问题讨论】:
标签: apache-spark rdd
正如 Daniel Darabos 已经说过的那样,这是不可能的。 Spark 中的每个分布式对象都绑定到用于创建它的特定上下文(SparkContext 在 RDD 的情况下,SQLContext 在DataFrame 数据集的情况下)。如果您想在应用程序之间共享对象,您必须使用共享上下文(例如参见spark-jobserver、Livy 或Apache Zeppelin)。因为RDD 或DataFrame 只是一个小的本地对象,所以真的没有太多可分享的。
共享数据是一个完全不同的问题。您可以使用专门的内存缓存 (Apache Ignite) 或分布式内存文件系统(如 Alluxio - 前 Tachyon)来最大限度地减少在应用程序之间切换时的延迟,但您无法真正避免它。
【讨论】:
不,RDD 绑定到单个SparkContext。一般的想法是,你有一个 Spark 集群和一个告诉集群做什么的驱动程序。此驱动程序将拥有SparkContext 并启动 RDD 上的操作。
如果您只想将 RDD 从一个驱动程序移动到另一个,解决方案是在第一个驱动程序中将其写入磁盘 (S3/HDFS/...),然后在另一个驱动程序中从磁盘加载它。
【讨论】:
在我的理解中,你不能原生地,RDD 不是数据,而是一种通过原始数据的转换/过滤器创建数据的方法。
另一个想法是共享最终数据。因此,您将 RDD 存储在数据存储中,例如: - HDFS(镶木地板文件等) - 弹性搜索 - Apache Ignite(内存中)
我想你会喜欢 Apache Ignite:https://ignite.apache.org/features/igniterdd.html
Apache Ignite 提供了 Spark RDD 抽象的实现 这允许在多个 Spark 之间轻松共享内存中的状态 作业,在同一应用程序内或不同 Spark 之间 应用程序。
IgniteRDD 的实现是作为分布式 Ignite 缓存的视图, 可以部署在 Spark 作业执行过程中, 或在 Spark 工作器上,或在其自己的集群中。
(我让您挖掘他们的文档以找到您要查找的内容。)
【讨论】: