Google cloud dataflow 云数据流新鲜度和延迟的确切定义是什么?

Google cloud dataflow 云数据流新鲜度和延迟的确切定义是什么?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,问题: 使用云数据流时,我们得到了两个指标(请参阅): 系统延迟 数据新鲜度 Stackdriver中也提供了以下名称(摘录自): system_lag:数据项等待处理的当前最长持续时间,以秒为单位 data_watermark_age:管道已完全处理的最新数据项的期限(自事件时间戳起的时间) 但是,这些描述仍然非常模糊: “等待处理”是什么意思?消息在pubsub中等待多长时间?或者它在管道内等待的总时间 “最长持续时间”:处理该最长项目后,是否会调整指标 “自事件时间戳起的时间”是否意味着如

问题:

使用云数据流时,我们得到了两个指标(请参阅):

  • 系统延迟
  • 数据新鲜度
  • Stackdriver中也提供了以下名称(摘录自):

    system_lag:数据项等待处理的当前最长持续时间,以秒为单位

    data_watermark_age:管道已完全处理的最新数据项的期限(自事件时间戳起的时间)

    但是,这些描述仍然非常模糊:

  • “等待处理”是什么意思?消息在pubsub中等待多长时间?或者它在管道内等待的总时间
  • “最长持续时间”:处理该最长项目后,是否会调整指标
  • “自事件时间戳起的时间”是否意味着如果我的事件在时间戳t1时放入pubsub,并且它在时间戳t2时从管道的一端流出,那么管道在t1?我想我可以假设,如果度量是t1,那么t1之前的一切都可以被处理
  • 问题:


    由于这些度量与Apache Beam的语义一致,我希望看到一些示例,或者至少更清楚地定义这些度量,以使其可用。

    这些度量非常棘手。关于它们如何工作的深入探讨可以在中看到

    管道被拆分为内存中发生的一系列计算,以及需要将数据序列化到某种数据存储的计算。例如,考虑下面的管道:

    with Pipeline() as p:
      p | beam.ReadFromPubSub(...)  \
        | beam.Map(parse_data)
        | beam.Map(into_key_value_pairs) \
        | beam.WindowInto(....) \
        | beam.GroupByKey() \
        | beam.Map(format_data) \
        | beam.WriteToBigquery(...)
    
    这条管道将分为两个阶段。阶段是可以应用于内存中的一系列计算

    第一阶段是从
    readfromsub
    GroupByKey
    操作。这两个P转换之间的所有操作都可以在内存中完成。要执行
    GroupByKey
    ,需要将数据写入持久状态(并因此写入新源)

    第二个阶段是从
    GroupByKey
    WriteToBigQuery
    。在这种情况下,数据是从“源”读取的

    每个源都有自己的一组水印。您在数据流UI中看到的水印是来自管道中任何源的最大水印

    --

    回答您的问题:

  • 等待处理的是什么?
  • 回答

    它是一个元素在PubSub中等待的时间。具体地说,元素在管道中的任何源中等待的时间

    考虑一个更简单的管道:

    ReadFromPubSub->Map->WriteToBigQuery

    此管道对每个项目执行以下操作:
    从PubSub读取项目->对其进行操作->插入到BigQuery->**向PubSub确认该项目已被消费**

    现在,假设BigQuery服务停止运行5分钟。这意味着PubSub在5分钟内不会收到任何元素的确认。因此,这些元素将在PubSub中停留一段时间

    这意味着当BQ写入被阻止时,系统延迟(以及数据新鲜度指标)将膨胀到5分钟

  • 处理后是否调整了最大持续时间?
  • 回答

    对。例如,再考虑上一条管道:BQ死了5分钟。当BQ返回时,可能会向其写入大量项目,确认为从PubSub读取。这将使系统延迟(和数据新鲜度)大大降低到几秒钟

  • 事件时间戳之后的时间是多少?
  • 回答

    事件时间戳可以作为消息的属性提供给PubSub。这是一个有点棘手的概念,但本质上:

    每个阶段都有一个输出数据水印。输出数据水印T表示计算已处理事件时间在T之前的所有元素。输出数据水印可以是其所有上游计算的最早输入水印。但是,如果有一些输入数据尚未处理,则输出水印可能会被保留

    当然,这个指标是启发性的。如果某个数据点很晚才到达,那么数据的新鲜度将被延迟

    --

    我建议你去看看这本书。它涵盖了所有这些概念