【问题标题】:How to share Spark RDD between 2 Spark contexts?如何在 2 个 Spark 上下文之间共享 Spark RDD?
【发布时间】:2018-02-10 02:35:50
【问题描述】:

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

【问题讨论】:

    标签: apache-spark rdd


    【解决方案1】:

    正如 Daniel Darabos 已经说过的那样,这是不可能的。 Spark 中的每个分布式对象都绑定到用​​于创建它的特定上下文(SparkContext 在 RDD 的情况下,SQLContextDataFrame 数据集的情况下)。如果您想在应用程序之间共享对象,您必须使用共享上下文(例如参见spark-jobserverLivyApache Zeppelin)。因为RDDDataFrame 只是一个小的本地对象,所以真的没有太多可分享的。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        在我的理解中,你不能原生地,RDD 不是数据,而是一种通过原始数据的转换/过滤器​​创建数据的方法。

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

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

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

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

        (我让您挖掘他们的文档以找到您要查找的内容。)

        【讨论】:

          猜你喜欢
          • 2011-07-26
          • 2018-06-01
          • 2018-10-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-07
          • 2022-01-01
          • 1970-01-01
          • 2015-04-15
          相关资源
          最近更新 更多