# Apache Iceberg 中文教程2-表配置

本文详细介绍了ApacheIceberg的表配置,包括表属性(如读写行为、默认值和描述)、Catalog属性、Hadoop配置以及与HiveCatalog的集成,涉及表锁定机制和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Apache Iceberg 中文教程2-表配置

表属性

Iceberg表支持使用表属性来配置表的行为,例如读取器的默认拆分大小。

读取属性

属性名默认值描述
read.split.target-size134217728 (128 MB)合并数据输入拆分时的目标大小
read.split.metadata-target-size33554432 (32 MB)合并元数据输入拆分时的目标大小
read.split.planning-lookback10在合并输入拆分时要考虑的bin数
read.split.open-file-cost4194304 (4 MB)打开文件的估计成本,在合并拆分时作为最小权重使用
read.parquet.vectorization.enabledtrue控制是否使用Parquet矢量化读取
read.parquet.vectorization.batch-size5000Parquet矢量化读取的批处理大小
read.orc.vectorization.enabledfalse控制是否使用ORC矢量化读取
read.orc.vectorization.batch-size5000ORC矢量化读取的批处理大小

写入属性

属性名默认值描述
write.format.defaultparquet表的默认文件格式;parquet、avro或orc
write.delete.format.defaultdata file format表的默认删除文件格式;parquet、avro或orc
write.parquet.row-group-size-bytes134217728 (128 MB)Parquet行组大小
write.parquet.page-size-bytes1048576 (1 MB)Parquet页面大小
write.parquet.page-row-limit20000Parquet页面行数限制
write.parquet.dict-size-bytes2097152 (2 MB)Parquet字典页面大小
write.parquet.compression-codecgzipParquet压缩编解码器:zstd、brotli、lz4、gzip、snappy或uncompressed
write.parquet.compression-levelnullParquet压缩级别
write.parquet.bloom-filter-enabled.column.col1(not set)提示Parquet为列col1编写一个Bloom过滤器
write.parquet.bloom-filter-max-bytes1048576 (1 MB)Bloom过滤器位集的最大字节数
write.avro.compression-codecgzipAvro压缩编解码器:gzip(deflate级别9)、zstd、snappy或uncompressed
write.avro.compression-levelnullAvro压缩级别
write.orc.stripe-size-bytes67108864 (64 MB)默认ORC条带大小,以字节为单位
write.orc.block-size-bytes268435456 (256 MB)ORC文件的默认文件系统块大小
write.orc.compression-codeczlibORC压缩编解码器:zstd、lz4、lzo、zlib、snappy或none
write.orc.compression-strategyspeedORC压缩策略:speed或compression
write.orc.bloom.filter.columns(not set)必须创建Bloom过滤器的列名称的逗号分隔列表
write.orc.bloom.filter.fpp0.05Bloom过滤器的误报率(必须> 0.0且< 1.0)
write.location-provider.implnullLocationProvider的可选自定义实现
write.metadata.compression-codecnone元数据压缩编解码器;none或gzip
write.metadata.metrics.max-inferred-column-defaults100定义要收集指标的最大列数
write.metadata.metrics.defaulttruncate(16)表中所有列的默认指标模式;none、counts、truncate(length)或full
write.metadata.metrics.column.col1(未设置)列 ‘col1’ 的指标模式,允许根据列进行调整;none、counts、truncate(length)或full
write.target-file-size-bytes536870912 (512 MB)控制生成的文件大小,以目标字节数为准
write.delete.target-file-size-bytes67108864 (64 MB)控制生成的删除文件大小,以目标字节数为准
write.distribution-modenone定义写入数据的分布方式:none:不混洗行;hash:按分区键哈希分发;range:按分区键或排序键范围分发(如果表有SortOrder)
write.delete.distribution-modehash定义写入删除数据的分布方式
write.update.distribution-modehash定义写入更新数据的分布方式
write.merge.distribution-modenone定义写入合并数据的分布方式
write.wap.enabledfalse启用写入审计发布
write.summary.partition-limit0如果更改的分区数小于此限制,则在快照摘要中包含分区级别的汇总统计信息
write.metadata.delete-after-commit.enabledfalse控制提交后是否删除最旧版本的元数据文件
write.metadata.previous-versions-max100在提交后删除之前要保留的先前版本元数据文件的最大数量
write.spark.fanout.enabledfalse启用Spark中不需要对数据进行聚类的扇出写入器;使用更多内存
write.object-storage.enabledfalse启用对象存储位置提供程序,向文件路径添加散列组件
write.data.pathtable location + /data数据文件的基本位置
write.metadata.pathtable location + /metadata元数据文件的基本位置
write.delete.modecopy-on-write删除命令的模式:copy-on-write或merge-on-read(仅适用于v2)
write.delete.isolation-levelserializable删除命令的隔离级别:serializable或snapshot
write.update.modecopy-on-write更新命令的模式:copy-on-write或merge-on-read(仅适用于v2)
write.update.isolation-levelserializable更新命令的隔离级别:serializable或snapshot
write.merge.modecopy-on-write合并命令的模式:copy-on-write或merge-on-read(仅适用于v2)
write.merge.isolation-levelserializable合并命令的隔离级别:serializable或snapshot

