【发布时间】: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