表类型
写时复制(Copy On Write):
仅使用列式文件格式(parquet,基本文件)存储数据。通过在写入过程中执行同步合并,仅更新版本并重写新文件。读时合并(Merge On Reader):
使用列式文件格式(parquet,基本文件)+基于行(例如avro,增量文件)的文件格式的组合来存储数据。更新记录到增量文件中,然后压缩以同步或异步生成新的列式文件格式。
查询类型
- 快照查询(实时查询):查询给定提交或压缩操作中表的最新快照。如果读时合并表,它将通过即时合并最新文件切片的基本文件和增量文件来公开近乎实时的数据(几分钟)。对于写时复制表,它提供了对现有parquet的直接替换,同时提供了update/delete和其他写入方面的功能。
- 增量查询:通过给定的提交/压缩,可看到该提交/压缩后写入表的新数据。这有效地提供了更改流,提供一种增量查询的通道去查询数据。
- 读优化查询:查询给定提交/压缩操作中表的最新快照。与非Hudi柱状表相比,仅公开最新文件片中的基本/列文件,并保证相同的柱状查询性能。
下表总结了不同查询类型之间的权衡。
| 权衡 | 快照查询(实时查询) | 读优化查询 |
|---|---|---|
| 数据延迟 | 更低 | 更高 |
| 查询延迟 | 更高(合并列式 + 基于行的增量) | 更低(原始列式性能) |
查询Hudi数据集
具体来说,在写入过程中指定两个表类型的hudi表。创建hive表时指定STORED AS INPUTFORMAT参数创建不同的_ro/_rt表。
如果 table name = hudi_trips 并且 table type = COPY_ON_WRITE, 我们将会看到:
-
hudi_trips支持设置HoodieParquetInputFormat的表上进行快照查询和增量查询,从而提供纯列式数据(中文文档:称实时表,不建议)。
如果 table name = hudi_trips 并且 table type = MERGE_ON_READ, 我们将会看到:
-
hudi_trips_ro支持设置HoodieParquetInputFormat的表上进行读优化查询,从而提供了纯列式数据(中文文档:称读优化表,不建议)。 -
hudi_trips_rt支持设置HoodieParquetRealtimeInputFormat的表上进行快照查询(实时查询)和增量查询(准实时的数据),从而提供了基础文件和日志文件的合并查询(中文文档:称实时表,不建议)。
查询引擎
下面的表格展示了各查询引擎支持的查询类型
- 写时复制表
| 查询引擎 | 快照查询(实时查询) | 增量查询 |
|---|---|---|
| Hive | Y | Y |
| Spark SQL | Y | Y |
| Spark Datasource | Y | Y |
| Presto | Y | N |
| Impala | Y | N |
注意:写时复制表不支持读优化查询。
- 读时合并表
| 查询引擎 | 快照查询(实时查询) | 增量查询 | 读优化查询 |
|---|---|---|---|
| Hive | Y | Y | Y |
| Spark SQL | Y | Y | Y |
| Spark Datasource | N | N | Y |
| Presto | N | N | Y |
| Impala | N | N | Y |
Hive中查询
为了让Hive识别Hudi表并正确查询:
HiveServer2需要
hudi-hadoop-mr-bundle-x.y.z-SNAPSHOT.jar在其辅助jar路径中提供。这将确保inputformat类及其依赖项可用于查询和执行。对于MERGE_ON_READ表,还需要将该捆绑软件放在整个集群的hadoop / hive安装中,以便查询也可以选择自定义RecordReader。(???没理解透彻)
除了上述设置之外,对于beeline cli访问,需要将变量hive.input.format设置为标准路径名org.apache.hudi.hadoop.HoodieParquetInputFormat。对于Tez,还需要将hive.tez.input.format设置为org.apache.hadoop.hive.ql.io.HiveInputFormat。然后像其他任何Hive表一样继续查询该表。
增量拉取(目前好像只能通过jdbc方式完成)
HiveIncrementalPuller允许通过HiveQL从大型事实/维表中增量提取更改, 结合了Hive(可靠地处理复杂的SQL查询)和增量原语的好处(通过增量拉取而不是完全扫描来加快查询速度)。 该工具使用Hive JDBC运行hive查询并将其结果保存在临时表中,这个表可以被插入更新。 Upsert实用程序(HoodieDeltaStreamer)具有目录结构所需的所有状态,以了解目标表上的提交时间应为多少。 例如:/app/incremental-hql/intermediate/{source_table_name}temp/{last_commit_included}。 已注册的Delta Hive表的格式为{tmpdb}.{source_table}{last_commit_included}。
关于大数据方面技术问题可以咨询,替你解决你的苦恼。微信 hainanzhongjian