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_name
、last_name
和country
列的人员数据湖。
如果数据存储为 CSV 文件,并且您运行类似 peopleDF.select("first_name").distinct().count()
的查询,则 S3 会将所有列的所有数据传输到 ec2 集群以运行计算。这确实是低效的,因为我们不需要所有的 last_name
和 country
数据来运行这个查询。
如果数据存储为 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_name
、last_name
和 country
列中的所有数据传输到 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 非常慢
使用 AWS Lambda (Python 3) 读取存储在 S3 中的 Parquet 文件