表行为属性

PropertyDefaultDescription
commit.retry.num-retries4在失败之前重试提交的次数
commit.retry.min-wait-ms100重试提交之前等待的最小时间(毫秒)
commit.retry.max-wait-ms60000 (1 分钟)重试提交之前等待的最大时间(毫秒)
commit.retry.total-timeout-ms1800000 (30 分钟)提交的总重试超时时间(毫秒)
commit.status-check.num-retries3在连接丢失后检查提交是否成功的次数,在未知提交状态下失败
commit.status-check.min-wait-ms1000 (1 秒)重试状态检查之前等待的最小时间(毫秒)
commit.status-check.max-wait-ms60000 (1 分钟)重试状态检查之前等待的最大时间(毫秒)
commit.status-check.total-timeout-ms1800000 (30 分钟)提交状态检查必须成功的总超时时间(毫秒)
commit.manifest.target-size-bytes8388608 (8 MB)合并清单文件时的目标大小
commit.manifest.min-count-to-merge100累积清单文件进行合并之前的最小数量
commit.manifest-merge.enabledtrue控制在写入时是否自动合并清单
history.expire.max-snapshot-age-ms432000000 (5 天)在过期快照时表及其所有分支上保留的默认最大快照年龄
history.expire.min-snapshots-to-keep1在过期快照时表及其所有分支上保留的默认最小快照数量
history.expire.max-ref-age-msLong.MAX_VALUE (永远)在过期快照时保留快照引用的默认最大年龄(除主分支外)。主分支永不过期。

保留表属性

保留表属性仅用于在创建或更新表时控制行为。这些属性的值不会作为表元数据的一部分进行持久化。

PropertyDefaultDescription
format-version1表的格式版本(可以是 1 或 2)根据规范定义。

兼容性标志

PropertyDefaultDescription
compatibility.snapshot-id-inheritance.enabledfalse启用无需显式快照ID提交快照

Catalog 属性

IcebergCatalog支持使用Catalog属性来配置Catalog行为。下面是常用catalog 属性的列表:

PropertyDefaultDescription
catalog-implnull自定义Catalog实现,由引擎使用
io-implnull自定义FileIO实现,用于Catalog中
warehousenull数据仓库的根路径
urinullURI字符串,如Hive metastore的URI
clients2客户端池大小
cache-enabledtrue是否缓存catalog条目
cache.expiration-interval-ms30000catalog条目在本地缓存的时间间隔(毫秒);0禁用缓存,负值禁用过期
metrics-reporter-implorg.apache.iceberg.metrics.LoggingMetricsReporter自定义MetricsReporter实现,用于catalog。有关更多详细信息,请参见Metrics reporting部分

