Spark广播替代品

时间:2017-02-13 23:51:38

标签: apache-spark spark-dataframe

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

我们看到,非规范化数据帧上的每个火花JOB都会导致所有维度一次又一次地被广播。每次广播时,较大的桌子需要约7秒。我们正试图找到一种方法,使维度表在每个上下文生命周期中仅播放一次。我们尝试了sqlcontext和sparkcontext广播。

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

2 个答案:

答案 0 :(得分:0)

可能的替代方案

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

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

您可以在此处详细了解。

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

答案 1 :(得分:0)

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

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

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