Hudi表使用约束
Hudi表类型
- Copy On Write
写时复制表也简称COW表,使用parquet文件存储数据,内部的更新操作需要通过重写原始parquet文件完成。
- 优点:读取时,只读取对应分区的一个数据文件即可,较为高效。
- 缺点:数据写入的时候,需要复制一个先前的副本再在其基础上生成新的数据文件,这个过程比较耗时。且由于耗时,读请求读取到的数据相对就会滞后。
- Merge On Read
读时合并表也简称MOR表,使用列格式parquet和行格式Avro两种方式混合存储数据。其中parquet格式文件用于存储基础数据,Avro格式文件(也可叫做log文件)用于存储增量数据。
- 优点:由于写入数据先写delta log,且delta log较小,所以写入成本较低。
- 缺点:需要定期合并整理compact,否则碎片文件较多。读取性能较差,因为需要将delta log和老数据文件合并。
表1 两种表类型的 trade-off Trade-off
CopyOnWrite
MergeOnRead
Data Latency(数据时延)
高
低
Query Latency(查询时延)
低
高
Update cost (I/O)(更新时(I/O)开销)
高(重写整个parquet)
低
Parquet File Size(Parquet文件大小)
小(更新时(I/O)开销大)
大(更新时开销小)
Write Amplification(写放大)
高
低(取决于compaction策略)
Hudi表使用约束与限制
- Hudi支持使用Spark SQL操作Hudi的DDL/DML的语法。但在使用DLI提供的元数据提交SparkSQL作业时,部分直接操作OBS路径的SQL语法暂不支持,详细说明请参考DLI Hudi SQL语法参考。
- 不支持在HetuEngine中写Hudi表,以及修改Hudi表结构,仅支持读Hudi表。
- 创建Hudi表时,必须且需要正确配置 primaryKey 和 preCombineField,否则存在数据最终表现与预期不一致的风险。
- 使用由DLI提供的元数据服务时,不支持创建DLI表,只支持创建OBS表,即必须通过LOCATION参数配置表路径。
- 使用由LakeFormation提供的元数据服务时,创建内表和外表均支持。需要注意:在DROP内表时,数据也会被同步删除。
- 在提交Spark SQL或Flink SQL作业时,无需手动配置Hudi的 hoodie.write.lock.provider 配置项,但在提交Spark jar作业时必须手动配置,请见 Hudi锁配置说明 一节。
- Hudi和队列计算引擎的版本对应关系为:
计算引擎
版本
Hudi版本
Spark
3.3.1
0.11.0
Flink
1.15
0.11.0
Hetu
2.1.0
0.11.0
如何判断队列支持的计算引擎版本:首先进入DLI的控制台界面,点击左侧菜单栏的”资源管理”-> ”队列管理”。在队列管理的界面筛选并选中需要查询的队列,随后点击窗口底部的窗格,展开隐藏的队列详情页面,在支持版本即可查看可用的计算引擎版本。对于SQL队列,无法切换版本,查看默认版本即可判断当前使用的计算引擎版本。