如何解决 Data Lake Gen2 中过多的 ADF/Databricks parquet Azure blob 写入成本

How to solve excessive ADF/Databricks parquet Azure blob write costs in Data Lake Gen2

我正在比较将 JSON 文件的不同加载方式与 parquet 文件加载到 Data Lake Gen 2 中,但在每个测试场景中,blob 存储成本过高,预计每月数千美元,原因是“热写操作”(在 blob 计费中列出)。

每日负载场景:

无论采用何种方法,结果都是相似的:数据工厂映射流、Synapse 和 Databricks:blob 操作的成本是计算本身的 3-5 倍。即使在一批 运行 时,每个垂直分区键也会生成多个镶木地板文件。当然,随着时间的推移,这将需要压缩以优化读取性能,但直接的写入成本已经引起了对方法的质疑。

这是示例 Databricks 代码:

file_location = "abfss://files@<storageaccountname>.dfs.core.windows.net/<foldername>/*.json"
df = spark.read.option("multiline", "true").json(file_location)
df.repartition('PartitionKey')
df.write.partitionBy('PartitionKey').parquet('abfss://files@<storageaccountname>.dfs.core.windows.net/Results)

Synapse笔记本和上面差不多。 在数据工厂映射流程中,从 JSON 到 Parquet 的简单转换,没有其他步骤。 我不得不使用映射流,因为标准副本 activity 不支持分区。

测试用例一次处理 150 个,但在现实生活中平均每小时处理 7 个文件,这使得解决方案更容易在白天生成更多小文件。

如何在这些方法中的任何一种中降低 blob 写入成本,或者有哪些替代方法? 我们已经验证,即使文件不经常压缩,应用程序的读取性能也是可以接受的。问题纯粹是写入成本。

我认为更好的解决方案是从源中提取本机 JSON 格式的数据,然后仅在特定时间间隔(如一天结束)压缩它们,具体取决于您在单独管道中的要求。

分区数过多导致存储操作成本高。更改分区策略导致 IO 操作和成本显着减少。