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
来收集文件内容,但我在某种程度上意识到,splittableDoFn
的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。所以我不相信我能用这种方法,除非我有误解。