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



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

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

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

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

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

假设您使用的是 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 客户端是闭源的,恐怕要与他们的支持团队联系。

最新更新