赞
踩
本节主要讲述Iceberg为什么查询数据很快
Iceberg查询一个Snapshot的数据,先获取一个manifest list,再通过manifest list获取manifest files,最后通过manifest files获取data files。其中manifest list和manifest file储存的数据有:
Iceberg每一次write或delete操作都会产生一个新的Snapshot,新的Snapshot的manifest list,和上一个Snapshot的manifest list,会共用很多manifest file,所以也会共用很多data file
HDFS上的metadata/version-hint.text文件指向最新的metadata/vN.metadata.json文件,该json文件中有最新的current-snapshot-id。而Iceberg的commit操作对metadata/version-hint.text的修改是原子性的,这能保证一个表metadata和data的更新是原子性的,从而保证了serializable isolation。同时还有下面的好处:
Iceberg使用乐观并行机制,来实现并行写。每一个writer都假设没有其它writer在操作,对表的write进行原子性的commit。如果一个writer因为其它writer已经commit过而失败,会在最新的表状态下,进行commit重试
commit重试的成本:通过structuring changes,可以进行多次重试,避免昂贵的重试操作。比如向表添加数据,会添加data files,也会向表添加新的manifest file,当commit失败后重试,不用重新创建data files和manifest file(但是需要重新创建manifest list),再次进行commit即可
验证commit是否可以重试:commit重试分为验证和执行两步,先验证是否符合commit条件,如何符合则执行commit,不符合则失败。比如合并file_a.avro和file_b.avro,如果commit重试检验两个文件存在,则可以执行commit,如果其中一个文件被其它操作删除,则失败
通过避免file listing和rename operations,Iceberg可以兼容许多储存系统
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。