2016-12-06 87 views
1

假设,我有一个应用程序是否缓存了mapWithState/updateStateByKey?

  1. 从卡夫卡
  2. 创建一个新的数据流做一些转换
  3. 使用mapWithState/updateStateByKey保存状态。
  4. 对来自状态的流进行一些更多的转换。
  5. 做一些动作1和动作2。

注:我还没有使用任何缓存。

我的问题是,

  • 将在第2步转换中(对于动作1次和动作2个)进行了两次?对我来说,它似乎只执行一次!
  • mapWithState/updateStateByKey return dStream,但是它会自动执行一些缓存/存储吗?
  • 是否有担保,mapWithState/updateStateByKey之前的转换仅应用一次而不重新计算?我的意思是,如果状态仍包含30天前获取的数据,它是否会重新计算预先计算的结果未找到?

回答

1

将在步骤2中的变换(一次动作1 和动作2的每个)进行两次?对我来说,它似乎只执行一次

这真的取决于我们正在谈论的转换。如果你有一个图的两个分支,每个分支并行计算,它应该可以工作。

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

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

是否有担保的,之前 mapWithState/updateStateByKey的转换应用只有一次,而不是 重新计算的?我的意思是,如果状态仍然包含30天 之前采集的数据,将它重新计算如果不是mapWithStateupdateStateByKey无国籍发现

所有转换等预先计算的结果。如果整个RDD缺少一个必要的数据,它可以请求重新计算RDD丢失的部分。如果这就是你的意思。