欢迎关注大数据技术架构与案例微信公众号:过往记忆大数据
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
过往记忆大数据

Apache Iceberg 中三种操作表的方式

本文是《Apache Iceberg 入门教程》专题的第 8 篇,共 10 篇:

Apache Iceberg 中有很多种方式可以来创建表,其中就包括使用 Catalog 方式或者实现 org.apache.iceberg.Tables 接口。下面我们来简单介绍如何使用。.

Apache iceberg:Java API Quickstart
如果想及时了解Spark、Hadoop或者HBase相关的文章,欢迎关注微信公众号:iteblog_hadoop

使用 Hive catalog

从名字就可以看出,Hive catalog 是通过连接 Hive 的 MetaStore,把 Iceberg 的表存储到其中,它的实现类为 org.apache.iceberg.hive.HiveCatalog,下面是通过 sparkContext 中的 hadoopConfiguration 来获取 HiveCatalog 的方式:

import org.apache.iceberg.hive.HiveCatalog;

Catalog catalog = new HiveCatalog(spark.sparkContext().hadoopConfiguration());

Catalog 接口里面定义了操作表的方法,比如 createTable, loadTable, renameTable, 以及 dropTable。如果想创建表,我们需要定义 TableIdentifier,表的 Schema 以及分区的信息,如下:

import org.apache.iceberg.Table;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.PartitionSpec;
import org.apache.iceberg.Schema;

TableIdentifier name = TableIdentifier.of("default", "iteblog");
Schema schema = new Schema(
    Types.NestedField.required(1, "id", Types.IntegerType.get()),
    Types.NestedField.optional(2, "name", Types.StringType.get()),
    Types.NestedField.required(3, "age", Types.IntegerType.get()),
    Types.NestedField.optional(4, "ts", Types.TimestampType.withZone())
);

PartitionSpec spec = PartitionSpec.builderFor(schema).year("ts").bucket("id", 2).build();
Table table = catalog.createTable(name, schema, spec);

使用 Hadoop catalog

Hadoop catalog 不依赖 Hive MetaStore 来存储元数据,其使用 HDFS 或者类似的文件系统来存储元数据。注意,文件系统需要支持原子的重命名操作,所以本地文件系统(local FS)、对象存储(S3、OSS等)来存储 Apache Iceberg 元数据是不安全的。下面是获取 HadoopCatalog 例子:

import org.apache.hadoop.conf.Configuration;
import org.apache.iceberg.hadoop.HadoopCatalog;

Configuration conf = new Configuration();
String warehousePath = "hdfs://www.iteblog.com:8020/warehouse_path";
HadoopCatalog catalog = new HadoopCatalog(conf, warehousePath);

和 Hive catalog 一样,HadoopCatalog 也是实现 Catalog 接口的,所以其也实现了表的各种操作方法,包括 createTable, loadTable, 以及 dropTable。下面是使用 HadoopCatalog 来创建 Iceberg 的例子:

import org.apache.iceberg.Table;
import org.apache.iceberg.catalog.TableIdentifier;

TableIdentifier name = TableIdentifier.of("logging", "logs");
Table table = catalog.createTable(name, schema, spec);

使用 Hadoop tables

Iceberg 也支持存储在 HDFS 目录中的表。和 Hadoop catalog 一样,文件系统需要支持原子的重命名操作,所以本地文件系统(local FS)、对象存储(S3、OSS等)来存储 Apache Iceberg 元数据是不安全的。这种方式存储的表并不支持表的各种操作,比如不支持 renameTable。下面是获取 HadoopTables 的例子:

import org.apache.hadoop.conf.Configuration;
import org.apache.iceberg.hadoop.HadoopTables;
import org.apache.iceberg.Table;

Configuration conf = new Configuration():
HadoopTables tables = new HadoopTables(conf);
Table table = tables.create(schema, spec, table_location);

在 Spark 中,其支持 HiveCatalog、HadoopCatalog 以及 HadoopTables 方式来创建、加载表。如果传入的表不是一个路径,则选择 HiveCatalog,否则 Spark 将推断出表是存储在 HDFS 上的。

当然,Apache Iceberg 表元数据存储地方是可插拔的,所以我们完全可以自定义元数据存储的方式,比如 AWS 就给社区提了一个 issue,其把 Apache Iceberg 中的元数据存储到 glue 里面,参见 #1633#1608

本博客文章除特别声明,全部都是原创!
转载本文请加上:转载自过往记忆(https://www.iteblog.com/)
本文链接: 【Apache Iceberg 中三种操作表的方式】(https://www.iteblog.com/archives/9886.html)
喜欢 (1)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!