Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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 platform 计算GroupBy一次,然后将其传递给googledataflow(pythonsdk)中的多个转换_Google Cloud Platform_Google Cloud Dataflow_Apache Beam - Fatal编程技术网

Google cloud platform 计算GroupBy一次,然后将其传递给googledataflow(pythonsdk)中的多个转换

Google cloud platform 计算GroupBy一次,然后将其传递给googledataflow(pythonsdk)中的多个转换,google-cloud-platform,google-cloud-dataflow,apache-beam,Google Cloud Platform,Google Cloud Dataflow,Apache Beam,我正在使用ApacheBeam的Python SDK在Google数据流上运行一个特征提取管道。我需要运行多个转换,所有这些转换都希望项目按键分组 基于这个问题的答案,DataFlow无法自动发现和重用重复的转换,比如GroupBy,所以我希望先运行GroupBy,然后将结果PCollection提供给其他转换,请参见下面的示例代码 我想知道这是否应该在数据流中有效地工作。如果不是,建议在Python SDK中采用什么解决方法?有没有一种有效的方法可以让多个映射或写入转换获取相同GroupBy的

我正在使用ApacheBeam的Python SDK在Google数据流上运行一个特征提取管道。我需要运行多个转换,所有这些转换都希望项目按键分组

基于这个问题的答案,DataFlow无法自动发现和重用重复的转换,比如GroupBy,所以我希望先运行GroupBy,然后将结果PCollection提供给其他转换,请参见下面的示例代码

我想知道这是否应该在数据流中有效地工作。如果不是,建议在Python SDK中采用什么解决方法?有没有一种有效的方法可以让多个映射或写入转换获取相同GroupBy的结果?在我的例子中,我观察到数据流以5%的利用率扩展到最大工作人数,并且在下面的GroupBy步骤中没有任何进展,如本文所述

示例代码。为简单起见,仅显示了2个转换

# Group by key once.
items_by_key = raw_items | GroupByKey()

# Write groupped items to a file.
(items_by_key | FlatMap(format_item) | WriteToText(path))

# Run another transformation over the same group.
features = (items_by_key | Map(extract_features))

将单个GroupByKey步骤的输出馈送到多个转换中应该可以正常工作。但是,您可以获得的并行化量取决于原始GroupByKey步骤中可用的密钥总数。如果下游的任何一个步骤都是高扇出,请考虑在这些步骤之后添加一个步骤,这将允许Dataflow进一步并行执行。 比如说,

pipeline | Create([<list of globs>]) | ParDo(ExpandGlobDoFn()) | Reshuffle() | ParDo(MyreadDoFn()) | Reshuffle() | ParDo(MyProcessDoFn())
这里,

ExpandGlobDoFn:展开输入全局并生成文件 MyReadDoFn:读取给定文件 MyProcessDoFn:处理从文件读取的元素
我在这里使用了两次改组注意,改组中有一个GroupByKey,它允许1从给定的全局并行读取文件2从给定的文件并行处理元素。

根据我在故障排除方面的经验,在多个转换中重用GroupBy输出可能会使管道速度非常慢。至少这是我使用ApacheBeamSDK2.11.0 for Python的经验

常识告诉我,从执行图中的单个GroupBy分支应该会使我的管道运行得更快。在120多名工人上运行了23个小时后,管道无法取得任何重大进展。我尝试添加洗牌,在可能的情况下使用组合器并禁用实验性洗牌服务

直到我把管道一分为二,一切都无济于事。第一个管道计算GroupBy并将其存储在一个文件中,我需要将其按原样接收到数据库中。第二种方法使用GroupBy输出读取文件,读取其他输入并运行进一步的转换。结果-所有转换在2小时内成功完成。我想如果我只是在我最初的管道中复制GroupBy,我可能会获得相同的结果

我想知道这是DataFlow执行引擎或Python SDK中的一个bug,还是按预期工作。如果是设计的,那么至少应该记录在案,这样的管道在提交时不应该被接受,或者应该有一个警告

您可以通过查看组关键字步骤中的两个分支来发现这个问题。看起来解决方案是分别为每个分支重新运行GroupBy。

感谢您的反馈!你能举一个例子,说明在群比之后可能需要进行改组的情况吗?只是想确保我能正确识别应该使用的模式。添加了一个示例。谢谢,非常感谢。真的很欣赏这个例子。是否有计划使数据流足够智能,以检测何时需要重新洗牌?我有一个管道,其中DataFlow启动所有可用的VM,并将它们保持在5%的利用率,在GroupBy和下游步骤中几乎没有任何进展。我将尝试看看在GroupBy之前运行改组是否有帮助。巴勃罗建议在计数步骤中使用组合器,但没有帮助。问题就在这里。请查看是否可以。更新:数据流无法正确处理从单个GroupBy馈送到多个转换的输出。看见常识表明它应该是可行的,是一种合理的优化,但在现实中,若分配了所有可用的工人,这样的管道将永远卡住。我提交了一个bug,该bug按预期关闭。我不认为数据流工程师有意做出如此糟糕的行为。