写点什么

Trino 应用 Iceberg Catalog 写入数据原理分析

  • 2021 年 12 月 26 日
  • 本文字数:1109 字

    阅读完需:约 4 分钟

Trino 在 Iceberg Catalog 下创建表后(https://xie.infoq.cn/article/e4c245a0e260d1ebf0b29c592),再

来分析 trino 写入 Iceberg 的过程,写入过程分为三个阶段:获取表,写入数据文件,提交元数据。


trino insert 数据的执行计划:

数据写入的执行过程有三个 stage,Fragment2 是待写入数据集处理器 ValuesOperator,Fragment1 是生成数据文件的阶段,使用 TableWriterOperator 将数据写到存储系统上,并统计数据信息,传递给 Fragment0,Fragment0 是最后提交写入数据的元数据文件,使用 TableFinishOperator 完成提交事务。

关键流程:

  1. 获取表流程

获取表的过程最重要的一步是从存储系统中刷新最新版本的元数据文件和快照。

关键代码:

	//从hms拿到hive表对象				Optional<Table> hiveTable = metastore.getTable(new HiveIdentity(session), tableName.getSchemaName(), name.getTableName());        if (hiveTable.isEmpty()) {            return null;        }        if (isMaterializedView(hiveTable.get())) {            return null;        }        if (!isIcebergTable(hiveTable.get())) {            throw new UnknownTableTypeException(tableName);        }				//通过metadata location读取iceberg表元数据和当前snapshotId        org.apache.iceberg.Table table = getIcebergTable(session, hiveTable.get().getSchemaTableName());        Optional<Long> snapshotId = getSnapshotId(table, name.getSnapshotId());
return new IcebergTableHandle( tableName.getSchemaName(), name.getTableName(), name.getTableType(), snapshotId, TupleDomain.all(), TupleDomain.all());
复制代码
  1. 写入数据文件

trino 写入数据文件没有使用 Iceberg 的相关接口,比如 Parquet 和 Orc 模块。trino 自己都有相应实现 ParquetWriter 和 OrcWriter。

写入流程:

除了将数据写入,还需要返回数据的统计信息,比如 Max/Min/nonNull,作为 TableWriterOperator 的输出数据,传递给下个阶段。


  1. 提交元数据文件

Trino 的写入过程同样没有采用 Iceberg 的 HadoopTableOperation 和 HiveTableOperation,采用自己实现的 HiveTableOperation 完成最后的事务提交。Trino 的数据写入过程跟 Iceberg 的过程相同,主要三个步骤:

引用相关 Iceberg 接口和方法

TableMetadataParser.read()读取当前 iceberg 表的元信息

BaseTable.currentSnapshot()返回当前数据最新版本号

BaseTransaction.newFastAppend() 创建 FastAppend

FastAppend.commit()创建数据文件对应的元数据描述文件

TableMetadataParser.write()写入新版本元数据 json 文件

发布于: 3 小时前
用户头像

还未添加个人签名 2018.10.30 加入

还未添加个人简介

评论

发布
暂无评论
Trino应用Iceberg Catalog写入数据原理分析