2017-02-13 209 views
0

我们的应用程序使用长时间运行的spark上下文(就像spark RPEL),以使用户能够在线执行任务。我们大量使用火花广播来处理尺寸数据。与通常的做法一样,我们广播维度表并使用数据帧API将事实表与其他维度表连接起来。其中一个维度表是相当大的,有大约10万条记录和15MB大小的内存(kyro序列化只是少数MB)。Spark Sparking Alternatives

我们看到,非标准化数据帧上的每个火花JOB都会导致所有维度一遍又一遍地播出。每次广播时,较大的表格需要7秒。我们正试图找到一种方法,让维度表在每个环境生命周期内只播放一次。我们尝试了sqlcontext和sparkcontext广播。

是否有任何其他替代方案来激发广播?或者是有降低数据框的内存占用量的方式(压缩/系列化等 - - 屈勒后仍是15MB :()?

+0

这些表何时可用?他们是在计划开始时创建的,并在计划期间发送给所有工作人员? –

+0

这些是封面下的配置单元表,维度表在程序启动过程中进行广播,用户在初始加载后继续处理数据。 – Krish

回答

0

最后,我们能够找到一个权宜之计解决方案,直到火花支持RDD或优先RDD在更高版本中锁定。即使在v2.1.0中,这显然也没有解决。

该解决方案依赖于RDD mapPartitions,下面是该方法

  • 收集维表中的记录如使用火花上下文键 - 值对和广播的映射图的简要概述。您可以使用RDD.keyBy
  • 使用RDD mapPartitions方法映射事实行。 对于每个事实行mapParitions
    • 收集事实行中的维ID和查找的维度记录
    • 由事实非规范化维度IDS 表产生了新的事实行
0

可能的替代

我们使用Iginite火花整合加载大量的数据在工作的开始和继续根据需要变异。

在嵌入式模式下,可以启动点燃星火方面的引导和最终杀死。

你可以阅读更多关于它在这里。

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

+1

您能否回顾一下您的回复?似乎没有回答我的问题。 – Krish