caching - 在Spark Streaming中,我们可以将数据(hashmap)存储在Executor内存中吗

标签 caching apache-spark hashmap streaming executor

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

这在 Spark 流中可能吗?

最佳答案

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

之所以可行,是因为 Redis 和 Memcached 都是内存存储,因此不会有将数据溢出到磁盘的开销。

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

关于caching - 在Spark Streaming中,我们可以将数据(hashmap)存储在Executor内存中吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39083028/

相关文章:

api - 将 HTTP 用于 REST API : automatically cacheable?

r - 在sparklyr中使用spark_apply将加权随机法向量添加到多个DF列

apache-spark - Apache Spark 选择所有行

java - 不明白这个 HashMap 增量语法

c - 如何避免读取基准中的缓存效应

java - 通过 setter 或服务使缓存失效?

php - 如何在 Symfony 2.4 中使用缓存 id 和缓存生命周期选项缓存学说 "findOneBy()"查询?

scala - DataFrame numPartitions 默认值

java - 创建一个HashMap,固定Key对应一个HashSet。出发点

java - 如何通过 JNI 将 HashMap 从 Java 发送到 C