提问者:小点点

数据流如何执行并行处理?


我正在使用Mysql到Bigquery数据管道的数据流。我正在使用JDBC Mysql到Bigquery数据流模板。

在从数据流GUI创建作业时,我可以明确地设置最大工人数量,工人总数。

但问题是,如果我提到两个n1-ardard-4大小的worker,则会创建2个worker一段时间并自动删除一个worker。为什么两个worker都没有运行以完成操作?

即使我使用1个或2个worker,经过的时间也没有区别。根据我的理解,如果我使用2个worker而不是1个,时间应该是一半。存储桶Temp文件夹中创建GCS文件也不相同。

数据流如何管理它的工作人员?它如何执行并行处理?我应该如何决定我的工作所需的工作人员的数量和类型?


共2个答案

匿名用户

Beam框架实现了类似于Map-Reduce的东西。您可以并行化Map(ParDo-

因此,根据您的管道,Beam能够有效地分派消息以并行处理每个工作人员,然后等待执行GroupBy。可扩展性对于复杂的管道非常有效,尤其是当您有多个条目和/或多个输出时。

在你的例子中,你的管道非常简单:没有转换(你可以并行完成)。只需读写。你想并行化什么?你不需要有几个工作人员来完成这个!

最后一点:您使用的接收器,这里是BigQuery,可以根据您的管道运行模式具有不同的行为

  • 如果您以批处理模式运行管道(您的情况),BigQuery.IO只需获取数据并在Cloud Storage暂存桶中创建文件。然后,最后,触发正确表中所有文件的唯一加载作业
  • 如果您在流模式下运行管道,BigQuery.IO将执行流写入BigQuery。

这种模式会影响并行化能力和可能的工作人员数量。

匿名用户

您的Dataflow作业没有将这两个工作人员保留到最后有几个合理的原因:

-1:整个作业或某些任务不可并行。Dataflow将删除第二个工作人员,以便您在工作人员空闲时不会产生额外费用。

-2:如果工作人员在两分钟内平均使用不到75%的CPU,并且流式管道积压低于10秒(1)。

请记住,缩放不会自动发生,因为从这个意义上说,Dataflow是保守的。通常,Dataflow会花更多的时间尝试添加工作人员,而不是使用它们。因此,当您期望工作负载高且峰值明显时,建议设置较高的工作人员起始数量。

另一方面,如果只使用两个worker中的1个,则无论您将worker的数量设置为1还是2,总时间量都是相同的。为了更好地理解这个概念,让我举一个例子:

想象一下,你有一个算法,它产生一个伪随机数序列,其中每个值计算都取决于最后一个数字。这是一个任务,如果你有1个或100个worker,它将始终以相同的速度工作。但与此同时,对于其他用例,例如,如果每个数字不依赖于前一个,这个任务在100个worker的情况下大约会快100倍。

总而言之,Dataflow考虑了每个任务的并行性,并根据(1)中所述的规则向上和向下扩展。更多的工作人员可能更快,也可能更快,但成本会更高。

请查看(2)以更好地了解Dataflow中的并行化和分发。我还发现了这两个Stack Overflow问题(3)和(4),这可能有助于阐明您的问题。