跨节点分发 RDD 或数据帧的副本
Posted
技术标签:
【中文标题】跨节点分发 RDD 或数据帧的副本【英文标题】:Distributing replicas of an RDD or dataframe across nodes 【发布时间】:2016-02-10 20:29:32 【问题描述】:我正在尝试构建一个组件,它可以将大型数据集动态连接到几个小得多的数据集。我已经将大小数据集作为数据帧保存在内存中。随着用户输入的出现,我需要选择大型数据集的一个子集,并使用来自较小数据集的一些信息来丰富它。
不幸的是,这些动态连接被证明是昂贵的,大约是几分钟而不是几秒钟。我想探索的一条途径是将较小数据集的副本运送到集群上的所有节点,以便在每个节点上同时进行连接,并在最后收集结果。但是,我不确定执行此操作的最佳方法。
Broadcast variables 似乎是跨节点传送数据以进行计算的唯一方法。但是,Spark 文档并没有过多地说明适当的用例。我上面描述的内容是否适合广播变量?是否可以接受甚至可以使用数据帧作为广播变量?是否有其他更好的途径可以让我快速加入此类数据框?
【问题讨论】:
是否可以接受甚至可以使用数据帧作为广播变量 - 参见例如***.com/q/35235450/1560062。还有其他方法可以处理参考数据,包括文件分发或访问外部系统,但这对 SO 来说不是一个好问题。 谢谢,这很有帮助。您是否知道任何资源可用于了解有关在 Spark 上处理参考数据的更多信息? 【参考方案1】:这是否真的更快取决于您的小数据集的大小以及您想要更改它们的频率。
在任何情况下,您都不能广播 Spark DataFrame
,而是需要将小数据集作为普通变量/结构进行广播。我还建议在mapPartitions
中尝试join
而不是普通的map
,看看这是否会加快速度。
另外:您将无法在工作例程中使用 Spark 的 join
,但必须定义自己的例程或使用可以处理数据集类型的库的 join
例程。
【讨论】:
以上是关于跨节点分发 RDD 或数据帧的副本的主要内容,如果未能解决你的问题,请参考以下文章
如何在不启动所有应用程序的情况下跨节点分发应用程序作为分布式握手的一部分
sql server 镜像 主节点异常 镜像节点会提供服务吗