apache-spark - S3 Select 会加速 Parquet 文件的 Spark 分析吗?
问题描述
您可以将S3 Select 与 Amazon EMR 上的 Spark和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 支持 Parquet 文件格式。您能否确认柱状文件格式提供了 S3 Select 提供的主要优化?
解决方案
这是个有趣的问题。我没有任何实数,尽管我已经在 hadoop-aws 模块中完成了 S3 选择绑定代码。Amazon EMR 有一些价值,databricks 也有。
对于 CSV IO 是的,S3 Select 将加快源数据的积极过滤,例如许多 GB 的数据,但返回的数据不多。为什么?尽管读取速度较慢,但您可以节省 VM 的有限带宽。
然而,对于 Parquet,工作人员将一个大文件拆分为多个部分并在它们之间安排工作(假设使用像 snappy 这样的可拆分压缩格式),因此 > 1 个工作人员可以处理同一个文件。而且他们只读取一小部分数据(==带宽收益较少),但他们确实在该文件中四处寻找(==需要优化寻找策略,否则中止和重新打开 HTTP 连接的成本)
如果集群中有足够的容量并且您已经调整了 s3 客户端设置(对于 s3a 这意味着:查找策略、线程池大小、http 池大小),我不相信 S3 集群中的 Parquet 读取可以击败火花集群也为了表现。
就像我说的那样:我不确定。欢迎数字。
推荐阅读
- git - 如何防止在每个 PR(git 流模型)上重新引入已弃用的文件夹作为合并冲突?
- c - VSCode Code Runner 比直接在我的 Linux 终端上运行代码要快
- amazon-emr - PrivaceraCloud:EMR-Spark-Ranger 定价和限制
- amazon-web-services - Amazon S3 下载速度问题
- sql - 从一个表中插入另一个表中没有的值
- node.js - 如何在 heroku 主机上使用 fs 创建 png 文件
- javascript - jQuery append() 没有通过 JavaScript 追加 HTML 中的 input:text 中的值
- linux - 如何提取 curl 请求的参数并使用 bash 将它们附加到 txt 文件的开头
- amazon-s3 - 删除具有任意标签值的 S3 对象
- graphql - 使用 Apollo 和 React 使用列表中的每个元素运行 GraphQL 的最佳实践是什么