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

标签 apache-spark amazon-s3 apache-spark-sql performance-testing

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

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

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

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

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

最佳答案

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

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

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

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

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

关于apache-spark - 相同大小但行长度不同的 Spark 读取性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46581239/

相关文章:

scala - UDF 标量返回 [max,index]

mysql - Spark ETL作业只执行一次mysql

java - AWS SDK Java TransferManager 限制下载大小

ruby-on-rails - Rails Heroku 服务器回形针 Amazon S3 - AWS::S3::Errors::RequestTimeout

php - 如何在我的网站上显示来 self 的 Amazon S3 的图像?

java - 在 Spark SQL 中加载 JDBC 表时数据不正确

scala - 是否可以为 Spark ML 中的随机森林创建通用训练管道?

apache-spark-sql - 通过 JDBC 驱动程序将 Spark 连接到 HAWQ

apache-spark - 在 Spark SQL 中使用 Presto JDBC 时无法识别的连接属性 'url'

java - Apache Spark 对常规文件的行为