大数据知识体系
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
  • 数据湖介绍
  • Iceberg

    • Iceberg 概述
    • Iceberg 数据类型
    • Iceberg 演化
    • Iceberg 分区
    • Iceberg 文件组织形式
    • Iceberg Spark 入门
      • 配置步骤
        • 添加 jar 包
        • 配置 Catalog
    • Iceberg Spark DDL
    • Iceberg Spark DQL
    • Iceberg Spark SQL 存储过程
  • Hudi

    • Hudi 概述
  • 数据湖
  • Iceberg
Will
2022-03-17
目录

Iceberg Spark 入门

# 配置步骤

以 Spark3 为例,整合 Iceberg 和 Spark 只需两步:

  1. 添加 jar 包;
  2. 配置 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
1
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
1
2
3
4

如果要实现 Metastore 高可用,可以添加多个 uri 属性,用逗号隔开,如:thrift://metastore-host:port,thrift://metastore-host:port。

提示

HadoopCatalog和HiveCatalog的区别在哪里?

先来看 HadoopCatalog 生成一个新快照的元数据处理流程:

  1. 先读取当前原数据版本v;
  2. 基于v版本创建一个新表;
  3. 将新的元数据写到<random-uuid>.metadata.json文件;
  4. 将<random-uuid>.metadata.jsonrename 为v<v+1>.metadata.json:
    • 如果 rename 成功,说明提交成功,当前最新版本记录为v+1
    • 如果 rename 失败,重复步骤 1。

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)。

上次更新: 2023/11/01, 03:11:44

← Iceberg 文件组织形式 Iceberg Spark DDL→

Theme by Vdoing | Copyright © 2022-2023 Will 蜀ICP备2022002285号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式