Iceberg 合并datafiles、manifest files,清除过期snapshot、删除孤立文件

本文Iceberg使用的为HiveCataLog,依赖HiveMemstore

1、首先获取要操作的表对象及SparkSession

import org.apache.iceberg.{CatalogProperties, Table}
import org.apache.iceberg.spark.actions.SparkActions
......
......
......
//获取表
val tabled: TableIdentifier = TableIdentifier.of(Namespace.of("ns"), "tb")
val table: Table = hiveCatalog.loadTable(tabled)
//获取SparkSession
val sparkConf = new SparkConf()
val sparkSession: SparkSession = SparkSession.builder()
      .master("local")
      .appName("iceberg")
      .config(sparkConf)
      .getOrCreate()

2、 合并datafiles

filter 可以指定需要操作的数据范围
option 指定合并的目标文件大小

SparkActions
      .get(sparkSession)
      .rewriteDataFiles(table)
      .filter(Expressions.lessThan("age", 1))
      .filter(Expressions.greaterThan("age", 10))
      .option("target-file-size-bytes", (128 * 1024 * 1024).toString) // 128 MB
      .execute()

3、合并manifest files

SparkActions
      .get(sparkSession)
      .rewriteManifests(table)
      .rewriteIf(file =>file.length() < 10 *1024*1024)  // 10 MB
      .execute()

4、删除过期快照

  • 方法一
val before: Long = System.currentTimeMillis() - (1000L * 60 * 60 * 24)
table.expireSnapshots()
   .expireOlderThan(before)
   .commit()
  • 方法二
val before: Long = System.currentTimeMillis() - (1000L * 60 * 60 * 24)
SparkActions.get(sparkSession)
      .expireSnapshots(table)
      .expireOlderThan(before)
      .execute();

5、删除孤立文件

为啥会产生孤立文件?

  • 情况1:计算引擎执行任务失败,会产生不会metadata.json引用的datafile 和metadata file
  • 情况2:标记快照为过期,需要删除没有被引用的datafile,但无法确定该datafile是否被快照引用,导致本该删除datafile却没有被删除
val before: Long = System.currentTimeMillis() - (1000L * 60 * 60 * 24)
SparkActions.get(sparkSession)
	  .deleteOrphanFiles(table)
	  .olderThan(before)
	  .execute()

孤立文件的删除会耗费很长的时间,所以不要频繁进行孤立文件的删除

6、删除旧版本的metadata file

iceberg 每次write都会产生一个新的snapshot,同时也会产生一个新的version。建议给表设置对应的参数:

write.metadata.delete-after-commit.enabled=true
write.metadata.previous-versions-max=5

这样每次对标产生改变的操作commit后,会自动删除老的metadata files,保留指定版本数量的metadata files

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xhaoDream

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值