Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud dataflow 在GroupBy |数据流管道中将密钥标记为完整_Google Cloud Dataflow_Apache Beam - Fatal编程技术网

Google cloud dataflow 在GroupBy |数据流管道中将密钥标记为完整

Google cloud dataflow 在GroupBy |数据流管道中将密钥标记为完整,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,对于我们的流媒体管道,我们希望提交唯一的GCS文件,每个文件包含多个事件信息,每个事件还包含一个密钥(例如,设备id)。作为处理的一部分,我们希望通过此设备\u id进行洗牌,以实现某种形式的工作人员到设备\u id关联(关于我们为什么要这样做的更多背景信息,请参阅。一旦来自同一文件的所有事件完成,我们希望通过它们的源GCS文件(我们将使事件本身成为一个属性,类似于文件\u id)来减少(GroupBy)最后将输出写入GCS(可以是多个文件) 我们希望执行最后一个GroupBy的原因是,我们希望

对于我们的流媒体管道,我们希望提交唯一的GCS文件,每个文件包含多个事件信息,每个事件还包含一个密钥(例如,设备id)。作为处理的一部分,我们希望通过此设备\u id进行洗牌,以实现某种形式的工作人员到设备\u id关联(关于我们为什么要这样做的更多背景信息,请参阅。一旦来自同一文件的所有事件完成,我们希望通过它们的源GCS文件(我们将使事件本身成为一个属性,类似于文件\u id)来减少(GroupBy)最后将输出写入GCS(可以是多个文件)

我们希望执行最后一个GroupBy的原因是,我们希望在特定的输入文件完成处理后通知外部服务。这种方法的唯一问题是,由于数据由设备\u id洗牌,然后在最后由文件\u id分组,因此无法保证来自特定文件\u id的所有数据完成了处理

我们可以做些什么吗?我知道Dataflow提供了精确的一次保证,这意味着所有事件最终都将被处理,但是有没有一种方法可以设置一个确定性触发器来表示特定密钥的所有数据都已分组


编辑 我想强调我们在这里面临的更广泛的问题,即标记的能力 文件级别的完整性将帮助我们检查外部使用者看到的数据的不同阶段。例如

  • 这将允许我们触发每小时或每天的完整性,这对于我们生成该窗口的报告至关重要。鉴于这些阶段/障碍(小时/天)在输入上有明确定义(GCS文件是按日期/小时划分的),这是很自然的,期望输出是相同的。但是对于数据流的模型,这似乎是不可能的
  • 类似地,尽管数据流只保证一次,但在某些情况下,由于出现严重错误,整个管道需要重新启动-在这些情况下,几乎不可能从正确的输入标记重新启动,因为无法保证已经消耗的内容已被完全清除。排水模式试图实现这一点,但如前所述,如果整个管道混乱,排水本身无法取得进展,则无法知道源的哪一部分应作为起点
我们正在考虑使用Spark,因为它基于微批量的流模型似乎更适合。如果可能的话,我们仍然希望探索数据流,但如果不从应用程序外部存储这些检查点,我们似乎无法实现它。如果有一种从数据流提供这些保证的替代方法,这太好了。扩大这个问题的背后的想法是看看我们是否遗漏了解决问题的另一个视角


谢谢,这实际上很棘手。Beam和Dataflow都没有每密钥水印的概念,而且很难实现这种粒度级别

一个想法是使用一个有状态的DoFn而不是第二个shuffle。然后它可以计算它已处理的元素的数量,并且只有在看到该数量的元素后才输出所有已处理的内容


这将假设预期的元素数量可以提前确定,等等。

这实际上很棘手。Beam和Dataflow都没有每键水印的概念,并且很难实现这种粒度级别

一个想法是使用一个有状态的DoFn而不是第二个shuffle。然后它可以计算它已处理的元素的数量,并且只有在看到该数量的元素后才输出所有已处理的内容


这将假设预期的元素数量可以提前确定,等等。

可以安全地假设输入GCS文件中的每个事件将向输出生成一个事件-因此,我们知道一旦读取数据,预期的事件数量。可以安全地假设输入GCS文件中的每个事件将生成一个事件输出只有一个事件-因此我们知道读取数据后的预期事件数。我有几个后续问题[1]IIRC,有状态的PARDO在每个窗口中按键工作-假设没有窗口,这意味着它是一个单一的全局窗口,它仍然在每个键的基础上工作-因此我们需要通过文件id将洗牌到
组,对吗?[2]初始读取GCS文件后生成的侧面输入将是一个
映射
——我知道侧面输入或
PCollectionView
也是不可变的——那么Beam/Dataflow将如何管理旧
文件id
的垃圾收集?比如,如果特定
文件id
的所有数据都已到达,并且外部服务已关闭n通知,既然不再需要
文件\u id->event\u count
,如何删除它,使侧面输入
PCollectionView
不会无限增长?[3]您提到在主输入中将数据作为特殊值发送-我不明白如何从
PCollection
中挑选出一些具有特殊意义的特定值。当前未对外部输入进行垃圾收集。相反,您可以创建一个表示数字或值的类
CountOrInput
类型为
E
。然后在有状态的
DoFn
中,查看输入是一个计数,在这种情况下,您现在知道要等待多少个元素,或者是一个元素,在这种情况下,您递增