【问题标题】:Is mapWithState/updateStateByKey cached?mapWithState/updateStateByKey 是否缓存?
【发布时间】:2016-12-06 08:14:25
【问题描述】:
假设,我有一个应用程序
- 从 kafka 创建一个新流
- 做一些转换
- 使用
mapWithState/updateStateByKey 保存状态。
- 对来自状态的流进行更多转换。
- 做一些 action1 和 action2。
注意:我还没有使用任何缓存。
我的问题是,
- 步骤 2 的转换是否会执行两次(action1 和 action2 各一次)?对我来说,它似乎只执行一次!!!
-
mapWithState/updateStateByKey 返回dStream,但它会自动进行一些缓存/存储吗?
- 是否有保证,
mapWithState/updateStateByKey 之前的转换只应用一次而不重新计算?我的意思是,如果状态仍然包含30天前获取的数据,如果没有找到预先计算的结果,它会重新计算吗?
【问题讨论】:
标签:
scala
apache-spark
apache-kafka
spark-streaming
【解决方案1】:
步骤 2 的转换是否会执行两次(一次用于 action1
和action2每个)?对我来说,它似乎只执行一次
这实际上取决于我们正在谈论的转换。如果您有一个图的两个分支,每个分支都并行进行一些计算,那么它应该可以工作。
mapWithState/updateStateByKey 返回 dStream,但它会做一些事情吗
自动缓存/存储?
这些转换的重点是在迭代之间保持状态,这就是它们的作用。 mapWithState 有一个明确的 State[S] 对象,您可以自己添加/更新/删除。
有没有保证,之前的变换
mapWithState/updateStateByKey 只应用一次而不是
重新计算?我的意思是,如果状态仍然包含 30 天获得的数据
之前,如果没有找到预先计算的结果,是否会重新计算
除mapWithState 和updateStateByKey 之外的所有转换都是无状态的。如果一个RDD作为一个整体缺少一条必要的数据,它可以请求重新计算RDD缺少的那部分。如果这就是你的意思。