Google cloud platform 云数据流:水印推进时的副作用

Google cloud platform 云数据流:水印推进时的副作用,google-cloud-platform,google-cloud-dataflow,Google Cloud Platform,Google Cloud Dataflow,在Google数据流中使用源自云PubSub订阅的流式、无边界的PCollection。我们将其用作消防软管,以便将事件连续地传递给BigTable。交付的每件事都进行得很好 我们的问题是,我们有下游批处理作业,这些作业希望在BigTable交付后从中读取一天的数据。我想利用窗口和触发来实现一个副作用,当水印超过日阈值时,它会将一个标记行写入bigtable,这表明数据流有理由相信大多数事件已经交付(我们不需要对完整性的有力保证,只需要合理的保证)下游处理可以开始 我们尝试的是将原始事件作为管道

在Google数据流中使用源自云PubSub订阅的流式、无边界的PCollection。我们将其用作消防软管,以便将事件连续地传递给BigTable。交付的每件事都进行得很好

我们的问题是,我们有下游批处理作业,这些作业希望在BigTable交付后从中读取一天的数据。我想利用窗口和触发来实现一个副作用,当水印超过日阈值时,它会将一个标记行写入bigtable,这表明数据流有理由相信大多数事件已经交付(我们不需要对完整性的有力保证,只需要合理的保证)下游处理可以开始

我们尝试的是将原始事件作为管道中的一个接收器写入,然后将窗口插入另一个接收器,使用来确定水印是否已升级。这种方法的问题是它会再次对原始事件本身进行操作,这是不可取的,因为它会重复写入事件行。我们可以防止这种写入,但管道中的并行路径仍将在窗口化的事件流上运行


是否有一种有效的方法将各种回调附加到水印上,这样我们就可以在水印前进时执行单个操作?

在事件时间内设置计时器并接收回调的一般功能无疑是一个重要的功能请求,归档为,正在积极开发中

但实际上,您将窗口化到
FixedWindows.of(Duration.standardDays(1))
的方法似乎只需使用Dataflow Java SDK 1.x的功能就可以实现您的目标。您可以通过添加触发器
AfterPane.elementcountatlast(1)
来维护“firehose”行为,而不是分叉管道。它确实会产生
GroupByKey
的成本,但不会复制任何内容

整个管道可能如下所示:

管道
//从Cloud Pubsub读取数据并解析为MyValue
.apply(publisubio.Read.topic(…).withCoder(MyValueCoder.of())
//你需要一些钥匙
.应用(使用(…)的键)
//窗口转换为每日窗口,但仍以尽可能快的速度输出
.apply(Window.into(FixedWindows.of(Duration.standardDays(1)))
.触发(AfterPane.ElementCount至少(1)))
//GroupByKey添加了必要的早/准时/晚标签
.apply(GroupByKey.create())
//转换千伏
//至千伏
//其中突变的易位性具有“一天结束”标记,如果
//那是准时的
.apply(maplements.via(newmessagetomutationwithendofindow())
//写下来!
.apply(BigTableIO.Write.to(…);

如果我遗漏了您的用例的一些细节,请对我的回答进行评论。

在事件时间内设置计时器并接收回调的一般功能无疑是一个重要的功能请求,归档为,正在积极开发中

但实际上,您将窗口设置为
FixedWindows.of(Duration.standardDays(1))
的方法似乎只需要使用Dataflow Java SDK 1.x的功能就可以实现您的目标。您可以通过添加触发器
AfterPane.elementcount至少(1)来维护“firehose”行为,而不是分叉管道
。它确实会产生
GroupByKey
的成本,但不会复制任何内容

整个管道可能如下所示:

管道
//从Cloud Pubsub读取数据并解析为MyValue
.apply(publisubio.Read.topic(…).withCoder(MyValueCoder.of())
//你需要一些钥匙
.应用(使用(…)的键)
//窗口转换为每日窗口,但仍以尽可能快的速度输出
.apply(Window.into(FixedWindows.of(Duration.standardDays(1)))
.触发(AfterPane.ElementCount至少(1)))
//GroupByKey添加了必要的早/准时/晚标签
.apply(GroupByKey.create())
//转换千伏
//至千伏
//其中突变的易位性具有“一天结束”标记,如果
//那是准时的
.apply(maplements.via(newmessagetomutationwithendofindow())
//写下来!
.apply(BigTableIO.Write.to(…);
如果我遗漏了您的用例的一些细节,请对我的回答进行评论