当前位置: 首页 > news >正文

【Iceberg分析】Spark与Iceberg集成落地实践(一)

Spark与Iceberg集成落地实践(一)

文章目录

  • Spark与Iceberg集成落地实践(一)
    • 清理快照与元数据
      • 配置表维度自动清理元数据文件属性
      • 手动清理
    • 清理孤岛文件
    • 合并数据文件

清理快照与元数据

配置表维度自动清理元数据文件属性

每一次写入数据和表变更都会进行一次元数据的版本迭代,默认保存所有。

PropertyDescription
write.metadata.delete-after-commit.enabled每次表提交后是否删除旧的跟踪的元数据文件
write.metadata.previous-versions-max要保留的旧元数据文件的数量

SPARK DDL语句

建表时确认metadata生命周期

		sparkSession.sql("CREATE TABLE local.iceberg_db.table2( id bigint, data string, ts timestamp) USING iceberg PARTITIONED BY (day(ts)) TBLPROPERTIES('write.metadata.delete-after-commit.enabled'='true','write.metadata.previous-versions-max'='3')");

更改表的metadata生命周期

        sparkSession.sql("ALTER TABLE local.iceberg_db.table2 SET TBLPROPERTIES(" +"'write.metadata.delete-after-commit.enabled'='true'," +"'write.metadata.previous-versions-max'='3'" +")");

作用

这只会删除元数据日志中跟踪的元数据文件,而不会删除孤立的元数据文件。

清理从metadata.json链路开始的至data的所有文件,如下图:

数据层
元数据层
data file1
data file2
data file3
data file4
v2.metadata.json
Manifest list1
Manifest file1
Manifest file2

手动清理

        org.apache.iceberg.Table table = org.apache.iceberg.spark.Spark3Util.loadIcebergTable(spark, "local.iceberg_db.table2");long tsToExpire = System.currentTimeMillis() - (1000 * 60 * 60 * 24); // 保留一天org.apache.iceberg.spark.actions.SparkActions.get().expireSnapshots(table).expireOlderThan(tsToExpire).execute();

清理孤岛文件

孤岛文件的产生:

在 Spark 和其他分布式处理引擎中,任务或作业失败可能会留下未被表元数据引用的文件,在某些情况下,正常快照过期可能无法确定文件不再需要并将其删除。任务失败之后,最好进行一次清理表孤岛文件,若表相关任务成功,则不需要进行清理孤岛文件操作。

		org.apache.iceberg.Table table = org.apache.iceberg.spark.Spark3Util.loadIcebergTable(spark, "local.iceberg_db.table2");org.apache.iceberg.spark.actions.SparkActions.get().deleteOrphanFiles(table).execute();

合并数据文件

目前发现,需要分区类有标记删除的记录才会进行合并,why?

		org.apache.iceberg.Table table = org.apache.iceberg.spark.Spark3Util.loadIcebergTable(spark, "local.iceberg_db.table2");org.apache.iceberg.spark.actions.SparkActions.get().rewriteDataFiles(table).filter(Expressions.equal("ts", "2024-09-29")).option("target-file-size-bytes", Long.toString(500 * 1024 * 1024)) // 目标大小500 MB.execute();

http://www.mrgr.cn/news/44719.html

相关文章:

  • springboot aop判定用户ip访问次数受限了该如何通知用户
  • C#-委托delegate
  • SafeEar:AI 音频伪造检测的崭新时代
  • 日本数据保护要求
  • 【IC】基于systemverilog(UVM)断言
  • YoloV10改进策略:BackBone改进|CAFormer在YoloV10中的创新应用,显著提升目标检测性能
  • 【含文档】基于Springboot+Android的个人财务系统的设计与实现(含源码+数据库+lw)
  • 家庭用超声波清洗机好用吗?推荐四款性能绝佳的超声波清洗机!
  • shell脚本中for循环的用法
  • 多模态大模型调研BLIP、BLIP2、InstructBLIP
  • java数据类型转换和注释
  • Nginx的正向与反向代理
  • 音视频开发之旅(88) - 视频画质评测算法之Dover
  • VADv2 论文学习
  • C(十五)函数综合(一)--- 开公司吗?
  • 第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)
  • 分治算法(2)_快速排序_排序数组
  • 不同jdk版本间的替换
  • 原神5.1前瞻网页HTML+CSS+JS
  • WPF 手撸插件 八 操作数据库一