目前正在使用谷歌数据流Python进行批次处理作业。这很好,但是,我有兴趣从我的数据流工作中获得更快的速度,而不必处理Java。
使用GoSDK,我实现了一个简单的管道,从谷歌存储中读取一系列100-500mb的文件(使用textio.Read
),进行一些聚合并用结果更新CloudSQL。被读取的文件数量从几十到几百不等。
当我运行管道时,我可以从日志中看到文件正在串行读取,而不是并行读取,因此作业需要更长的时间。使用PythonSDK执行的相同进程触发自动缩放并在几分钟内运行多次读取。
我尝试使用--num_workers=
指定工作人员的数量,但是,Dataflow会在几分钟后将作业缩小到一个实例,并且在实例运行期间不会从日志中进行并行读取。
如果我删除textio.Read
并实现从GCS读取的自定义DoFn,也会发生类似的情况。读取过程仍然串行运行。
我知道当前的GoSDK是实验性的,缺乏许多功能,但是,我在这里没有找到关于并行处理限制的直接参考。GoSDK的当前版本是否支持数据流上的并行处理?
提前谢谢
在为GoSDK创建了自己的IO包后,我设法找到了答案。
SplitableDoFns在GoSDK中尚不可用。这一关键功能允许Python和JavaSDK并行执行IO操作,因此在规模上比GoSDK快得多。
现在(GO 1.16)它是内置的:
https://pkg.go.dev/google.golang.org/api/dataflow/v1b3