【问题标题】:How to find optimum Spark-athena file size如何找到最佳的 Spark-athena 文件大小
【发布时间】:2023-01-05 13:31:40
【问题描述】:

我有一个写入 s3 存储桶的 spark 作业,并在此位置顶部有一个 athena 表。 该表已分区。 Spark 正在为每个分区写入 1GB 单个文件。我们试验了 maxRecordsPerFile 选项,因此每个文件只写入 500MB 数据。在上面的例子中,我们最终得到了 2 个文件,每个文件都带有 500MB 这在 EMR 上节省了 15 分钟的运行时间 但是,雅典娜出了问题。 Athena 查询 CPU 时间开始随着新的文件大小限制而变得更糟。 我尝试在执行前后将相同的数据与相同的查询进行比较,这是我发现的:

分区列 = source_system, execution_date, year_month_day

我们试过的查询:

select *
from dw.table
where source_system = 'SS1'
and year_month_day = '2022-09-14'
and product_vendor = 'PV1'
and execution_date = '2022-09-14'
and product_vendor_commission_amount is null
and order_confirmed_date is not null
and filter = 1
order by product_id 
limit 100;

执行时间处理时间: 之前:6.79s 之后:11.102s

Explain analyze 表明新结构必须扫描更多数据。 之前:CPU: 13.38s, Input: 2619584 rows (75.06MB), Data Scanned: 355.04MB; per task: std.dev.: 77434.54, Output: 18 rows (67.88kB)

之后:CPU: 20.23s, Input: 2619586 rows (74.87MB), Data Scanned: 631.62MB; per task: std.dev.: 193849.09, Output: 18 rows (67.76kB)

你能指导我为什么这需要两倍的时间吗?需要注意什么?文件大小是否有最适合 spark 和 athena 组合的最佳点?

【问题讨论】:

  • 这里使用的文件格式是什么?在写作时,您是否尝试过对值进行排序,以便谓词可以跳过条纹?
  • 输出格式为镶木地板。我没有改变我们的写作方式,因为它是一个更大的数据集,并且被多个团队用于不同的用例,而我使用的查询是针对 1 个这样的案例。

标签: performance apache-spark amazon-athena


【解决方案1】:

一种假设是下推过滤器对单文件策略更有效。

来自 AWS 大数据博客帖子标题Top 10 Performance Tuning Tips for Amazon Athena

Parquet 和 ORC 文件格式都支持谓词下推(也 称为谓词过滤)。两种格式都有数据块 表示列值。每个区块都保存着该区块的统计信息, 例如最大/最小值。运行查询时,这些统计信息 确定块是否应该被读取或跳过取决于 查询中使用的过滤器值。这有助于减少扫描的数据和 改进查询运行时。要使用此功能,请添加更多过滤器 在查询中(例如,使用 WHERE 子句)。

优化要跳过的块数的一种方法是识别 并在编写您的 ORC 或之前按常用过滤列排序 镶木地板文件。这确保了最小值和最大值之间的范围 块内的值在每个块内尽可能小。 这使它有更好的机会被修剪并减少数据 进一步扫描。

为了测试它,我建议如果可能的话再做一个实验。更改 spark 作业并对数据进行排序,然后再将其持久化到两个文件中。使用以下顺序: source_systemexecution_dateyear_month_dayproduct_vendorproduct_vendor_commission_amountorder_confirmed_datefilterproduct_id。然后检查查询统计信息。

至少数据集会针对呈现的用例进行优化。否则,根据最繁重的查询更改它。

该帖子也讨论了最佳文件大小,它给出了一般的经验法则。根据我的经验,Spark 适用于 128MB 到 2GB 之间的大小。它也适用于其他查询引擎,例如 Athena 使用的 Presto。

【讨论】:

  • 谢谢埃默。是的,我确实看到了文档。问题仍然是——如果有更多的文件,它会实现更多的并行性,即使 spark 必须读取 2 个镶木地板文件的元数据来进行分区修剪,我希望运行时间会缩短吗?是的,我尝试了 125M、250M 和 500M 的文件大小,所有这些都延长了查询运行时间。由于数据集被各种团队广泛用于各种用例,因此我无法在写入时进行排序。但会试一试!我仍然想知道适合 Athena 和 spark 的文件大小是多少。
【解决方案2】:

你能找到解决方案吗?我的建议是将 year_month_day/execution date(主要用于查询)拆分为 Year、Month 和 Day 分区,这将减少数据扫描量和高效过滤。

【讨论】:

  • 您的答案可以通过其他支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写出好的答案的信息in the help center
猜你喜欢
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2018-08-30
相关资源
最近更新 更多