S3 Select是否可以加快对Parquet文件的Spark分析?

时间:2019-04-29 22:51:22

标签: apache-spark amazon-s3 parquet

您可以使用S3 Select with Spark on Amazon EMRwith 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 个答案:

答案 0 :(得分:1)

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

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

但是对于Parquet,工作人员将一个大文件分割成多个部分,并计划在其中进行工作(假设使用了可拆分的压缩格式,例如snappy),因此> 1个工作人员可以处理同一个文件。而且他们只读取了一部分数据(==减少了带宽带来的好处),但是他们确实在该文件中四处查找(==需要优化查找策略,否则中止和重​​新打开HTTP连接的成本)

我不认为如果集群中有足够的容量,并且您已经调整了s3客户端设置(对于s3a,这意味着:查找策略,线程池大小,http,池大小)以提高性能。

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