0

我正在使用spark sql来读取坐在S3中的ORC格式的2个不同数据集。但对于几乎相似大小的数据集来说,阅读中的性能差异非常大。同样大小但不同行长度的Spark读取性能差异

数据集1:包含2.12亿记录每个50列并且在S3存储桶兽人格式总量可达15GB

数据集2:包含29000000记录每个150列并且在相同S3桶兽人格式总量可达15GB

数据集1正在使用2分钟使用spark sql进行读取。并且在相同的基础设施中采用相同的火花读取/计数作业来读取数据集2的12分钟

每行的长度可能会导致这种巨大的差异。任何人都可以帮助我理解阅读这些数据集时巨大性能差异背后的原因吗?

回答

1

假设你正在使用的S3A:客户端(而不是亚马逊EMR &它的S3://客户端) 它大概是多少SEEK()的工作是怎么回事,客户端是否是聪明约随机IO或不。从本质上说:seek()在HTTP1.1上非常昂贵,如果你必须关闭HTTP连接并创建一个新连接, Hadoop 2.8+为此添加了两个功能:HADOOP-14244:懒惰搜索和HADOOP-13203。高性能随机IO。 。

如果您对您的classopath Hadoop的2.8 +罐子,去:

spark.hadoop.fs.s3a.experimental.fadvise random

这将损害非随机IO性能(读取。广州文件等),但关键ORC/Parquet IO perf。

如果您正在使用Amazon EMR,他们的s3客户端是封闭源代码,请与他们的支持团队联系,恐怕。

+0

我正在使用亚马逊EMR和他们的S3客户端..任何我可以尝试测试性能?注意:数据集1中的文件数量更多(数据集2中的文件数量为300)。 –

+0

我怀疑它比#of文件跳过的次数多,但您可以尝试更多地分割文件。测试性能? ,也许从本地安装Hadoop 2.8并使用“用户提供的JARs”https://spark.apache.org/downloads.html进行启动......将其粘贴到虚拟机中,然后将该搜索与第二个数据集。其他策略。将它全部下载到本地,并比较文件中的perf:// ..这可以是基准 –