SideInput I/O 会影响性能

     2023-03-31     8

关键词:

【中文标题】SideInput I/O 会影响性能【英文标题】:SideInput I/O kills performance 【发布时间】:2020-01-24 13:59:21 【问题描述】:

我正在使用 Python SDK 2.15.0 构建数据流管道。在此管道中,我需要在管道的多个阶段将附加数据连接到每个元素。

所有这些额外数据都是从 Google Cloud Storage 上的 avro 文件(Dataflow 和 GCS 存储桶使用的同一区域)中读取的,使用 map 函数组织为键值元组,然后使用 pvalue 作为侧输入传递给 DoFn .AsDict()。侧输入数据在管道执行期间不会改变。

第一次连接(侧输入大小 ~ 1 MB)非常顺利。但是,第二次加入确实表现不佳。它的 sideinput 大小约为 50 MB。

数据流执行图清楚地显示了导致性能不佳的原因:我的 ParDo 步骤消耗的大约 90% 的时间用于读取侧面输入。即使我只使用四个工作节点,从 sideinput 读取的数据量也超过其实际大小几个数量级。

我能做些什么来防止这种情况发生吗?我是否需要以某种方式配置工作缓存大小?在我的 DoFn 的 setup 方法中准备附加数据而不是将其作为 sideinput 传递会更好吗?

这是我准备侧输入的方法:

sideinput_1 = pvalue.AsDict(p | "Read side input data 1" >> beam.io.ReadFromAvro("gs:/bucket/small_file.avro",0,False,True) \
                              | "Prepare sideinput 1" >> beam.Map(lambda x: (x["KEY"],x["VALUE"])))

# Preparing data for later join
sideinput_2 = pvalue.AsDict(p | "Read side input data 2" >> beam.io.ReadFromAvro("gs://bucket/bigger_file.avro",0,False,True) \
                              | "Prepare side input data 2" >> beam.Map(lambda x: ((x["KEYCOL1"],x["KEYCOL2"],x["KEYCOL3"]),x)))

使用侧输入:


matching = p | "Read address data" >> beam.io.Read(beam.io.BigQuerySource(query=sql_addr, use_standard_sql=True)) \
                 | "Join w/ sideinput1" >> beam.ParDo(Join1(), sideinput_1 ).with_outputs('unmatched', main='matched')                                                                                

result = matching["matched"] | "Join Sideinput 2" >> beam.ParDo(Join2(), sideinput_2 )

DoFn 处理方法只包含在侧输入中查找键并根据是否匹配,向元素添加一些额外的数据。

【问题讨论】:

好的,一旦我使用 pvalue.AsList() 将 dict 作为列表传递,似乎会变得更好。根据源代码文档 (beam.apache.org/releases/pydoc/2.4.0/…),AsList 强制实现侧面输入。似乎 AsDict 没有。有没有办法强制实现字典的实现?为了能够将字典作为列表传递,我将它包装在一个仅包含一个元素的列表中 - 字典。不喜欢这个方案,但它的性能确实好很多。 【参考方案1】:

好的,一个月后再讨论,根据所获得的经验,让我再试一次:

我很确定侧输入的性能问题归结为内存交换问题。在管道中,还有一些其他连接非常相似,但侧输入要小得多。他们以合理的挂墙时间运行。但是,所有这些连接的比率(IO 字节/侧输入字节)大致相等。

当我将实现从带有 SideInput 的 ParDo 切换到 CoGroupByKey Transform 时,受影响连接的性能提高了几个数量级。

关于侧输入的大小以及何时更喜欢 CoGroupByKey 而不是带有 SideInput 的 DoFn:

great blog entry "Guide to common Cloud Dataflow use-case patterns" 声明可以将 ParDo 用于流式传输中高达 100 MB 和批处理模式下高达 1 GB 的 SideInput:

注意:如果可能,将 SideInputs 用于其中一个连接表实际上很小的任何活动 - 在流模式下大约 100MB 或在批处理模式下小于 1GB。这将表现得更好[...]。

我想没有适合每种情况的通用阈值。可能在很大程度上取决于您的管道、机器类型和工人数量等。就我而言,我认为由于管道的高度复杂性,阈值较低。它由大约 40 个转换组成,包括几个连接。

因此,如果您在使用 ParDo 和 Sideinput 进行连接时遇到同样的问题,您可能需要尝试 CoGroupByKey-Transform。

【讨论】:

pread中偏移的时间复杂度?(代码片段)

...模式非常重要。从SSD读取随机偏移量不会对性能产生太大影响,而从旋转磁盘或磁带读取随机偏移量会大大影响性能。任何缓存如何影响性能?优化策略如预读如何?所以,如果你想要答案偏移的时间复杂度是多少?我们只是跳... 查看详情

nio?是啥

