TiSpark 4.0 用户指南

TiSpark 4.0 架构图

TiSpark 4.0 是什么

TiSpark 4.0 架构进行了重构,不再直接依赖于 TiKV 集群和 Placement Driver (PD),而是通过标准的 JDBC 接口与 TiDB Server 进行通信。这使得 TiSpark 成为 TiDB 的一个标准客户端,极大地简化了部署、运维和安全管理。

TiSpark 深度整合了 Spark 的 Catalog 机制,在提供标准数据源体验的同时,通过向 TiDB 查询系统表 TABLE_REGIONS 来获取表数据的 Region 分布信息。基于这些信息,TiSpark 能够将查询任务智能地拆分为多个子任务,并分发到 Spark Executor 执行。每个子任务仅负责一个数据分片 (Split),从而实现了高效的并行数据读取,从根本上解决了传统 JDBC 数据源在读取大数据表时常见的数据倾斜问题。

通过 JDBC 协议,TiSpark 将计算下推到 TiDB 执行。这充分利用了 TiDB 强大的分布式 SQL 引擎和内置的统计信息,由 TiDB 优化器选择最优的查询计划,从而减少了 Spark 需要处理的数据量,提升了整体查询效率。

版本要求

  • TiSpark 支持 Spark 3.0 或以上版本。
  • TiSpark 需要 JDK 1.8 以及 Scala 2.12 版本。
  • TiSpark 需要 TiDB v7.1.8-5.4 或以上版本(需要 TiDB 支持系统表 TABLE_REGIONS)。
  • TiSpark 可以运行在任何 Spark 模式上,如 YARNMesos 以及 Standalone

推荐配置

TiSpark 作为 Spark 的 TiDB 连接器,需要 Spark 集群的支持。本文仅提供部署 Spark 的参考建议,对于硬件以及部署细节,请参考 Spark 官方文档

由于 TiSpark 4.0 的计算下推至 TiDB Server,在进行大规模数据分析时,可能会对 TiDB 集群造成较大压力。建议评估 TiSpark 的查询负载,并为 TiDB 集群预留充足的计算资源,或部署专门用于承载分析负载的 TiDB Server 节点。

对于独立部署的 Spark 集群,可以参考如下建议配置:

  • 建议为 Spark 分配 32G 以上的内存,并为操作系统和缓存保留至少 25% 的内存。
  • 建议每台机器至少为 Spark 分配 8 到 16 核 CPU。起初,你可以设定将所有 CPU 核分配给 Spark。

可以参考如下的 spark-env.sh 配置文件:

SPARK_EXECUTOR_MEMORY = 32g SPARK_WORKER_MEMORY = 32g SPARK_WORKER_CORES = 8

获取 TiSpark 4.0

TiSpark 是以第三方 jar 包的形式提供给 Spark 使用的。

获取 mysql-connector-j

由于 GPL 许可证的限制,TiSpark 不提供 mysql-connector-java 的依赖。在使用 TiSpark 时,需要你手动下载 mysql-connector-java-8.0.29.jar 或更高版本,并使用以下方式引入:

  • mysql-connector-java.jar 放入 Spark 的 jars 目录下。

  • 在你提交 Spark 任务时,通过 --jars 参数引入 mysql-connector-java.jar,详见以下示例:

    spark-submit --jars /path/to/spark-tidb-connector-<version>.jar,/path/to/tidb-jdbc-core-<version>.jar,/path/to/mysql-connector-java-8.0.29.jar

选择 TiSpark 版本

你可以根据 TiDB 和 Spark 版本选择相应的 TiSpark 版本。推荐使用 TiSpark 的最新稳定版本。

TiSpark 版本TiDB 版本要求Spark 版本Scala 版本
(TBD)>= v7.1.8-5.43.x2.12

获取 TiSpark jar 包

联系客户经理获取软件包。

快速开始

本章节将以 spark-shell 为例,介绍如何使用 TiSpark。请保证您已安装并配置好 Spark 环境。

配置并启动 spark-shell

在 Spark 的配置文件 conf/spark-defaults.conf 中添加如下 TiDB Catalog 相关配置:

# 指定使用 TiSpark 的 Catalog 实现 spark.sql.catalog.tidb_catalog io.tidb.bigdata.spark.TiDBTableCatalog # ========== TiDB Catalog 连接配置 ========== spark.sql.catalog.tidb_catalog.type jdbc # 替换为你的 TiDB 连接地址、端口和目标数据库 spark.sql.catalog.tidb_catalog.url jdbc:mysql://127.0.0.1:4000/test?rewriteBatchedStatements=true&defaultfetchsize=-2147483648 spark.sql.catalog.tidb_catalog.user root spark.sql.catalog.tidb_catalog.password # 留空或填写你的 TiDB 密码 spark.sql.catalog.tidb_catalog.driver com.mysql.cj.jdbc.Driver # 替换为你的 TiDB 目标表 (TBD) spark.sql.catalog.tidb_catalog.dbtable t1

