Google cloud dataflow 每个窗口是否可以通过读取gcs存储桶来更新Dataflow sideInput?

Google cloud dataflow 每个窗口是否可以通过读取gcs存储桶来更新Dataflow sideInput?,google-cloud-dataflow,Google Cloud Dataflow,我目前正在创建一个PCollectionView,从gcs存储桶中读取过滤信息,并将其作为侧面输入传递到管道的不同阶段,以过滤输出。如果gcs存储桶中的文件发生更改,我希望当前运行的管道使用此新过滤器信息。如果我的筛选器发生更改,是否有方法在每个新的数据窗口上更新此PCollectionView?我原以为我可以在一个开始的包里做这件事,但我不知道如何或是否可能。如果可能的话,你能举个例子吗 PCollectionView 标记地图视图= 管道.apply(TextIO.Read.named(“T

我目前正在创建一个PCollectionView,从gcs存储桶中读取过滤信息,并将其作为侧面输入传递到管道的不同阶段,以过滤输出。如果gcs存储桶中的文件发生更改,我希望当前运行的管道使用此新过滤器信息。如果我的筛选器发生更改,是否有方法在每个新的数据窗口上更新此PCollectionView?我原以为我可以在一个开始的包里做这件事,但我不知道如何或是否可能。如果可能的话,你能举个例子吗

PCollectionView
标记地图视图=
管道.apply(TextIO.Read.named(“TagListTextRead”)
.from(“gs://tag list bucket/tag list.json”))
.apply(ParDo.named(“TagsToTagMap”)。of(new Tags.BuildTagListMapFn())
.apply(“MakeTagMapView”,View.asSingleton());
P收集
窗口数据=
apply(PubsubIO.Read.topic(“myTopic”))
应用于(
滑动窗口(持续时间标准分钟(15))
.每(持续时间.标准秒(31));
P收集
lineData=windowedData
.apply(ParDo.named(“ExtractJsonObject”)
.带Side输入(tagMapView)
.of(新的ExtractJsonObjectFn());

您可能希望“使用最多1分钟的过滤器版本作为辅助输入”(因为从理论上讲,文件可能会频繁、不可预测地更改,并且与管道无关,因此无法真正将文件更改与管道行为完全同步)

我想出了一个(理所当然的,相当笨拙的)解决办法。它依赖于这样一个事实,即侧输入也由窗口隐式设置关键帧。在这个解决方案中,我们将创建一个侧面输入窗口,该窗口分为1分钟固定窗口,每个窗口将包含一个标记映射值,该值是在该窗口内某个时刻从过滤器文件派生的

PCollection<Long> ticks = p
  // Produce 1 "tick" per second
  .apply(CountingInput.unbounded().withRate(1, Duration.standardSeconds(1)))
  // Window the ticks into 1-minute windows
  .apply(Window.into(FixedWindows.of(Duration.standardMinutes(1))))
  // Use an arbitrary per-window combiner to reduce to 1 element per window
  .apply(Count.globally());

// Produce a collection of tag maps, 1 per each 1-minute window
PCollectionView<TagMap> tagMapView = ticks
  .apply(MapElements.via((Long ignored) -> {
    ... manually read the json file as a TagMap ...
  }))
  .apply(View.asSingleton());
PCollection ticks=p
//每秒产生1个“滴答声”
.apply(CountingInput.unbounded().withRate(1,Duration.standardSeconds(1)))
//将滴答声窗口设置为1分钟窗口
.apply(Window.into(FixedWindows.of(Duration.standardMinutes(1)))
//使用任意的每窗口组合器将每个窗口减少到1个元素
.apply(Count.globally());
//生成标记映射集合,每个1分钟窗口1个
PCollectionView标记映射视图=刻度
.apply(MapElements.via)(长期忽略)->{
…将json文件作为标记映射手动读取。。。
}))
.apply(View.asSingleton());

这种模式(将缓慢变化的外部数据作为辅助输入)正在反复出现,我在这里提出的解决方案远非完美,我希望我们在编程模型中对此有更好的支持。我已经提交了一份跟踪报告。

非常感谢您提供的解决方案,但我无法从“忽略”中获得正确的语法。我不确定MapElements.via想要什么。你能更准确地填写一下吗?这是一个Java8Lambda,但我确实把语法搞错了。确保您使用的是Java8,否则,请使用常规的ParDo和匿名类。Count.global()需要执行GlobalWindow,这意味着它不能特别用于流式数据流。此处是否缺少一个部件?它看起来好像不再存在
CountingInput
。(我正在使用Beam SDK 2.6)它现在被称为GenerateSequence。