Polaris Spark 客户端

师成师成· 更新于 2026-09-29· 阅读 11 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Polaris Spark 客户端

Polaris 提供了一个 Spark 客户端,用于通过 Generic Tables 管理非 Iceberg 表。

📝 注意

Spark 客户端既可以管理 Iceberg 表,也可以管理非 Iceberg 表。

只使用 Iceberg 表的用户无需使用该客户端,可直接使用 Iceberg 提供的 Spark 客户端。

本页介绍如何使用 Polaris Spark 客户端将 Spark 与 Polaris Service 连接起来。

通过本地 Polaris 服务快速上手

如果想在本地 Polaris 服务上快速体验该功能,只需检出 Polaris 代码仓库,并按照 Spark 插件快速入门 README 中的说明操作即可。

检出 Polaris 代码仓库:

git clone https://github.com/apache/polaris.git ~/polaris

针对已部署的 Polaris 服务启动 Spark

在开始之前,请确保已部署的 Polaris 服务支持通用表(Generic Tables),并且已安装 Spark 3.5(版本 3.5.3 或更高)。推荐使用 Spark 3.5.6,你可以按照以下说明获取 Spark 3.5.6 发行版。

cd ~
wget https://www.apache.org/dyn/closer.lua/spark/spark-3.5.6/spark-3.5.6-bin-hadoop3.tgz?action=download
mkdir spark-3.5
tar xzvf spark-3.5.6-bin-hadoop3.tgz -C spark-3.5 --strip-components=1
cd spark-3.5

使用 Polaris Spark 客户端连接 Spark

可以使用以下 CLI 命令,通过已发布的 Polaris Spark 客户端启动 Spark 并连接到已部署的 Polaris 服务。

bin/spark-shell \
--packages <polaris-spark-client-package>,org.apache.iceberg:iceberg-aws-bundle:1.10.0,io.delta:delta-spark_2.12:3.3.1 \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,io.delta.sql.DeltaSparkSessionExtension \
--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \
--conf spark.sql.catalog.<spark-catalog-name>.warehouse=<polaris-catalog-name> \
--conf spark.sql.catalog.<spark-catalog-name>.header.X-Iceberg-Access-Delegation=vended-credentials \
--conf spark.sql.catalog.<spark-catalog-name>=org.apache.polaris.spark.SparkCatalog \
--conf spark.sql.catalog.<spark-catalog-name>.uri=<polaris-service-uri> \
--conf spark.sql.catalog.<spark-catalog-name>.credential='<client-id>:<client-secret>' \
--conf spark.sql.catalog.<spark-catalog-name>.scope='PRINCIPAL_ROLE:ALL' \
--conf spark.sql.catalog.<spark-catalog-name>.token-refresh-enabled=true

假设你要使用的已发布 Polaris Spark 客户端为 org.apache.polaris:polaris-spark-3.5_2.12:1.0.0,请将 polaris-spark-client-package 字段替换为该发布版本。

spark-catalog-name 是你在 Spark 中使用的目录名称,polaris-catalog-name 是 Polaris 服务所使用的目录名称,为简单起见,两者可以使用相同的名称。

请将 polaris-service-uri 替换为已部署的 Polaris 服务的 URI。例如,对于本地部署的 Polaris 服务,该 URI 为 http://localhost:8181/api/catalog。

关于 client-id 和 client-secret 的取值,你可以参考使用 Polaris获取更多详细信息。

你也可以通过以编程方式初始化 SparkSession 来建立连接,以下是 PySpark 的示例:

from pyspark.sql import SparkSession

spark = SparkSession.builder
  .config("spark.jars.packages", "<polaris-spark-client-package>,org.apache.iceberg:iceberg-aws-bundle:1.10.0,io.delta:delta-spark_2.12:3.3.1")
  .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")
  .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,io.delta.sql.DeltaSparkSessionExtension")
  .config("spark.sql.catalog.<spark-catalog-name>", "org.apache.polaris.spark.SparkCatalog")
  .config("spark.sql.catalog.<spark-catalog-name>.uri", <polaris-service-uri>)
  .config("spark.sql.catalog.<spark-catalog-name>.token-refresh-enabled", "true")
  .config("spark.sql.catalog.<spark-catalog-name>.credential", "<client-id>:<client_secret>")
  .config("spark.sql.catalog.<spark-catalog-name>.warehouse", <polaris_catalog_name>)
  .config("spark.sql.catalog.polaris.scope", 'PRINCIPAL_ROLE:ALL')
  .config("spark.sql.catalog.polaris.header.X-Iceberg-Access-Delegation", 'vended-credentials')
  .getOrCreate()

与 CLI 命令类似,请确保相应字段已被正确替换。

使用 Spark 创建表

启动 Spark 后,你可以用它来创建和访问 Iceberg 表与 Delta 表。例如:

spark.sql("USE polaris")
spark.sql("CREATE NAMESPACE IF NOT EXISTS DELTA_NS")
spark.sql("CREATE NAMESPACE IF NOT EXISTS DELTA_NS.PUBLIC")
spark.sql("USE NAMESPACE DELTA_NS.PUBLIC")
spark.sql("""CREATE TABLE IF NOT EXISTS PEOPLE (
    id int, name string)
USING delta LOCATION 'file:///tmp/var/delta_tables/people';
""")

使用本地 Polaris Spark 客户端 jar 连接 Spark

如果你想使用目前尚未发布的 Spark 客户端版本,可以从源码在本地构建 Spark 客户端 jar。请检出 Polaris 仓库,并参阅 Spark 插件的 README 获取详细说明。

当前限制

以下说明了 Polaris Spark 客户端目前存在的限制:

通用限制

  1. Polaris Spark 客户端仅支持 Iceberg 表和 Delta 表,不支持 CSV、JSON 等其他表格式。
  2. 通用表(非 Iceberg 表)的 API 目前不支持凭证分发(credential vending)。

Delta 表限制

  1. Delta 表不支持选择查询建表(CTAS)。因此,Dataframe 的 saveAsTable 方法也不受支持,因为它依赖于 CTAS 的支持。
  2. 不支持在未指定位置的情况下创建 Delta 表。
  3. 不支持重命名 Delta 表。
  4. Delta 表不支持 ALTER TABLE … SET LOCATION 语句。

评论

登录后参与评论

正在加载评论…