S3 Select 会加速 Parquet 文件的 Spark 分析吗?

Posted

技术标签:

【中文标题】S3 Select 会加速 Parquet 文件的 Spark 分析吗?【英文标题】:Would S3 Select speed up Spark analyses on Parquet files? 【发布时间】:2019-04-29 22:51:22 【问题描述】:

您可以使用 S3 Select with Spark on Amazon EMR 和 with Databricks,但仅适用于 CSV 和 JSON 文件。我猜 S3 Select 不提供用于列式文件格式,因为它没有太大帮助。

假设我们有一个包含first_namelast_namecountry 列的人员数据湖。

如果数据存储为 CSV 文件,并且您运行类似 peopleDF.select("first_name").distinct().count() 的查询,则 S3 会将所有列的所有数据传输到 ec2 集群以运行计算。这确实是低效的,因为我们不需要所有的 last_namecountry 数据来运行这个查询。

如果数据存储为 CSV 文件,并且您使用 S3 select 运行查询,则 S3 将仅传输 first_name 列中的数据以运行查询。

spark
  .read
  .format("s3select")
  .schema(...)
  .options(...)
  .load("s3://bucket/filename")
  .select("first_name")
  .distinct()
  .count()

如果数据存储在 Parquet 数据湖中并运行 peopleDF.select("first_name").distinct().count(),则 S3 只会将 first_name 列中的数据传输到 ec2 集群。 Parquet 是一种柱状文件格式,这是主要优点之一。

因此,根据我的理解,S3 Select 无助于加快 Parquet 数据湖的分析,因为列文件格式提供了开箱即用的 S3 Select 优化。

我不确定,因为同事确定我错了,因为S3 Select supports the Parquet file format。您能否确认列文件格式提供了 S3 Select 提供的主要优化?

【问题讨论】:

【参考方案1】:

这是一个有趣的问题。我没有任何实数,尽管我已经在 hadoop-aws 模块中完成了 S3 选择绑定代码。 Amazon EMR 有一些价值,databricks 也有。

对于 CSV IO 是的,S3 Select 将加速源数据的积极过滤,例如很多 GB 的数据,但返回不多。为什么?尽管读取速度较慢,但​​您可以节省 VM 的有限带宽。

不过,对于 Parquet,工作人员将一个大文件拆分为多个部分并在它们之间安排工作(假设使用像 snappy 这样的可拆分压缩格式),因此 > 1 个工作人员可以处理同一个文件。他们只读取一小部分数据(==带宽收益较少),但他们确实在该文件中四处寻找(==需要优化寻找策略,否则中止和重​​新打开 HTTP 连接的成本)

如果集群中有足够的容量并且您已调整 s3 客户端设置(对于 s3a,这意味着:查找策略、线程池大小、http池大小)也用于性能。

就像我说的:我不确定。欢迎数字。

【讨论】:

当您在 Parquet 数据湖上运行 peopleDF.select("first_name").distinct().count() 时,是否将 first_namelast_namecountry 列中的所有数据传输到 ec2 集群,或者仅传输到 ec2 集群中的数据first_name 列转移了吗?我将运行一些基准测试并报告。感谢您的帮助。 S3 Select API 仅支持对行进行过滤和选择。计数之类的事情是在集群中完成的。哦,关于 S3 Select 和 parquet 的另一个细节:select 的输出以 JSON 或 CSV 形式返回,因此正常的 parquet 引擎(及其谓词下推等)在这里不涉及。所以我不知道它是如何在 EMR 或 Databricks 中连接起来的。问他们.... 我的看法很模糊 很抱歉你有这种感觉。请查看issues.apache.org/jira/browse/HADOOP-15229"Add FileSystem builder-based openFile() API to match createFile(); S3A to implementation S3 Select through this API"如果您想了解详细信息;或查看github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aws/src/… 中的代码并在github.com/apache/hadoop/tree/trunk/hadoop-tools/hadoop-aws/src/… 进行测试【参考方案2】:

在 parquet [1] 上遇到了这个用于 s3 选择的 spark 包

[1]https://github.com/minio/spark-select

【讨论】:

以上是关于S3 Select 会加速 Parquet 文件的 Spark 分析吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用存储在 s3 中的 parquet 文件在 Greenplum 中创建外部表

使用 Spark 通过 s3a 将 parquet 文件写入 s3 非常慢

S3 中的最佳最大 Parquet 文件大小

使用 AWS Lambda (Python 3) 读取存储在 S3 中的 Parquet 文件

使用 saveAsTable 将 parquet 数据写入 S3 未完成

如何使用许多小文件加速 Spark 的 parquet 阅读器