配置完成后,使用如下命令启动 spark-shell,需将 TiSpark 的 jar 包、TiDB JDBC Core 的 jar 包和 MySQL Connector/J 的 jar 包通过 --jars 参数传入。

# 替换为你的 tispark-assembly jar 包实际路径 spark-shell --jars /path/to/spark-tidb-connector-<version>.jar,/path/to/tidb-jdbc-core-<version>.jar,/path/to/mysql-connector-java-8.0.29.jar

使用 TiSpark 读取数据

通过 Spark SQL 和配置好的 tidb_catalog 从 TiDB 读取数据:

// 读取 tidb_catalog 中 test 数据库下的 t1 表 spark.sql("select count(*) from tidb_catalog.test.t1").show()

TiSpark 配置

TiSpark 4.0 的主要配置都集中在 Spark Catalog 的定义中。你可以在 spark-defaults.conf 中配置,或在提交任务时通过 --conf 选项传入。

KeyDefault valueDescription
spark.sql.catalog.tidb_catalog(无)必需。 指定 Catalog 的实现类,固定为 io.tidb.bigdata.spark.TiDBTableCatalog
spark.sql.catalog.tidb_catalog.typejdbc必需。 指定 Catalog 类型。
spark.sql.catalog.tidb_catalog.url(无)必需。 TiDB 的 JDBC 连接字符串。格式为 jdbc:mysql://<host>:<port>/<database>
spark.sql.catalog.tidb_catalog.user(无)必需。 TiDB 用户名。
spark.sql.catalog.tidb_catalog.password(无)连接 TiDB 的密码。如果用户没有密码,请勿设置此项。
spark.sql.catalog.tidb_catalog.drivercom.mysql.cj.jdbc.DriverJDBC 驱动类名。通常无需修改。
spark.sql.catalog.tidb_catalog.dbtable(无)连接 TiDB 的目标表。设置此项无作用。

FAQ

问:为什么要用 JDBC 架构替换掉原来直连 TiKV 的架构?

答:这是为了提升 TiSpark 的长期可靠性、可维护性和用户体验。旧架构与 TiKV/PD 内部协议耦合过深,导致 TiDB 内核升级时 TiSpark 难以兼容和维护。新架构通过标准的 JDBC 接口与 TiDB 解耦,使 TiSpark 成为一个普通的 TiDB 客户端,从而获得以下好处:

  1. 高可靠性:利用成熟稳定的 TiDB Server 处理事务和请求,避免了 TiSpark 客户端逻辑的复杂性。
  2. 易于维护:TiSpark 不再需要跟随 TiKV/PD 的内部协议变化,可以独立迭代。
  3. 更好的兼容性:可以轻松与任意新版本的 TiDB 以及云上的 TiDB 服务(如 TiDB Cloud)集成。
  4. 统一的安全模型:所有权限都由 TiDB 统一管理,更加安全、简单。
  5. 可观测性:所有查询都会经过 TiDB Server,可以使用 TiDB 的监控和日志工具进行追踪和诊断。可以通过 SQL hint 获取 Spark 进程,以便在 TiDB SQL 运行异常时及时 Kill Spark 进程。

问:新架构如何解决普通 JDBC 数据源的数据倾斜问题?

答:TiSpark 并非一个普通的 JDBC 数据源。它通过查询系统表 TABLE_REGIONS 从 TiDB 获取表的 Region 分布信息,每个 Region 对应 TiKV 上的一个数据范围。TiSpark 以此信息为依据,将 Spark 的任务(Task)与 TiDB 的 Region 做一对一或多对一的映射,确保每个任务处理的数据量大致均衡,从而实现了高效的并行读取并避免了数据倾斜。

问:旧版本的 TiSpark 还能继续使用吗?

答:已发布的旧版本 Classic TiSpark 在其对应的 TiDB 版本生命周期内会继续提供支持。但新功能开发和对新版本 TiDB(v6.5 之后)的兼容性适配将只在新架构的 TiSpark 上进行。我们强烈建议用户迁移到 TiSpark 4.0。

问:迁移到新架构需要注意什么?对资源有什么影响?

答:主要的变化是计算负载的转移。原先部分在 Spark Executor 中完成的解码和计算工作,现在完全下推到 TiDB Server。因此,你需要确保 TiDB Server 集群有足够的计算资源来处理来自 Spark 的分析型查询。你可能需要增加 TiDB Server 节点的数量,或将其与在线的 OLTP 负载进行物理隔离。