Apache Sedona 1.9.1 配置参数详解
Apache Sedona 1.9.1 配置参数详解:Spark 基础参数(jars/堆内存/Kryo 序列化)与 sedona.global/join 空间索引及空间连接参数分类详解,SedonaConf 默认值实测(RTREE/KDBTREE/LEFT),含生产配置模板与 FAQ,全程实测。
Apache Sedona 1.9.1 配置参数详解
目标:系统讲解 Apache Sedona 1.9.1 的配置参数。Sedona 无独立配置文件,参数分两层:Spark 运行时参数(
spark.*,决定 jar 加载、堆内存、序列化)与 Sedona 空间引擎参数(sedona.*/spark.sedona.*,决定空间索引、空间连接行为)。本文对每个参数给出含义、默认值、设置方式与生产建议模板。所有默认值均在 Ubuntu 22.04.5 + Spark 3.5.9 + Sedona 1.9.1 环境以SedonaConf实测提取。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- Java:OpenJDK 17.0.20.1
- Spark:3.5.9(
/opt/spark,local 模式) - Sedona 版本:1.9.1(
/opt/sedona-jars/sedona-spark-shaded-3.5_2.12-1.9.1.jar) - GeoTools wrapper:
/opt/sedona-jars/geotools-wrapper-1.9.1-33.5.jar - Python:3.10.12(pyspark 3.5.9、apache-sedona 1.9.1)
- 配置文件:
/opt/spark/conf/spark-defaults.conf
二、前置条件
已完成 Sedona 安装(见《Ubuntu 22.04 安装 Apache Sedona 1.9.1 指南》),并能运行最小空间查询:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PYSPARK_PYTHON=python3
python3 /opt/sedona_verify.py
实测回显:
+-----------+
|point |
+-----------+
|POINT (1 2)|
+-----------+
三、参数查看与修改方式
| 配置层 | 设置入口 | 查看方式 |
|---|---|---|
| 全局默认(作业级) | /opt/spark/conf/spark-defaults.conf | 直接查看文件 |
| 会话级(代码内) | SparkSession.builder().config(k, v) | spark.conf.get(k)(Python)/ spark.conf.get(k)(Scala) |
| 提交时覆盖 | spark-submit --conf k=v | --conf 优先级最高 |
| 运行期动态修改 | spark.conf.set(k, v)(仅 SQL 类参数) | 同上 |
| Sedona 引擎内部 | SedonaConf 对象读取上述键 | new SedonaConf(spark.conf) 后调 getter |
💡 说明:Sedona 键支持
sedona.与spark.sedona.两种前缀(如sedona.join.gridtype等价spark.sedona.join.gridtype),本文统一用sedona.前缀。spark.conf.get的默认值参数类型必须与键类型一致,传错类型会报IllegalArgumentException(实测spark.sql.shuffle.partitions传字符串默认值报should be int)。
四、参数总览
| 参数 | 默认值(实测) | 作用 |
|---|---|---|
| spark.jars | 空 | 提交到集群的 jar 列表(Sedona jar 在此引入) |
| spark.driver.memory | 1g | 驱动 JVM 堆大小 |
| spark.serializer | JavaSerializer | RDD 序列化器(建议 Kryo) |
| spark.kryo.registrator | 空 | Kryo 注册器(Sedona 用 SedonaKryoRegistrator) |
| sedona.global.index | true | 空间查询是否使用空间索引 |
| sedona.global.indextype | RTREE | 空间索引类型 |
| sedona.join.gridtype | KDBTREE | 空间连接的网格划分方式 |
| sedona.join.numpartition | -1 | 空间连接分区数(-1 表示自动) |
| sedona.join.indexbuildside | LEFT | 连接时在哪一侧构建空间索引 |
| sedona.join.autoBroadcastJoinThreshold | 10485760 | 空间广播连接阈值(字节) |
| sedona.join.spatitionside | auto | 空间分区的主导侧 |
| spark.sedona.crs.geotools | false | CRS 变换是否走 GeoTools 引擎 |
| spark.sql.shuffle.partitions | 200 | Shuffle 分区数(影响空间连接并行度) |
默认值实测方式与回显见 5.2/5.3 节。
五、核心参数分类详解
5.1 Spark 运行时基础参数
-
spark.jars:逗号分隔的 jar 路径列表,Spark 启动时自动分发加载。Sedona 部署的核心入口:
spark.jars /opt/sedona-jars/sedona-spark-shaded-3.5_2.12-1.9.1.jar,/opt/sedona-jars/geotools-wrapper-1.9.1-33.5.jar -
spark.driver.memory:驱动 JVM 堆。演示环境建议 512m,运行期验证生效值:
/usr/lib/jvm/java-17-openjdk-amd64/bin/jps -v | grep -oE "\-Xmx[0-9]+m"实测回显:
-Xmx512m -
spark.serializer + spark.kryo.registrator:几何对象序列化必须走 Sedona 的 Kryo 注册器。实测在
SparkSession.builder中显式设置后读取:.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") .config("spark.kryo.registrator", "org.apache.sedona.core.serde.SedonaKryoRegistrator")GET spark.serializer = org.apache.spark.serializer.KryoSerializer GET spark.kryo.registrator = org.apache.sedona.core.serde.SedonaKryoRegistrator⚠️ 注意:实测仅调用
SedonaContext.create(spark)而不显式配置时,spark.serializer可能为 unset(SQL 专用 DataFrame 路径不受影响);凡涉及 RDD 层序列化几何对象(SpatialRDD),务必显式配置上述两项。 -
spark.sql.shuffle.partitions:Shuffle 分区数,默认 200,直接决定空间连接后的并行度,小集群建议显式调低(如 12)。
5.2 Sedona 空间索引参数(sedona.global.*)
通过 SedonaConf 读取引擎实际生效值(spark-shell):
import org.apache.sedona.core.utils.SedonaConf
val conf = new SedonaConf(spark.conf)
println("useIndex=" + conf.getUseIndex)
println("indexType=" + conf.getIndexType)
实测回显(默认值):
useIndex=true
indexType=RTREE
| 参数 | 可选值 | 说明 |
|---|---|---|
| sedona.global.index | true / false | 是否为空间查询构建本地空间索引;false 时查询退化为线性扫描 |
| sedona.global.indextype | RTREE / QUADTREE | 索引结构;RTREE 为通用默认,QUADTREE 在均匀点数据上更快 |
运行时设置方式:
spark.conf.set("sedona.global.index", "true")
spark.conf.set("sedona.global.indextype", "rtree")
5.3 Sedona 空间连接参数(sedona.join.*)
SedonaConf 实测默认值(同上方式):
joinGridType=KDBTREE
buildSide=LEFT
fallbackPartitionNum=-1
autoBroadcastJoinThreshold=10485760
| 参数 | 实测默认 | 说明 |
|---|---|---|
| sedona.join.gridtype | KDBTREE | 连接前对空间划分网格:KDBTREE(自适应 KD 树)/ QUADTREE / EQUALGRID |
| sedona.join.numpartition | -1 | 空间连接分区数;-1 自动。实测设 4 后 spark.conf.get 返回 4 |
| sedona.join.indexbuildside | LEFT | 构建索引的一侧:LEFT / RIGHT / BOTH;默认左表建索引 |
| sedona.join.autoBroadcastJoinThreshold | 10485760 | 一侧数据小于阈值(字节)时走广播空间连接 |
| sedona.join.spatitionside | auto | 空间分区主导侧(按哪一侧数据做空间划分) |
运行时设置与读回实测(python3):
spark.conf.set("sedona.join.numpartition", "4")
spark.conf.set("sedona.join.indexbuildside", "left")
GET sedona.join.numpartition = 4
GET sedona.join.indexbuildside = left
⚠️ 注意:网格类型与分区数决定空间连接的倾斜表现。多边形大、点小的场景(点在多边形内连接)建议
sedona.join.indexbuildside=left(左表多边形建索引)保持默认即可;两侧都是海量数据时优先调sedona.join.numpartition。
5.4 CRS 变换与地理类型参数(spark.sedona.*)
以下键名来自 Sedona 1.9.1 的 SedonaConf(jar 内实测提取):
| 参数 | 说明 |
|---|---|
| spark.sedona.crs.geotools | CRS 变换引擎开关;启用后 ST_Transform 使用 GeoTools(需 geotools-wrapper jar) |
| spark.sedona.crs.url.base | 自定义 CRS 定义库的基础 URL |
| spark.sedona.crs.url.pathTemplate | CRS 定义路径模板 |
| spark.sedona.crs.url.format | CRS 定义格式 |
| spark.sedona.geography.eagerShapeIndex | Geography 类型是否急切构建 shape 索引 |
| spark.sedona.dbscan.includeOutliers | DBSCAN 聚类是否输出离群点 |
| spark.sedona.libpostal.dataDir | libpostal 地址解析数据目录 |
| spark.sedona.libpostal.useSenzing | libpostal 是否使用 Senzing 模式 |
ST_Transform 在默认配置下即可工作(实测 EPSG:4326 → EPSG:3857,见《Ubuntu 22.04 安装 Apache Sedona 1.9.1 指南》验证节);spark.sedona.crs.* 仅在自定义坐标系或离线 CRS 库时需要调整。
六、生产配置模板
💡 适用场景:
16GB 内存节点、NVMe SSD、千万级点/面空间连接作业,Spark 3.5.9 + Sedona 1.9.1,YARN/Standalone 集群模式。
spark-defaults.conf 生产模板:
# Sedona jar(两个 jar 配套 1.9.1)
spark.jars /opt/sedona-jars/sedona-spark-shaded-3.5_2.12-1.9.1.jar,/opt/sedona-jars/geotools-wrapper-1.9.1-33.5.jar
# 序列化:几何对象必须走 Sedona Kryo 注册器
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.kryo.registrator org.apache.sedona.core.serde.SedonaKryoRegistrator
# 内存:驱动 512m-2g,按集群规模规划
spark.driver.memory 512m
# 并行度:按核数与数据量调整
spark.sql.shuffle.partitions 12
# 空间连接:海量面-面连接时调大分区数
sedona.join.gridtype kdbtree
sedona.join.numpartition -1
sedona.join.indexbuildside left
| 场景 | 推荐配置 |
|---|---|
| 演示/测试(小内存) | driver 512m、shuffle.partitions 12、sedona.join 默认值 |
| 生产点-面连接(8GB 节点) | indexbuildside=left、gridtype=kdbtree、global.index=true |
| 生产海量面-面连接(16GB 节点) | numpartition=核数×2、gridtype=kdbtree、评估 broadcast 阈值 |
| 只做量测/格式转换(无连接) | sedona.global.index=false 可省索引构建开销 |
七、常见问题
Q1:spark.conf.get("spark.sql.shuffle.partitions", "200") 报类型错误?
get 的默认值参数会被强制转换为目标类型,传 "200" 字符串对 int 型键正常、对带默认值的键传不匹配类型会报 IllegalArgumentException: should be int。建议不传默认值直接 spark.conf.get(k)。
Q2:设置了 sedona.* 参数但空间连接没变化?
确认键名前缀(sedona. 或 spark.sedona. 均可)、设置时机(须在执行动作前),并用 SedonaConf 读回验证:
println(new SedonaConf(spark.conf).getJoinGridType)
实测回显:
KDBTREE
Q3:Kryo 注册器没配会怎样? DataFrame/SQL 路线(本文示例)可正常工作;一旦使用 SpatialRDD(RDD 层 API),JavaSerializer 序列化几何对象性能差甚至失败。务必两项成对配置(见 5.1 节)。
Q4:如何确认参数实际生效?
两级验证:Spark 层用 spark.conf.get(k);Sedona 引擎层用 new SedonaConf(spark.conf) 的 getter(getUseIndex/getIndexType/getJoinGridType 等),以 getter 返回值为准。
八、参考链接
- Sedona 官网参数文档:
https://sedona.apache.org/latest-snapshot/tutorial/parameters/ - Sedona Spatial Join 调优:
https://sedona.apache.org/latest-snapshot/api/sql/Optimizer/ - Spark 配置文档:
https://spark.apache.org/docs/latest/configuration.html - Sedona 官网:
https://sedona.apache.org/