优化 Iceberg 表的性能

打印 上一主题 下一主题

主题 991|帖子 991|积分 2973

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
启动 spark-sql

由于 iceberg 相干的 jars 已经在 ${SPARK_HOME}/jars 目次,以是不用 --jars 大概 --package 参数。
  1. spark-shell --master local[1] \
  2.     --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
  3.     --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \
  4.     --conf spark.sql.catalog.spark_catalog.type=hive
复制代码
Compaction – 合并

特别是及时计算,每次插入特别少的记录,导致生成大量的文件。
表参考上一节的 orders
  1. CALL spark_catalog.system.rewrite_data_files(table => 'iceberg.orders', options => map('min-input-files','2'));
复制代码
rewrite_data_files 参数说明和输出说明
Partial Progress

Compaction之前,把文件举行分组。
每组文件合并之后,就生成一个新的快照,如许新的查询就可以利用合并的快照。也能防止大 Compaction 的 OOM 标题。必要平衡创建快照的代价和Partial Progress 的收益。可以用 max-commits 调节 compaction job 的最多提交次数。
  1. call spark_catalog.system.rewrite_data_files(
  2. table => 'tablename',
  3. strategy => 'binpack',
  4. where => 'created_at between "2024-09-20 00:00:00" and "2024-09-26 23:59:59"',
  5. options => map(
  6.   'rewrite-job-order', 'byte-asc',
  7.   'target-file-size-bytes',1073741824,
  8.   'max-file-group-size-bytes',10737418240,
  9.   'partial-progress-enabled', 'true'
  10.   )
  11. );
复制代码
注意: created_at 是字段名。
自动合并

使用调度系统大概 crontab。
隐式分区信息

分区信息不依赖于文件的物理结构,是在 snapshot 文件和 manifest 文件中。
Partition 进化

表刚开始大概按 year 举行分区。
  1. CREATE TABLE spark_catalog.memembers(...) PARTITIONED BY years(registration_ts) USING iceberg;
复制代码
随后大概改成按 months 举行分区
  1. ALTER TABLE spark_catalog.memembers(...) ADD PARTITION FIELD months(registration_ts);
复制代码
还可以删除分区字段
  1. ALTER TABLE spark_catalog.memembers(...) DROP PARTITION FIELD BUCKET(24,ID);
复制代码
更改分区字段,新的写入立刻生效。老的数据用 rewriteDataFiles 生效。
Copy-on-Write 和 Merge-on-Read 的对比

| 更新模式 | 读速度 | 写速度(updates/deletes) | 最佳实践 |
| : – | :-- | :__ | :-- |
| Copy-on-Write | 最快 | 最慢 | |
| Merge-on-Read(position deletes) | 快 | 快 | 使用常规合并减少读开销 |
| Merge-on-Read(equality deletes) | 慢 | 最快 | 使用更频繁的合并减少读开销 |
设置

  1. CREATE TABLE spark_catalog.people (
  2. id int,
  3. first_name string,
  4. last_name string)
  5. TBLPROPERTIES (
  6.   'write.delete.mode'='copy-on-write',
  7.   'write.update.mode'='merge-on-read',
  8.   'write.merge.mode'='merge-on-read'
  9.   )
复制代码
其他考虑事项

统计信息收集(Metrics Collection)

如果表的字段非常多,大概照成 meta 文件特别大,可以关闭某些字段的收集大概限制收集的内容。
  1. alter table spark_catalog.dbname.tablename set TBLPROPERTIES (
  2. 'write.metadata.metrics.column.col1' = 'none',
  3. 'write.metadata.metrics.column.col2' = 'full',
  4. 'write.metadata.metrics.column.col3' = 'counts',
  5. 'write.metadata.metrics.column.col4' = 'truncate(16)');
复制代码
none: 不收集
counts: 仅收集 count(values, distinct values, null values),没有最大最小值。
truncate(xx): count 和最大最小值截断到指定位数。如 count distinct values时,仅统计截断后的 distinct。
full: 全部收集
Iceberg 默认 truncate(16)
重新 Manifests (Rewriting Manifests)

  1. call spark_catalog.system.rewrite_manifests('MyTable');
复制代码
如果抛出 OOM,可以关闭 spark caching。
  1. call spark_catalog.system.rewrite_manifests('MyTable', false);
复制代码
优化存储(Optimizing Storage)

设置快照保存的数目
  1. call spark_catalog.system.expire_snapshots('MyTable',
  2.   TIMESTAMP('2024-09-10 00:00:00.000', 100));
复制代码
第2个参数设置了在此之前的快照都可以被扫除。如果快照的数目少于第3个参数设置的数目,则不扫除。
第3个参数设置了保存近来100个快照。
删除指定的快照ID,以下示例删除 ID 为 53 的快照。
  1. call spark_catalog.system.expire_snapshots('MyTable',
  2.   snapshot_ids => ARRAY(53));
复制代码
删除孤立文件

没有包含在 manifest 中的文件,如失败的作业创建的文件。
  1. call spark_catalog.system.remove_orphan_files('MyTable');
复制代码
写入分布式模式(Write Distribution Mode)

  1. ALTER TABLE spark_catalog.MyTable SET TBLPROPERTIES(
  2. 'write.distribution-mode'='hash',
  3. 'write.delete.distribution-mode'='none',
  4. 'write.update.distribution-mode'='range',
  5. 'write.merge.distribution-mode'='hash',
  6. )
复制代码
对象存储考虑事项(Object Storage Considerations)

设置对象存储,会在表目次下创建多个写目次,分散 prefix 的压力。
  1. alter table orders set tblproperties ('write.object-storage.enabled'=true);
复制代码
数据文件布隆过滤器(Datafile Bloom Filters)

  1. ALTER TABLE spark_catalog.MyTable SET TBLPROPERTIES(
  2. 'write.parquet.bloom-filter-enabled.column.col1' = true,
  3. 'write.parquet.bloom-filter-max-bytes' = 1048576
  4. )
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表