Google Dataflow / Apache Beam Python - PCollection 的侧面输入会降低性能

2023-12-13

我们正在使用 Python SDK 在 google 数据流中运行日志文件解析作业。数据分布在数百个每日日志中,我们通过云存储中的文件模式读取这些日志。所有文件的数据量约为 5-8 GB(gz 文件),总共 50-8000 万行。

loglines = p | ReadFromText('gs://logfile-location/logs*-20180101')

此外,我们还有一个简单(小)的映射 csv,它将日志文件条目映射到人类可读的文本。大约有 400 行,5 kb 大小。

例如,带有 [param=testing2] 的日志文件条目应映射到最终输出中的“客户请求 14 天免费产品试用”。

我们在带有 sideinput 的简单 beam.Map 中执行此操作,如下所示:

customerActions = loglines | beam.Map(map_logentries,mappingTable)

其中map_logentries是映射函数,mappingTable是映射表。

然而,只有当我们通过 open() / read() 读取本机 python 中的映射表时,这才有效。如果我们通过 ReadFromText() 使用光束管道执行相同的操作,并将生成的 PCollection 作为侧输入传递到 Map,如下所示:

mappingTable = p | ReadFromText('gs://side-inputs/category-mapping.csv')    
customerActions = loglines | beam.Map(map_logentries,beam.pvalue.AsIter(mappingTable))

性能完全下降到每秒大约 2-3 个项目。

现在,我的问题是:

  1. 为什么性能会如此严重,通过考试有什么问题 PCollection 作为侧面输入?
  2. 如果可能不建议使用 PCollections 作为侧面输入,应该如何构建,例如 需要可以/不应该硬编码到的映射的管道 映射函数?

对于我们来说,映射确实经常变化,我需要找到一种方法让“普通”用户提供它。我们的想法是让映射 csv 在 Cloud Storage 中可用,并通过 ReadFromText() 将其简单地合并到管道中。在本地读取它涉及到向工作人员提供映射,因此只有技术团队可以做到这一点。

我知道侧面输入存在缓存问题,但这肯定不适用于 5kb 输入。

上面的所有代码都是伪代码,用于解释问题。对此的任何想法和想法将不胜感激!


为了更有效的侧面输入(小到中等尺寸),您可以使用 beam.pvalue.AsList(mappingTable) since AsList使 Beam 实现数据,因此您确信您将获得该 pcollection 的内存列表。

旨在用于侧面参数规范——相同的地方 其中使用了 AsSingleton 和 AsIter,但强制实现 此 PCollection 作为列表。

Source: https://beam.apache.org/documentation/sdks/pydoc/2.2.0/apache_beam.pvalue.html?highlight=aslist#apache_beam.pvalue.AsList

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Dataflow / Apache Beam Python - PCollection 的侧面输入会降低性能 的相关文章

随机推荐