Google cloud dataflow ApacheBeam-并行化Google云存储Blob下载,同时维护Blob分组

Google cloud dataflow ApacheBeam-并行化Google云存储Blob下载,同时维护Blob分组,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我希望能够在单个PCollection元素中维护一组实体,但要并行地从谷歌云存储(GCS)中获取这些实体。i、 e.PCollection-->PCollection,其中开始的PCollection是一个文件路径的Iterable,而产生的PCollection是一个文件内容的Iterable。或者,PCollection-->PCollection也可以工作,甚至可能更可取,其中开始的PCollection是一个全局模式,而产生的PCollection是一个与全局匹配的文件内容的iterab

我希望能够在单个
PCollection
元素中维护一组实体,但要并行地从谷歌云存储(GCS)中获取这些实体。i、 e.
PCollection
-->
PCollection
,其中开始的
PCollection
是一个文件路径的Iterable,而产生的
PCollection
是一个文件内容的Iterable。或者,
PCollection-->PCollection
也可以工作,甚至可能更可取,其中开始的
PCollection
是一个全局模式,而产生的
PCollection
是一个与全局匹配的文件内容的iterable

我的用例是,在我的管道中的某个点上,我有作为输入的
PCollection
PCollection
的每个元素都是GCS全局模式。将与glob匹配的文件分组在一起是很重要的,因为一旦读取了组中的所有文件,文件的内容就需要在管道的下游进行分组。我最初尝试使用
FileIO.matchAll
和随后的
GroupByKey
。但是,matchAll、window和
GroupByKey
组合无法保证在执行GroupByKey转换之前,所有与glob匹配的文件都将被读取并在同一窗口中(尽管我可能误解了Windowing)。如果应用较大的时间跨度
WindowFn
,则可以获得所需的结果,但这仍然是可能的,而不是保证在分组之前读取所有文件。我的管道的主要目标也是保持尽可能低的延迟

因此,我的下一个计划是使用
AsyncHttpClient
,通过GCS HTTP API分散获取文件内容。我觉得这与Beam中的粒度不符,在并行化方面可能是次优的

所以我开始调查SplittableDoFn。我目前的计划是允许拆分,以便可以分别处理输入Iterable中的每个实体(即glob模式中的每个匹配文件)。我已经能够修改
FileIO#MatchFn
(),为
PCollection->PCollection
在GCS全局模式的输入和全局匹配的可匹配项的输出之间的转换提供机制

我遇到的挑战是:如何将拆分调用分组/收集回我的
DoFn
中的单个输出值?我曾经尝试过使用有状态处理和使用
BagState
来收集文件内容,但我在某种程度上意识到,splittable
DoFn
ProcessElement
方法可能只接受
ProcessContext
Restriction
元组,并且没有其他参数,因此没有
StateId
args引用
StateSpec
(在运行时抛出无效参数错误)

我在官方的
FilePatternWatcher
示例中注意到,创建了一个自定义跟踪器,其中
FilePath
对象保存在一个集合中,并可能通过
tryClaim
添加到集合中。这似乎适用于我的用例,但我不明白如何使用自定义的
RestrictionTracker
实现
@SplitRestriction
方法


如果有人能提供建议,我将不胜感激。我不喜欢任何特定的解决方案,只是我想实现在单个
PCollection
元素中维护一组实体的能力,但是并行地从谷歌云存储(GCS)获取这些实体。

加入输出PCollection会帮到你吗

PCollectionList
    .of(collectionOne)
    .and(collectionTwo)
    .and(collectionThree)
    ...
    .apply(Flatten.pCollections())

不幸的是,在我的例子中,只有一个单一的PCollection。所以我不相信我能用这种方法,除非我有误解。