HadoopCatalog和HiveCatalog可以在其构造函数中访问这些属性。任何其他自定义Catalog可以通过实现Catalog.initialize(catalogName, catalogProperties)来访问这些属性。属性可以手动构建或从计算引擎(如Spark或Flink)传递。Spark使用其会话属性作为catalog属性,在Spark配置部分中可以找到更多详细信息。Flink通过CREATE CATALOG语句传递目录属性,有关更多详细信息,请参见Flink部分

锁定Catalog 属性

以下是与锁定相关的Catalog 属性。某些Catalog 实现使用它们来控制提交期间的锁定行为。

PropertyDefaultDescription
lock-implnull锁管理器的自定义实现,实际接口取决于所使用的目录
lock.tablenull用于锁定的辅助表,例如AWS DynamoDB锁管理器
lock.acquire-interval-ms5000 (5 秒)获取锁之间等待的间隔
lock.acquire-timeout-ms180000 (3 分钟)尝试获取锁的最大时间
lock.heartbeat-interval-ms3000 (3 秒)获取锁后每个心跳之间等待的间隔
lock.heartbeat-timeout-ms15000 (15 秒)在没有心跳的情况下将锁视为过期的最长时间

Hadoop配置

Hive Metastore连接器使用Hadoop配置中的以下属性。HMS表锁定是一个两步过程:

  1. 锁创建:在HMS中创建锁并排队等待获取
  2. 锁检查:检查是否成功获取锁
PropertyDefaultDescription
iceberg.hive.client-pool-size5在HMS中跟踪表时Hive客户端池的大小
iceberg.hive.lock-creation-timeout-ms180000 (3 分钟)在HMS中创建锁的最大时间(毫秒)
iceberg.hive.lock-creation-min-wait-ms50在HMS中创建锁时重试之间的最小时间间隔(毫秒)
iceberg.hive.lock-creation-max-wait-ms5000在HMS中创建锁时重试之间的最大时间间隔(毫秒)
iceberg.hive.lock-timeout-ms180000 (3 分钟)获取锁的最大时间(毫秒)
iceberg.hive.lock-check-min-wait-ms50检查获取锁之间的最小时间间隔(毫秒)
iceberg.hive.lock-check-max-wait-ms5000检查获取锁之间的最大时间间隔(毫秒)
iceberg.hive.lock-heartbeat-interval-ms240000 (4 分钟)HMS锁的心跳间隔
iceberg.hive.metadata-refresh-max-retries2元数据文件丢失时的最大重试次数
iceberg.hive.table-level-lock-evict-ms600000 (10 分钟)JVM表级锁超时时间
iceberg.engine.hive.lock-enabledtrue使用HMS锁确保提交的原子性

**注意:**iceberg.hive.lock-check-max-wait-ms和iceberg.hive.lock-heartbeat-interval-ms应该小于Hive Metastore的事务超时时间(在较新的版本中为hive.txn.timeout或metastore.txn.timeout)。否则,在从Iceberg重新尝试锁之前,Hive Metastore中的锁心跳(发生在锁检查期间)会过期。

**警告:**将iceberg.engine.hive.lock-enabled设置为false将导致HiveCatalog在提交表时不使用Hive锁。只有在满足以下所有条件时,才应将其设置为false:

  1. Hive Metastore服务器上可用HIVE-26882
  2. 所有提交到与此HiveCatalog提交的表相同的其他HiveCatalog都是Iceberg 1.3或更高版本
  3. 所有提交到与此HiveCatalog提交的表相同的其他HiveCatalog在提交时也已禁用了Hive锁

未能确保这些条件会导致表损坏。

即使将iceberg.engine.hive.lock-enabled设置为false,HiveCatalog仍然可以通过设置表属性engine.hive.lock-enabled=true来为单个表使用锁。这在其他HiveCatalog无法升级并设置为在提交时不使用Hive锁的情况下非常有用。

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BigDataMLApplication

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

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

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

打赏作者

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

抵扣说明:

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

余额充值