【问题标题】:In Spark Streaming, can we store data (hashmap) in Executor memory在 Spark Streaming 中,我们可以将数据(hashmap)存储在 Executor 内存中吗
【发布时间】:2016-08-22 15:08:25
【问题描述】:

我想在 Spark Executors 内存(长期缓存)中维护一个缓存(HashMap),以便在执行器上运行的所有任务(在不同时间)都可以在那里进行查找,也可以更新缓存。

这在 Spark 流中可行吗?

【问题讨论】:

  • 我的要求是我有一个远程键值数据存储(小 - 总大小约 50MB)。此数据可能会在一小时内更新一次,一小时内只需更改一次,例如添加、删除或更改新的键值对。我的 Spark Streaming 工作需要非常频繁地查找这家商店。所以我想将此键值数据存储在节点/执行器缓存中,以便始终在该执行器上运行的所有作业都可以查找此数据并在 10 分钟内刷新一次。有办法吗?

标签: caching apache-spark hashmap streaming executor


【解决方案1】:

我不确定是否有办法将自定义数据结构永久存储在执行程序上。我的建议是使用一些外部缓存系统(在某些情况下,例如 Redis、Memcached 甚至 ZooKeeper)。您可以使用foreachPartitionmapPartitions 等方法进一步连接到该系统,同时处理 RDD/DataFrame 以将连接数减少到每个分区 1 个连接。

这会起作用的原因是,Redis 和 Memcached 都是内存存储,因此不会有将数据溢出到磁盘的开销。

在执行器之间分配某些状态的另外两种方法是累加器和广播变量。对于累加器,所有执行程序都可以写入,但读取只能由驱动程序执行。对于广播变量,您只需在驱动程序上编写一次,然后将其作为只读数据结构分发给执行程序。这两种情况都不适合您,因此所描述的解决方案是我在这里看到的唯一可能的方式。

【讨论】:

  • 正如之前有人建议的那样(我不知道那个帖子是怎么被删除的)我们可以使用“updateStateByKey”来处理状态是键值哈希图的情况。我所知道的是 Spark 流自动保存这些数据,并且可以跨批次使用。这可行吗?长寿?
  • 当然你可以使用updateStateByKey甚至mapWithState。但这是流计算中的一个特定步骤。但为了做到这一点,您必须将流转换为键值对流。这是完全可行且长期存在的。这种方法的主要思想是状态在不同的流批次之间共享,而不是在执行程序之间共享。此状态更新需要您的流的额外步骤,并且不能作为另一个操作的副作用执行(与我描述的方法不同)。但也许它对你有用。取决于特定的用例。
  • 任何指向使用 updateStateByKey 或 mapWithState 的代码的指针,以便我清楚地理解这一点???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2019-09-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多