首页 > 解决方案 > 如何有效地广播 RDD 的内容

问题描述

所以我需要将一些相关内容从 RDD 广播到所有工作节点,我正在努力提高效率。

更具体地说,一些RDD是在执行过程中动态创建的,为了将它的一些内容广播到所有worker节点,一个明显的解决方案是一个一个地遍历它的元素,并创建一个list/vector/hashmap来保存遍历时需要的内容,然后将这个数据结构广播到集群。

这似乎根本不是一个好的解决方案,因为 RDD 可能很大并且它已经分布,遍历它并根据遍历结果创建一些数组/列表将非常慢。

那么对于这种情况,什么是更好的解决方案或最佳实践呢?在 RDD 上运行 SQL 查询(将其更改为 dataFrame 之后)以获取所需的内容,然后将查询结果广播到所有工作节点是否是个好主意?

提前谢谢你的帮助!

阅读 Varslavans 的回答后添加以下内容:

RDD 是动态创建的,它具有以下内容:

[(1,1), (2,5), (3,5), (4,7), (5,1), (6,3), (7,2), (8,2), (9,3), (10,3), (11,3),  ...... ]

所以这个 RDD 包含键值对。我们想要的是收集所有值> 3的对。因此将收集对(2,5),(3,5),(4,7),...。现在,一旦我们收集了所有这些对,我们希望广播它们,以便所有工作节点都拥有这些对。

听起来我们应该collect()在 RDD 上使用然后广播……至少这是目前最好的解决方案。

再次感谢!

标签: apache-spark

解决方案


首先 - 你不需要遍历 RDD 来获取所有数据。有API - collect()

第二:广播不等于分布式。

  • 在广播中 - 您拥有每个节点上的所有数据
  • 在分布式中 - 每个节点上都有整体的不同部分

RDD是按其性质分布的。

第三:要获得所需的内容,您可以使用RDD API或将其转换为 DataFrame 并使用 SQL 查询。这取决于您拥有的数据。无论如何,结果的内容将是 RDD 或 DataFrame,它也将被分发。因此,如果您需要本地数据 - 您collect()就可以了。

顺便说一句,从您的问题来看,您无法理解您到底想要做什么,看起来您需要阅读 Spark 基础知识。这会给你很多答案:)


推荐阅读