相同大小但行长不同的 Spark 读取性能差异

Posted

技术标签:

【中文标题】相同大小但行长不同的 Spark 读取性能差异【英文标题】:Spark read performance difference in same size but with different row lengths 【发布时间】:2017-10-05 08:37:26 【问题描述】:

我正在使用 spark sql 读取 S3 中以 ORC 格式的 2 个不同数据集。但是对于几乎相似大小的数据集,读取的性能差异是巨大的。

数据集 1:包含 212,000,000 条记录,每条记录有 50 列,在 s3 bucket 中以 orc 格式总计高达 15GB

数据集 2:包含 29,000,000 条记录,每条记录有 150 列,在同一 s3 存储桶中以 orc 格式总计高达 15GB

使用 spark sql 读取数据集 1 需要 2 分钟。并且它需要 12 分钟 在相同的基础设施中使用相同的 spark 读取/计数作业读取数据集 2。

每行的长度可能会导致这种巨大差异。谁能帮我理解读取这些数据集的巨大性能差异背后的原因?

【问题讨论】:

【参考方案1】:

假设您使用的是 s3a: 客户端(而不是 Amazon EMR,它是 s3:// 客户端) 它是关于 seek() 正在进行多少工作以及客户端是否对随机 IO 很聪明。本质上:如果您必须关闭 HTTP 连接并创建一个新连接,则 seek() 比 HTTP1.1 GET 非常昂贵。 Hadoop 2.8+ 为此添加了两个特性:HADOOP-14244: Lazy seek 和 HADOOP-13203。高性能随机 IO。

如果您的类路径上有 Hadoop 2.8.+ JAR,请转到:

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

这会损害非随机 IO 的性能(读取 .gz 文件等),但对 ORC/Parquet IO 性能至关重要。

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

【讨论】:

我正在使用 Amazon EMR 和他们的 s3 客户端。有什么我可以尝试测试性能的吗?注意:数据集 1 中的文件数量更多(数据集 2 中为 300,而数据集 2 中为 220) 我怀疑它的跳过量比#of 文件更多,尽管您可以尝试更多地拆分文件。测试性能? ,也许从本地安装 Hadoop 2.8 和带有“用户提供的 JAR”spark.apache.org/downloads.html 的 spark 开始...将其粘贴在 VM 中,然后针对第二个数据集打开搜索。其他策略。将其全部下载到本地并比较 file:// .. 中的性能,这可以作为基准 我认为上面的配置键包含一个错字:我认为这应该是spark.hadoop.fs.s3a.experimental.input.fadvise(缺少.input)。 乔希:抓得很好,对我来说有点尴尬,因为这是我的常数。固定。

以上是关于相同大小但行长不同的 Spark 读取性能差异的主要内容,如果未能解决你的问题,请参考以下文章

电子邮件和 ftp 文本消息之间的大小差异 - EOL 字符?

REST API 响应主体相同但响应大小不同

具有相同颜色(不透明度)和不同字体大小的两个文本块出现不同

2个雪花表,数据相同,大小不同

MaterialButton 与 Button 的大小差异

唯一标识名称和大小相同但内容不同的文件