如何在spark,caching或BlockManager中使用全局变量?

时间:2018-03-07 12:12:13

标签: python apache-spark caching global-variables spark-streaming

我有这个错误与火花流,我需要存储一个全局变量(如计数器)在各种执行程序中使用,只在驱动程序中增加。无法使用 Spark累加器,因为它们具有每个执行程序的本地上下文。我也尝试使用 spark caching ,但它只允许存储整个数据集,而不仅仅是整数变量。 BlockManager 可能是一个很好的解决方案,但是从spark提供的文档中很难理解任何东西。 我希望你能帮忙找到解决方案。

N.B:我在python中使用spark

1 个答案:

答案 0 :(得分:0)

Spark提供了一个称为广播变量的东西来保存缓存数据。 Broadcast变量是只读高速缓存,每个执行者都拥有自己的副本。因此,其他执行程序看不到对其的任何更新。另外,请注意,广播对象不可序列化,并且必须是最终对象。因此,无法更新它。

一些简单的选项可以保存您的缓存数据:

  1. 每次缓存数据更改时,使用新的广播变量重新启动Spark上下文。
  2. 将缓存的数据托管在REST api之后,并通过foreachRDD或forEachPartition查找。

我尝试过的一种对我有效的方法是定期重新广播缓存数据。请在How to weave a periodically changing cached-data with your streaming application上找到我的博客,以获取更多详细信息,在此我进行了演示以进行处理。希望它能为您提供有关如何在Spark中使用变化的缓存数据的观点。