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

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

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

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

【问题讨论】:

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

标签: apache-spark spark-dataframe


【解决方案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 来生成新的事实行 表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2017-12-10
    • 2018-12-10
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多