Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud dataflow Apache Beam/数据流重组_Google Cloud Dataflow_Apache Beam - Fatal编程技术网

Google cloud dataflow Apache Beam/数据流重组

Google cloud dataflow Apache Beam/数据流重组,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,org.apache.beam.sdk.transforms.Reshuffle的目的是什么?在文件中,目的定义为: 一种p转换,返回与其输入相等的p收集,但 在操作上提供了GroupByKey的一些副作用 特别是防止周围变换的融合, 按id设置检查点和重复数据消除 防止周围变换融合的好处是什么?我认为fusion是一种防止不必要步骤的优化。实际的用例会有所帮助 在一些情况下,您可能需要重新整理数据。以下不是一个详尽的列表,但应该让您了解为什么可能会进行改组: 当其中一个ParDo变换具有非常高

org.apache.beam.sdk.transforms.Reshuffle的目的是什么?在文件中,目的定义为:

一种p转换,返回与其输入相等的p收集,但 在操作上提供了GroupByKey的一些副作用 特别是防止周围变换的融合, 按id设置检查点和重复数据消除


防止周围变换融合的好处是什么?我认为fusion是一种防止不必要步骤的优化。实际的用例会有所帮助

在一些情况下,您可能需要重新整理数据。以下不是一个详尽的列表,但应该让您了解为什么可能会进行改组:

当其中一个ParDo变换具有非常高的扇出时 这意味着在你的ParDo之后平行度会增加。如果不在此处中断融合,管道将无法将数据拆分为多台机器来处理

考虑DoFn的极端情况,它为每个输入元素生成一百万个输出元素。考虑这个ParDo在其输入中接收10个元素。如果你不打破这个高扇出ParDo和它的下游变换之间的融合,它将只能在10台机器上运行,尽管你将拥有数百万个元素

  • 诊断此问题的一个好方法是查看输入PCollection中的元素数与输出PCollection中的元素数。如果后者显著大于第一个,那么您可能需要考虑增加一个改组。
当您的数据在多台计算机之间不平衡时** 假设您的管道消耗9个10MB文件和一个10GB文件。如果每个文件都由一台机器读取,那么一台机器的数据量将比其他机器多得多

如果不重新整理这些数据,管道运行时,大多数机器将处于空闲状态。重新调整它可以让您重新平衡要在多台机器上更均匀地处理的数据

  • 诊断此问题的一个好方法是查看管道中有多少工人正在执行工作。如果管道运行缓慢,并且只有一个工人在处理数据,那么您可以从改组中获益

我明白了,我是否可以通过stackdriver图表或日志观察到一些迹象,表明需要重新洗牌?如果我能从Dataflow workers那里得到一些信号,说明这种情况下,改组将提高性能,而不是猜测,那就太好了。我编辑了这个问题来回答这些问题。您可以从查看数据流中输入与输出PCollections的大小开始,数据流是否会基于struggler在多个Worker之间分配工作?例如,对于自动烫伤,它将始终尝试优化资源,因此尝试使用更少的工人运行。在您示例的案例2中,我们是否需要通过重新洗牌来明确说明我们需要更多的工人?没错。当数据源允许时,可以分割工作-但这并不总是可能的。例如,对于单个压缩块,不可能并行化它们的进度,也不可能在您有热键时并行化。@Pablo关于读取转换呢?假设您正在阅读包含3个avro文件的“gs://dir/*.avro”,其中每个文件包含1亿多行。您是否在读取转换后重新洗牌,以便能够使用512个工人?我也看到了一个read是Split+read,难道我们不应该在Split之后和read之前重新洗牌吗?如果是这样的话,当客户端代码中只有一个不可破坏的读取转换时,我们怎么能做到这一点呢?