TiDB#

简介#

TiDB 是一款开源分布式关系型数据库,支持水平扩缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。OpenMLDB 支持使用 TiDB 作为离线存储引擎,用于读取和导出特征计算的数据。

使用#

安装#

当前版本使用TiSpark来操作TiDB数据库, 需要先下载 TiSpark 3.1.x 的相关依赖(tispark-assembly-3.2_2.12-3.1.5.jarmysql-connector-java-8.0.29.jar)。如果TiSpark版本不兼容现有的TiDB版本,可以在TiSpark文档查找下载对应的TiSpark依赖,然后将其添加到Spark的classpath/jars中。

配置#

你需要将TiDB配置添加到Spark配置中。有两种方式:

  • taskmanager.properties(.template): 在配置项 spark.default.conf 中加入TiDB配置,随后重启taskmanager。

  • CLI: 在 ini conf 中加入此配置项,并使用--spark_conf启动CLI,参考客户端Spark配置文件

TiDB关于TiSpark的配置详情参考TiSpark Configuration

例如,在taskmanager.properties(.template)中的配置:

spark.default.conf=spark.sql.extensions=org.apache.spark.sql.TiExtensions;spark.sql.catalog.tidb_catalog=org.apache.spark.sql.catalyst.catalog.TiCatalog;spark.sql.catalog.tidb_catalog.pd.addresses=127.0.0.1:2379;spark.tispark.pd.addresses=127.0.0.1:2379;spark.sql.tidb.addr=127.0.0.1;spark.sql.tidb.port=4000;spark.sql.tidb.user=root;spark.sql.tidb.password=root;

任一配置成功后,均使用tidb_catalog.<db_name>.<table_name>的格式访问TiDB表。如果不想添加tidb的catalog名称前缀,可以在配置中设置spark.sql.catalog.default=tidb_catalog。这样可以使用<db_name>.<table_name>的格式访问TiDB表。

数据格式#

TiDB schema参考TiDB Schema。目前,仅支持以下TiDB数据格式:

OpenMLDB 数据格式

TiDB 数据格式

BOOL

BOOL

SMALLINT

SMALLINT

INT

INT

BIGINT

BIGINT

FLOAT

FLOAT

DOUBLE

DOUBLE

DATE

DATE

TIMESTAMP

DATETIME

TIMESTAMP

TIMESTAMP

STRING

VARCHAR(M)

提示:不对称的整型转换会被取值范围影响,请尽量参考以上数据类型进行映射。

导入 TiDB 数据到 OpenMLDB#

对于 TiDB 数据源的导入是通过 API LOAD DATA INFILE 进行支持,通过使用特定的 URI 接口 tidb://tidb_catalog.[db].[table] 的格式进行导入 TiDB 内的数据。注意:

  • 离线和在线引擎均可以导入 TiDB 数据源

  • TiDB 导入支持软连接,可以减少硬拷贝并且保证 OpenMLDB 随时读取到 TiDB 的最新数据。启用软链接方式进行数据导入:使用参数 deep_copy=false

  • TiDB 在@@execute_mode='online'模式下支持参数skip_cvt:是否跳过字段类型转换,默认为false,如果为true则会进行字段类型转换以及严格的schema检查,如果为false则没有转换以及schema检查动作,性能更好一些,但可能存在类型溢出等错误,需要人工检查。

  • OPTIONS 参数仅有 deep_copymodesqlskip_cvt 有效

举例:

LOAD DATA INFILE 'tidb://tidb_catalog.db1.t1' INTO TABLE t1 OPTIONS(deep_copy=false);

加载数据还支持使用 SQL 语句筛选 TiDB 数据表特定数据,注意 SQL 必须符合 SparkSQL 语法,数据表为注册后的表名,不带 tidb:// 前缀。

举例:

LOAD DATA INFILE 'tidb://tidb_catalog.db1.t1' INTO TABLE tidb_catalog.db1.t1 OPTIONS(deep_copy=true, sql='SELECT * FROM tidb_catalog.db1.t1 where key=\"foo\"')

导出 OpenMLDB 离线引擎数据到 TiDB#

对于 TiDB 数据源的导出是通过 API SELECT INTO 进行支持,通过使用特定的 URI 接口 tidb://tidb_catalog.[db].[table] 的格式进行导出到 TiDB 数仓。注意:

  • 离线引擎可以支持导出 TiDB 数据源,在线引擎还不支持

  • 数据库和数据表必须已经存在,目前不支持对于不存在的数据库或数据表进行自动创建

  • OPTIONS 参数仅mode='append'有效,其他参数overwriteerrorifexists均无效,这是由于TiSpark当前版本不支持,如果TiSpark后续版本支持可以进行升级兼容。

举例:

SELECT col1, col2, col3 FROM t1 INTO OUTFILE 'tidb://tidb_catalog.db1.t1' options(mode='append');