首页 > 解决方案 > S3 Select 会加速 Parquet 文件的 Spark 分析吗?

问题描述

您可以将S3 Select 与 Amazon EMR 上的 SparkDatabricks 一起使用,但仅适用于 CSV 和 JSON 文件。我猜 S3 Select 不提供用于列式文件格式,因为它没有太大帮助。

假设我们有一个包含 和 列的人员first_name数据湖last_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 支持 Parquet 文件格式。您能否确认柱状文件格式提供了 S3 Select 提供的主要优化?

标签: apache-sparkamazon-s3parquet

解决方案


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

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

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

如果集群中有足够的容量并且您已经调整了 s3 客户端设置(对于 s3a 这意味着:查找策略、线程池大小、http 池大小),我不相信 S3 集群中的 Parquet 读取可以击败火花集群也为了表现。

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


推荐阅读