Iceberg Spark 入门
# 配置步骤
以 Spark3 为例,整合 Iceberg 和 Spark 只需两步:
- 添加 jar 包;
- 配置 Catalog。
# 添加 jar 包
将iceberg-spark-runtime-3.2_2.12.jar (opens new window)复制到${SPARK_HOME}/jars
目录下。
# 配置 Catalog
Catalog 是对表进行创建、加载和管理的一个组件,Spark 中有内置的 Catalog。在 Iceberg 中关于 Catalog 有两种包装了 Iceberg 的实现(通过spark.sql.catalog.catalog_name
属性指定):
- org.apache.iceberg.spark.SparkCatalog:支持 Hive Metastore 或 Hadoop 仓库作为 Catalog。
- org.apache.iceberg.spark.SparkSessionCatalog:自持将 Iceberg 表添加到 Spark 内置的 Catalog,并委托其 Catalog 来管理费 Iceberg 表。
一般用org.apache.iceberg.spark.SparkCatalog
较多。
在${SPARK_HOME/conf/spark-defaults.conf}
中添加如下信息:
spark.sql.catalog.hadoop_catalog = org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.hadoop_catalog.type = hadoop
spark.sql.catalog.hadoop_catalog.default-namespace = iceberg_db
spark.sql.catalog.hadoop_catalog.warehouse = /opt/module/spark-3.2.1/spark-warehouse
2
3
4
需要说明的是:
- 所有的配置都是以
spark.sql.catalog
开头,hadoop_catalog
为用户自定义部分,表示 Catalog Name,在后续的查询和写入操作都会用到。 spark.sql.catalog.hadoop_catalog.type
取值只能为hadoop
或hive
,表示 Iceberg Catalog 的下层实现是HadoopCatalog
或HiveCatalog
,用户也可以自定义实现 Catalog。spark.sql.catalog.catalog-name.default-namespace
表示默认的库名。spark.sql.catalog.hadoop_catalog.warehouse
表示 Iceberg 表存储位置。可以是本地文件系统,也可以是 HDFS、S3、OSS 等。如:hdfs://nn:8020/warehouse/path
。
至此,配置已经完成可以启动${SPARK_HOME}/spark-sql
创建表。
HiveCatalog 举例:
spark.sql.catalog.hive_catalog = org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.hive_catalog.type = hive
spark.sql.catalog.hive_catalog.default-namespace = iceberg_db
spark.sql.catalog.hive_catalog.uri = thrift://metastore-host:port
2
3
4
如果要实现 Metastore 高可用,可以添加多个 uri 属性,用逗号隔开,如:thrift://metastore-host:port,thrift://metastore-host:port
。
提示
HadoopCatalog
和HiveCatalog
的区别在哪里?
先来看 HadoopCatalog
生成一个新快照的元数据处理流程:
- 先读取当前原数据版本
v
; - 基于
v
版本创建一个新表; - 将新的元数据写到
<random-uuid>.metadata.json
文件; - 将
<random-uuid>.metadata.json
rename 为v<v+1>.metadata.json
:- 如果 rename 成功,说明提交成功,当前最新版本记录为
v+1
- 如果 rename 失败,重复步骤 1。
- 如果 rename 成功,说明提交成功,当前最新版本记录为
Iceberg 每次修改表都是有 ACID 保证的,在 HadoopCatalog 中就是依赖于乐观锁机制和文件系统的 rename 原子语义的特性而保证了 Iceberg 的 ACID 特性,不依赖于其它外部服务。所以使用HadoopCatalog
的前提是文件操作系统支持 rename 原子语义,如 HDFS、本地文件系统等。
HadoopCatalog
只适用于支持 rename 原子语义的文件系统,但是对于类似 S3 这种不支持 rename 原子操作的文件系统来说,就需要通过其它机制来保证 Iceberg 的 ACID 属性,所以就引入了HiveCatalog
。HiveCatalog
中依赖了 Hive 的 Metastore 服务,Iceberg 每新增一个快照都会更新 MySQL 表,借助于 MySQL 的 ACID 特性,就可以间接实现 Iceberg 的 ACID 特性。这是早期 Iceberg 版本中引入HiveCatalog
的原因,但是从 0.13.1 版本开始,HadoopCatalog
通过锁机制也支持了 S3 以及其它类似的文件系统。
其它关于 Catalog 配置信息可以参考官方文档 (opens new window)。