版本对应关系
参考官网
核心依赖jar包
从官网下载对应版本的iceberg-spark-runtime-xxx.jar包。
- 利用spark配置参数–package或–jars引入
–packages 参数允许你指定 Maven 仓库中的包,这些包将会被自动下载并添加到 Spark 的类路径中。这对于使用 Maven 协调版本的库特别有用,例如,当你想使用特定版本的 Spark SQL 或其他通过 Maven 发布的库时。
当你使用 --packages 指定一个坐标(如 org.apache.spark:spark-sql_2.11:2.4.0),spark-submit 会解析这个坐标并尝试从已知的 Maven 仓库中下载相应的 JAR 文件及其依赖项。如果默认的中央仓库不可用或者速度较慢,你可能会遇到下载失败或超时的情况。
在某些情况下,你可能需要配置额外的 Maven 仓库,比如你的组织有自己的私有仓库,或者你需要从其他公共仓库(如 JCenter,虽然它已经宣布停止服务)下载依赖。在这种情况下,你可以通过 --repositories 选项来指定其他仓库的位置。不过需要注意的是,–repositories 主要是为了支持 Ivy 构建工具,而在使用 Maven 坐标时,通常不需要显式指定仓库位置。
–jars 参数则用于直接指定 .jar 文件的位置(可以是本地文件系统上的位置,也可以是 HDFS 或其他分布式文件系统的 URL)。这通常用于那些没有通过 Maven 发布的库,或者是你想要显式地控制版本和位置的库。
-
spark-shell
spark-shell --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.1
-
spark-sql
spark-sql --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.1
-
pyspark
pyspark --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.1
-
java/scala spark
<dependency> <groupId>org.apache.iceberg</groupId> <artifactId>iceberg-spark-runtime-3.x_2.12</artifactId> <version>1.x.0</version> </dependency>
或者在用spark-submit命令提交的时候通过–jars或–package引入
- 拷贝 iceberg 的 jar 包到 Spark 的 jars 目录
这种是推荐的方式,后续用的时候就不用每次都需要引入了cp /opt/software/iceberg/iceberg-spark-runtime-3.x_2.12-1.x.0.jar /opt/module/spark-3.x.x/jars
配置catalog
Spark 中支持两种 Catalog 的设置:hive 和 hadoop,Hive Catalog 就是 Iceberg 表存储使用 Hive 默认的数据路径,Hadoop Catalog 需要指定 Iceberg格式表存储路径。
使用Hive Catalog这意味着你可以使用 Hive 元数据存储来管理 Iceberg 表的元数据。这使得 Iceberg 表能够与现有的 Hive 生态系统集成。因此也是我们最常用的Catalog。
-
在spark配置文件中配置(推荐)
vim spark-defaults.conf
-
Hive Catalog
spark.sql.catalog.hive_prod = org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.hive_prod.type = hive spark.sql.catalog.hive_prod.uri = thrift://xxx.xxx.xxx:9083 use hive_prod.db;
-
Hadoop Catalog
spark.sql.catalog.hadoop_prod =org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.hadoop_prod.type = hadoop spark.sql.catalog.hadoop_prod.warehouse =hdfs://namespace/warehouse/spark-iceberg use hadoop_prod.db;
-
命令行指定
spark-sql --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.1\ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \ --conf spark.sql.catalog.spark_catalog.type=hive \ --conf spark.sql.catalog.local=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.local.type=hadoop \ --conf spark.sql.catalog.local.warehouse=$PWD/warehouse
-
创建SparkSession时指定
SparkSession spark = SparkSession.builder().appName("appName") .config("spark.sql.catalog.iceberg", "org.apache.iceberg.spark.SparkCatalog") .config("spark.sql.catalog.iceberg.type", "hive") .config("spark.sql.catalog.iceberg.warehouse", "hdfs://nameservice/warehouse/hive") .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") .getOrCreate();
Schema和Catalog区别
-
schema
在 Iceberg 中,Schema
描述了表的结构,包括字段名、类型以及可选的注释等信息。简而言之,Schema
定义了表的列结构及其数据类型。例如,一个简单的Schema
可能定义了一个表包含id
(整型)、name
(字符串类型)和timestamp
(时间戳类型)等字段。当数据写入到表中时,必须遵循该表的Schema
。 -
Catalog
在 Iceberg 中扮演的是元数据管理的角色。它负责存储关于表的所有元数据信息,包括表的位置、Schema
、分区策略等。你可以把Catalog
想象成一个数据库管理系统,它跟踪所有的表和相关的元数据信息。通过Catalog
,你可以创建、删除表,也可以查询表的元数据。一个
Catalog
可能会连接到不同的存储后端,比如 Hadoop 分布式文件系统(HDFS)、S3 或其他对象存储服务。Iceberg 支持多种Catalog
类型,包括 Hive Metastore、Hadoop Catalog 等,这使得 Iceberg 能够灵活地集成到现有的大数据环境中。
总结
这部分内容中我们我们主要了解iceberg和spark整合时的各种参数配置。这里总结几个最常用的catalog相关参数:
-
spark.sql.catalog.iceberg
其实这个配置有两个对应值
(1)org.apache.iceberg.spark.SparkCatalog
这个是最常用的,包含hive和hadoop两种catalog类型,而我们为了能继续使用历史hive表的数据,因此这里大部分都选择hive catalog。
(2)org.apache.iceberg.spark.SparkSessionCatalog
这种用的较少,将iceberg catalog添加到spark内置的catalog中。 -
spark.sql.catalog.iceberg.type
我们catalog上面选择了org.apache.iceberg.spark.SparkCatalog,而这下面又分为hive和hadoop,我们上面也说了,就选hive即可。 -
spark.sql.catalog.iceberg.warehouse
这个是我们数据存储目录,指定即可。 -
spark.sql.extensions
iceberg0.11.0和更高版本为Spark添加了一个扩展模块,以添加新的SQL命令,如调用存储过程或ALTER TABLE…按顺序写。
使用这些SQL命令需要使用以下Spark属性将Iceberg扩展添加到Spark环境中:
所以这个参数也直接配置即可。
最终参数就可以如下:
SparkSession spark = SparkSession.builder().appName("appName")
.config("spark.sql.catalog.iceberg", "org.apache.iceberg.spark.SparkCatalog")
.config("spark.sql.catalog.iceberg.type", "hive")
.config("spark.sql.catalog.iceberg.warehouse", "hdfs://nameservice/warehouse/hive")
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
.getOrCreate();