Google bigquery 当存在多个源时,Google Dataflow一次读取的输入压缩文件不超过3个

Google bigquery 当存在多个源时,Google Dataflow一次读取的输入压缩文件不超过3个,google-bigquery,google-cloud-storage,google-cloud-platform,google-cloud-dataflow,Google Bigquery,Google Cloud Storage,Google Cloud Platform,Google Cloud Dataflow,Background:我有30天的数据,存储在谷歌存储中的30个单独的压缩文件中。我必须将它们写入同一个表中30个不同分区的BigQuery表中。每个压缩文件大小约为750MB 今天我在谷歌数据流上对相同的数据集做了两个实验 实验1:我使用TextIO读取每天的压缩文件,应用简单的ParDo变换准备TableRow对象,并使用BigQueryIO将它们直接写入BigQuery。所以基本上30对平行的未连接的源和汇被创造出来。但我发现在任何时候,只有3个文件被读取、转换和写入BigQuery。谷歌

Background:我有30天的数据,存储在谷歌存储中的30个单独的压缩文件中。我必须将它们写入同一个表中30个不同分区的BigQuery表中。每个压缩文件大小约为750MB

今天我在谷歌数据流上对相同的数据集做了两个实验

实验1:我使用TextIO读取每天的压缩文件,应用简单的ParDo变换准备TableRow对象,并使用BigQueryIO将它们直接写入BigQuery。所以基本上30对平行的未连接的源和汇被创造出来。但我发现在任何时候,只有3个文件被读取、转换和写入BigQuery。谷歌数据流的ParDo转换和BigQuery写入速度在任何时间点都在6000-8000个元素/秒左右。 因此,在任何时候,30个源和汇中只有3个被处理,这大大减缓了处理过程。在超过90分钟的时间里,30个文件中只有7个被写入表的不同BigQuery分区

实验2:在这里,我首先从同一个压缩文件中读取30天内每天的数据,对30个PCollection应用ParDo转换,并将这30个结果PCollection存储在PCollectionList对象中。所有这30个文本信息源都被并行读取。 现在,我直接使用BigQueryIO将对应于PCollectionList中每天数据的每个PCollection写入BigQuery。因此,30个水槽被并行写入。 我发现在30个并行源中,同样只有3个源被读取并以大约20000个元素/秒的速度应用ParDo转换。在写这个问题的时候,已经过了1个小时,从所有压缩文件中读取的数据甚至还没有完全读取50%的文件,甚至还没有开始写入BigQuery表分区

这些问题似乎只有在谷歌数据流读取压缩文件时才会出现。我曾问过一个关于它从压缩文件()读取速度慢的问题,并被告知并行化工作将使读取速度更快,因为只有一个工作人员读取压缩文件,而多个源意味着多个工作人员有机会读取多个文件。但这似乎也不起作用


是否有任何方法可以加快读取多个压缩文件并同时写入dataflow作业中BigQuery中同一表的单独分区的整个过程?

每个压缩文件都将由一个工作进程读取。使用numWorkers管道选项可以增加作业的初始工作人员数量,使用maxNumWorkers管道选项可以设置可放大到的最大工作人员数量。

1)是否使用Java SDK?如果是..2)您使用的是什么版本的Java SDK?3) 您在TextIO.Read绑定(AUTO,GZIP,…)中将compressionType设置为什么?我使用的是Google Cloud Dataflow Java SDK 1.6.0。我在阅读时没有设置任何压缩类型。因此,默认情况下,压缩类型应设置为“自动”。代码正在运行的文件扩展名是。gz您可以提供作业ID吗?您正在使用多少工人(我相信默认值为3)?实验1的工作Id为2016-08-16_12_21_50-6508500558826000885。实验2的工作Id为2016-08-16_12_59_18-12710516602377435100。这两个工作都只有三名员工。您可以设置maxNumWorkers选项以调整要使用的最大工作人数,并设置numWorkers以设置初始数量。在这两个管道中,您似乎设置了一个名为numberOfWorkers的选项,而不是设置服务理解的选项。对于非压缩文件,这也是正确的,即一个文件仅由一个worker读取?