和Hudi类似,Iceberg也提供了数据湖的功能,根据官网的定义,它是一个为分析大数据集开源的表存储格式,可以SQL表一样用Spark、Preso进行查询。Iceberg框架很好的解耦了数据计算与数据存储,计算引擎支持Spark、Flink和Hive等。本文第一部分将用Spark进行数据操作,后续再补充Flink操作部分。
功能特性
- 支持Schema变更:字段的增删改对数据表没有影响
- Hidden Partition:用户不用再去管理表的partition,在Hive中插入数据时是需要指定partition的,因为Hive并不会检查分区格式,所以用户要自己去校验分区格式是否正确,在Iceberg中,系统会自动处理数据并保存到正确的分区中。
Schema管理
Iceberg Schema可以通过Hivemetastore方式或者Hadoop文件方式进行管理,两种方式在处理metadata的文件名时采用不同的方式,如果想直接通过Hive指定外部表是不行的。这种处理方式有些奇怪,不知道是不是因为我还没有看到这个设计背后的原因。
- hadoop文件,查看文件命名规则
- hive metastore元数据管理,Iceberg表以外部表的形式存储在hive metastore中,
表以及数据操作
下面会通过Spark操作Iceberg的表和数据相关的怎删改操作,为了能够识别Iceberg,首先要启动SparkSession并配置好Iceberg的参数,参数是metastore的位置,通过设置spark.sql.catalog.spark_catalog.type 来确定使用Hadoop文件还是Hive metastore,因为之后要使用Presto,这里用Hivemetastore来管理Iceberg的metadata
表历史
查看历史快照
创建表
Spark SQL创建表,并添加数据
添加字段
添加字段成功之后,通过hive-cli可以验证新添加的字段
删除字段
Presto 查询
在Presto Server中添加Iceberg配置,/usr/lib/presto/etc/catalog/iceberg.properties
回退以及历史查询
查看表的Snapshot历史信息,Iceberg支持时间旅行,即历史查询,SparkSQL目前不支持TimeTravel,需要用Spark API进行调用。
恢复到历史版本,需要同JavaAPI实现
小文件合并
Iceberg合并小文件时并不会删除被合并的文件,Compact是将小文件合并成大文件并创建新的Snapshot。如果要删除文件需要通过Expire Snapshots来实现
删除历史快照
历史快照是通过ExpireSnapshot来实现的,设置需要删除多久的历史快照