我们的应用程序使用长时间运行的Spark上下文(就像spark RPEL一样),使用户能够在线执行任务。我们大量使用火花广播来处理尺寸数据。与通常的做法一样,我们广播维度表并使用数据框API将事实表与其他维度表连接起来。其中一个维度表非常大,在内存中有大约100k记录和15MB大小(kyro序列化只有几MB)。
我们看到,非规范化数据帧上的每个火花JOB都会导致所有维度一次又一次地被广播。每次广播时,较大的桌子需要约7秒。我们正试图找到一种方法,使维度表在每个上下文生命周期中仅播放一次。我们尝试了sqlcontext和sparkcontext广播。
火花广播还有其他选择吗?或者有没有办法减少数据帧的内存占用(压缩/序列化等等 - 后kyro仍然是15MB :()?
答案 0 :(得分:0)
可能的替代方案
我们使用Iginite spark集成在作业开始时加载大量数据,并根据需要继续进行变异。
在嵌入模式下,您可以在Spark上下文启动时开始点燃并最终终止。
您可以在此处详细了解。
答案 1 :(得分:0)
最后,我们能够找到一个权宜之计解决方案,直到火花支持固定RDD或更好的RDD在更高版本中。即使在v2.1.0中,这显然也没有得到解决。
解决方案依赖于RDD mapPartitions,下面是方法的简要总结