...字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。JavaNIO非堵塞技术实际是采取Reactor模式,或者说是Observer模... 查看详情

磁盘i/o性能优化的几个思路(代码片段)

...联网大厂面试真题,面试攻略,高效学习资料等虽然I/O的性能指标很多,相应的性能分析工具也有好几个,但理解了各种指标的含义后,你就会发现它们其实都有一定的关联。顺着这些关系往下理解,你就会发现,掌握这些常用... 查看详情

i/o

...作,  9.2、当线程进行一个I/O操作时,会被挂起,从而影响性能,为了解决这类问题,Windows使用了一套非常好的机制I/O完成端口。  9.3、用于进行输入输出的操作都可以叫I/O,如:文件、USB、设备操作都统称为I/O操作、网... 查看详情

使用异步i/o大大提高应用程序的性能

转自:https://www.ibm.com/developerworks/cn/linux/l-async/AIO简介Linux中最常见的输入输出(I/O)模型是同步I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待... 查看详情

elasticsearch(es)配置及优化

...置:索引和分片的数量和配置会对查询并发性能产生影响。如果索引和分片的数量太少,可能会导致查询性能不佳,而如果数量过多,可能会增加网络和节点之间的通信开销。因此,需要根据实际的查询负载... 查看详情

javanio开发实例

...由  于系统常常在进行网络读写时处于阻塞状态会大大影响系统的性能自Java开始引入  了NIO(新I/O)API通过使用非阻塞型I/O实现流畅的网络读写操作为开发高性能并发  型服务器程序提供了一个很好的解决方案这就是javanio... 查看详情

node.js性能优化

...号留言。Node.js作为后台服务性能是非常关键的一点,而影响Node.js的性能不仅仅要考虑其本身的因素,还应该考虑所在服务器的一些因素。比如网络I/O、磁盘I/O以及其他内存、句柄等一些问题。下面将详细地分析影响其性能的因... 查看详情

java性能优化之使用nio提升性能

...场合都会成为系统的瓶颈。提升I/O速度,对提升系统整体性能有着很大的好处。在Java的标准I/O中,提供了基于流的I/O实现,即InputStream和OutputStream。这种基于流的实现以字节为单位处理数据,并且非常容易建立各种过滤器。NIO是... 查看详情

检测解决sqlserver延迟阻塞i/o问题

...能导致阻塞或延迟I/O问题并且很快对SQLServer性能产生消极影响    上述问题对SQLServer的影响因问题细节的不同而差异很大但它们通常导致阻塞锁存器争用和超时过长的响应时间以及资源的过度利用    阻塞I/O是指必须进... 查看详情

cpu正常,但是%util一直是100,为啥?

vmstatiostattopCPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。await值的大小一般取决与svctm的值和I/O队列长度以及I/O请求模式。1,svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好。2,a... 查看详情

网站架构

1、网站的性能影响因素很多1)网络负载:公网负载、内网负载2)WEB应用服务器性能:CPU、存储、I/O访问、内存、并发TCP/IP连接数3)数据库服务器性能:数据库参数配置、服务器性能(CPU、内存、存储)、数据结构的合理性4)不同WEB... 查看详情

磁盘模式

...不置零。所以当有I/O操作时,只需要做置零的操作。磁盘性能较好,时间短,适合于做池模式的虚拟桌面2、厚置备置零(thick):创建群集功能的磁盘。创建磁盘时,直接从磁盘分配空间,并对磁盘保留数据置零。所以当有I/O操... 查看详情

一文读懂高性能网络编程中的i/o模型

...塞式的服务端架构模式已经无能为力。本文(和下篇《高性能网络编程(六):一文读懂高性能网络编程中的线程模型》)旨在为大家提供有用的高性能网络编程的I/O模型概览以及网络服务进程模型的比较,以揭开设计和实现高性... 查看详情

asp中如何解决某个数据表i/o太过频繁影响服务器性能的问题?

...行读取操作,当网站出现并发访问时,导致I/O太过频繁而影响到整个服务器性能下降?请问有什么办法可以解决?如果使用数据缓存应该是最理想的,但ASP缓存10多万条数据好像没有ASP.NET那么好操作,能不能在后台用asp.net将数... 查看详情

Redshift 性能:连接列上的编码

...为您的DISTKEY上的编码甚至会因为减少磁盘I/O而产生积极影响。根据AWStabledesignplaybook,有一些极端情况确 查看详情

kvm性能优化(代码片段)

...超过物理机CPU的总数目。如果超过,则将对性能带来严重影响,建议选择复制主机CPU配置。2、内存的优化(1)KSM(KernelSamepageMerging,相同页合并)内存分配的最小单位是page(页面),默认大小是4KB,可以将host机内容相同的内... 查看详情

rk3399平台开发系列讲解(i/o篇)8.6i/o的性能评估

查看详情