Spark 广播替代方案

Posted

技术标签:

【中文标题】Spark 广播替代方案【英文标题】:Spark Broadcasting Alternatives 【发布时间】:2017-02-13 23:51:37 【问题描述】:

我们的应用程序使用长时间运行的 spark 上下文(就像 spark RPEL)使用户能够在线执行任务。我们大量使用 Spark 广播来处理维度数据。按照惯例,我们广播维度表并使用数据框 API 将事实表与其他维度表连接起来。其中一个维度表非常大,大约有 100k 条记录和 15MB 的内存大小(kyro 序列化只是少了几 MB)。

我们看到,去规范化数据帧上的每个 spark JOB 都会导致所有维度一遍又一遍地广播。每次广播较大的表需要约 7 秒。我们正在尝试找到一种方法,让维度表在每个上下文生命周期中只广播一次。我们尝试了 sqlcontext 和 sparkcontext 广播。

除了 spark 广播还有其他选择吗?或者有没有办法减少数据帧的内存占用(压缩/序列化等 - post-kyro 仍然是 15MB :( )?

【问题讨论】:

什么时候有表?它们是否在程序开始时创建并在程序期间发送给所有工作人员? 这些是隐藏的配置单元表,维度表在程序启动期间广播,用户在初始加载后继续整理数据。 【参考方案1】:

可能的替代方案

我们使用 Iginite spark 集成在工作开始时加载大量数据,并根据需要继续变异。

在嵌入式模式下,您可以在 Spark 上下文启动时启动 ignite 并最终终止。

您可以在此处阅读有关它的更多信息。

https://ignite.apache.org/features/igniterdd.html

【讨论】:

您能否查看您的回复?似乎没有回答我的问题。【参考方案2】:

最后,我们能够找到一个权宜之计的解决方案,直到 spark 支持固定 RDD 或者最好是在更高版本中的 RDD。这显然在 v2.1.0 中也没有解决。

解决方案依赖于RDD mapPartitions,下面是该方法的简要总结

将维度表记录收集为键值对映射并使用 Spark 上下文进行广播。你可以使用 RDD.keyBy 使用 RDD mapPartitions 方法映射事实行。 对于每个事实行 mapParitions 收集事实行中的维度 ID 并查找维度记录 通过非规范化事实中的维度 ID 来生成新的事实行 表

【讨论】:

以上是关于Spark 广播替代方案的主要内容,如果未能解决你的问题,请参考以下文章

Android O:广播限制 PHONE_STATE 替代解决方案

Spark SQL - “包含”功能的替代方案

Redshift REGEXP_SUBSTR 函数的 Spark 替代方案

Spark 结构化流 - 带有水印替代解决方案的 dropDuplicates

Spark SQL 嵌套 JSON 错误“输入时没有可行的替代方案”

为 Spark SQL 寻找 ARRAY_CONTAINS 的替代解决方案