Dataflow状态处理中的一次语义

问题描述 投票:0回答:1

我们正在尝试在流媒体设置中涵盖以下场景:

  • 计算自工作开始以来的用户事件总数(例如,计数)>
  • 用户事件的数量是不受限制的(因此,不能仅使用本地状态)
  • 我将讨论我们正在考虑的三个选项,其中前两个选项容易造成数据丢失,最后一个选项不清楚。我们想对这最后一个有更多的了解。当然也欢迎使用其他方法。

谢谢!


方法1:会话窗口,数据存储和幂等
  1. 滑动窗口x秒

  • 按用户ID分组
  • 更新数据存储
  • 更新数据存储将意味着:

    1. 开始trx
    2. 为此用户读取的数据存储区
    3. 合并新信息
    4. 数据存储写入
    5. End trx
    6. 数据存储条目包含一个等于滑动窗口时间戳的幂等ID

    问题:

    Windows可以同时启动,因此可以无序处理,从而导致数据丢失(由Google确认)

    方法:会话窗口,数据存储和状态
    1. 滑动窗口x秒

  • 按用户ID分组
  • 更新数据存储
  • 更新数据存储将意味着:

    1. [预检查:检查此键窗口的状态是否为true,如果是,我们跳过以下步骤]
    2. 开始trx
    3. 为此用户读取的数据存储区
    4. 合并新信息
    5. 数据存储写入
    6. End trx
    7. 在我们处理该键窗口的状态下存储(true
    8. 因此,重新执行将跳过重复的更新

    问题:

    5到7之间的故障将不会写入本地状态,从而导致重新执行并可能对元素计数两次。我们可以通过使用多个状态来规避这一点,但是我们仍然可以删除数据。

    方法3:全局窗口,计时器和状态

    基于文章Timely (and Stateful) Processing with Apache Beam,我们将创建:

    1. 一个全局窗口
    2. 按用户ID分组
    3. 缓冲/计数有状态DoFn中的所有传入事件
    4. 第一个事件后的x冲洗时间。
    5. 刷新将与方法1相同

    问题:

    仅一次处理和状态的保证尚不清楚。如果在状态中写入了一个元素,并且束将被重新执行,将会发生什么?状态是否已还原到该捆绑包之前?

    非常感谢在这方面与文档的任何链接。例如。容错如何与计时器一起使用?

    我们正在尝试在流式传输环境中涵盖以下场景:自作业开始以来计算用户事件的总计(比方说计数)用户事件的数量是不受限制的(...

    google-cloud-datastore google-cloud-dataflow apache-beam
    1个回答
    0
    投票

    根据您的方法1和方法2,目前尚不清楚无序合并是引起关注还是数据丢失。我可以想到以下内容。

    © www.soinside.com 2019 - 2024. All rights reserved.