mapWithState / updateStateByKey是否被缓存?

时间:2016-12-06 08:14:25

标签: scala apache-spark apache-kafka spark-streaming

我们假设,我有一个应用程序

  1. 从kafka
  2. 创建新流
  3. 做一些转换
  4. 使用mapWithState / updateStateByKey保存状态。
  5. 对来自州的流进行更多转换。
  6. 执行一些action1和action2。
  7. 注意:我还没有使用任何缓存。

    我的问题是,

    • 第2步的转换是否会执行两次(每次执行一次action1和action2)?对我来说,似乎只执行了一次!!!
    • mapWithState / updateStateByKey返回dStream,但会自动执行一些缓存/存储吗?
    • 是否有保证,mapWithState / updateStateByKey之前的转换只应用一次而不重新计算?我的意思是,如果状态仍然包含30天前获得的数据,是否会重新计算是否找不到预先计算的结果?

1 个答案:

答案 0 :(得分:1)

  

第2步的转换是否会执行两次(一次是针对action1   和action2每个)?对我来说,似乎只执行一次

这实际上取决于我们正在谈论的转变。如果你有一个图形的两个分支,每个分支并行进行一些计算,它应该工作。

  

mapWithState / updateStateByKey返回dStream,但是它会做一些   自动缓存/存储?

这些转换的重点是在迭代之间保持状态,这就是他们所做的。 mapWithState有一个明确的State[S]对象,您可以自行添加/更新/删除。

  

是否有保证,以前的转变   mapWithState / updateStateByKey只应用一次而不是   重新计算?我的意思是,如果州仍然包含30天获得的数据   之前,如果未找到预先计算的结果,它会重新计算

mapWithStateupdateStateByKey以外的所有转换都是无状态的。如果整个RDD缺少必要数据,则可以请求重新计算缺少的RDD部分。如果这就是你的意思。