使用 Lightning 导入 ORC 格式文件

简介

本文档主要介绍如何使用 Lightning 导入由 Hive 生成的 ORC 格式文件到平凯数据库集群中。

为了支持大数据生态 Hadoop 中 Hive 集群生成的数据,平凯数据库开始支持用 Lightning 工具导入 ORC 数据文件。关于 Lightning 的使用简介可参考 TiDB Lightning 简介。本文仅介绍关于 ORC 数据格式的导入方式。

Lightning 导入 ORC 文件步骤

准备平凯数据库集群

首先需要准备一个平凯数据库集群,用于后续导入 ORC 格式数据。

数据准备

由于 Hive 集群中的数据不是直接兼容平凯数据库的,对于 Hive 集群中的复合数据类型,平凯数据库做了类型转换。因为在导入之前,需要提前准备 schema 文件以及 data 文件,并将其直接放在同一个路径下.

准备 schema 文件

  1. database schema 文件。

    database schema 用于在平凯数据库集群中创建 database,其文件命名格式如下:

    {dbName}-schema-create.sql
    • {dbName} 表示数据库名。
    • 文件内容是创建 database 的 SQL 语句,平凯数据库中创建 schema sql 与 Hive sql 基本相同。
  2. table schema 文件。

    Table schema 用于在平凯数据库集群中创建 table,其文件命名方式如下:

    {dbName}.{tableName}-schema.sql
    • {dbName} 是数据库名,{tableName} 是表名。
    • 文件是创建 table 对应的 SQL 语句。
  3. Data 数据文件。

    Data 文件就是用于恢复的 ORC 格式数据文件,其命名方式如下:

    {dbName}.{tableName}.00000000{i}.ORC
    • 文件的数据格式是 ORC,表示 {dbName}.{tableName} 表下的数据文件。
    • 如果从 Hive 集群中导入的文件名不是此格式,需要修改为此格式命名,便于 Lightning 在导入时自动识别数据文件对应的 schema 和 table。

创建导入配置文件

配置文件中包含有各种配置项,如待导入的平凯数据库集群的 IP 和 port,待导入的数据源的路径,导入的 backend(tidb 模式或 local 模式),关于 TiDB lightning 导入的配置详情,请参考:https://docs.pingcap.com/zh/tidb/stable/tidb-lightning-configuration

执行导入命令

./tidb-lightning -config ./{config_file}

ORC 数据格式与平凯数据库数据格式对应

在导入 ORC 数据前需要准备好创建数据库和创建表 sql,但 Hive 中表内字段的某些格式平凯数据库是不能直接支持的,可以转换成对应的其他类型格式。ORC 字段数据格式与平凯数据库支持的数据格式之间的对应如下:

类别ORC 字段类型平凯数据库字段类型
布尔类型BOOLEANBOOLEAN
整形TINYINTTINYINT
整形SMALLINTSMALLINT
整形INTINT
整形BIGINTBIGINT
浮点型FLOATFLOAT
浮点型DOUBLEDOUBLE
定点类型DECIMALDECIMAL
字符串类型BINARYVARBINARY
字符串类型STRINGVARCHAR
字符串类型CHARCHAR
字符串类型VARCHARVARCHAR
日期类型TIMESTAMPDATETIME
日期类型DATEDATE
复合类型STRUCTJSON
复合类型LISTJSON
复合类型MAPJSON
复合类型UNIONJSON

Lightning 导入 ORC 文件示例

Hive 集群中的 schema 和 data

创建 database

create database ORC_supported_db;

创建 table

CREATE TABLE ORC_supported_table ( boolean_col BOOLEAN, tinyint_col TINYINT, smallint_col SMALLINT, int_col INT, bigint_col BIGINT, float_col FLOAT, double_col DOUBLE, decimal_col DECIMAL(10,2), string_col STRING, char_col CHAR(10), varchar_col VARCHAR(20), binary_col BINARY, timestamp_col TIMESTAMP, date_col DATE, struct_col STRUCT<field1:INT, field2:STRING, field3:STRUCT<subfield1:STRING, subfield2:INT>>, array_col ARRAY<STRUCT<element1:STRING, element2:INT>>, map_col MAP<STRING, STRUCT<value1:INT, value2:STRING>>, union_col STRUCT<type:STRING, value:STRING> ) STORED AS ORC TBLPROPERTIES ( 'ORC.compress'='SNAPPY' );

插入数据并查询

INSERT INTO ORC_supported_table VALUES (true, 1, 10, 100, 1000, 1.23, 3.14, 99.99, 'example1', 'char_value1', 'varchar_value1', 'binary_hello', '2022-01-01 00:00:00', '2022-01-01', named_struct('field1', 1, 'field2', 'example1', 'field3', named_struct('subfield1', 'sub_example1', 'subfield2', 2)), array(named_struct('element1', 'element_example1', 'element2', 3)), map('key1', named_struct('value1', 4, 'value2', 'value_example1')), named_struct('type', 'union_type1', 'value', 'union_value1')); INSERT INTO ORC_supported_table VALUES (false, 2, 20, 200, 2000, 2.34, 4.56, 88.88, 'example2', 'char_value2', 'varchar_value2', 'binary_world', '2022-02-02 00:00:00', '2022-02-02', named_struct('field1', 2, 'field2', 'example2', 'field3', named_struct('subfield1', 'sub_example2', 'subfield2', 3)), array(named_struct('element1', 'element_example2', 'element2', 4)), map('key2', named_struct('value1', 5, 'value2', 'value_example2')), named_struct('type', 'union_type2', 'value', 'union_value2'));
select * from ORC_supported_table; true 1 10 100 1000 1.23 3.14 99.99 example1 char_value varchar_value1 binary_hello 2022-01-01 00:00:00 2022-01-01 {"field1":1,"field2":"example1","field3":{"subfield1":"sub_example1","subfield2":2}} [{"element1":"element_example1","element2":3}] {"key1":{"value1":4,"value2":"value_example1"}} {"type":"union_type1","value":"union_value1"} false 2 20 200 2000 2.34 4.56 88.88 example2 char_value varchar_value2 binary_world 2022-02-02 00:00:00 2022-02-02 {"field1":2,"field2":"example2","field3":{"subfield1":"sub_example2","subfield2":3}} [{"element1":"element_example2","element2":4}] {"key2":{"value1":5,"value2":"value_example2"}} {"type":"union_type2","value":"union_value2"} Time taken: 0.112 seconds, Fetched: 2 row(s)

准备平凯数据库集群对应的 schema 和 data

准备 schema 文件

  • 手动创建 schema 文件,其文件命名如下:

    ORC_supported_db-schema-create.sql
  • Schema 文件内容:

    /*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; CREATE DATABASE `ORC_supported_db` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
  • 平凯数据库创建 database sql 与 Hive sql 相同

准备 table 文件

  • 手动创建 table 文件,其命名如下:

    ORC_supported_db.ORC_supported_table-schema.sql
  • Table 文件内容:

    /*!40014 SET FOREIGN_KEY_CHECKS=0*/; /*!40101 SET NAMES binary*/; CREATE TABLE ORC_supported_table ( boolean_col BOOLEAN, tinyint_col TINYINT, smallint_col SMALLINT, int_col INT, bigint_col BIGINT, float_col FLOAT, double_col DOUBLE, decimal_col DECIMAL(10,2), string_col VARCHAR(255), char_col CHAR(10), varchar_col VARCHAR(20), binary_col VARBINARY(255), timestamp_col DATETIME(6), date_col DATE, struct_col JSON, array_col JSON, map_col JSON, union_col JSON ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

准备 ORC data 文件

Hive 集群中的 ORC 文件是简单的命名方式,如 000000_0000000_0_copy_1 两个 ORC 文件,将这两个文件名修改成 Lightning 可以识别的命名方式:

mv 000000_0 ORC_supported_db.ORC_supported_table.000000000.ORC mv 000000_0_copy_1 ORC_supported_db.ORC_supported_table.000000001.ORC

最后将上述的 schema,table,和 data 数据文件统一放到待导入的路径下,如下:

# ls -l /data3/ORC_demo 总用量 16 -rw-r--r-- 1 root root 3091 11月 16 18:45 ORC_supported_db.ORC_supported_table.000000000.ORC -rw-r--r-- 1 root root 3094 11月 16 18:45 ORC_supported_db.ORC_supported_table.000000001.ORC -rw-r--r-- 1 root root 558 11月 16 19:27 ORC_supported_db.ORC_supported_table-schema.sql -rw-r--r-- 1 root root 144 11月 16 19:01 ORC_supported_db-schema-create.sql

创建导入 config

创建配置文件 import_config,其内容如下:

[lightning] # 日志 level = "info" file = "ORC_physical.log" # 启动之前检查集群是否满足最低需求。 check-requirements = true [tikv-importer] # 选择使用的导入模式 backend = "local" # 设置排序的键值对的临时存放地址,目标路径需要是一个空目录 sorted-kv-dir = "/data3/sord_kv_dir" # Logical Import Mode 插入重复数据时执行的操作。 # - replace:新数据替代已有数据 # - ignore:保留已有数据,忽略新数据 # - error:中止导入并报错 on-duplicate = "replace" [mydumper] # 源数据目录。 data-source-dir = "/data3/ORC_demo" # 配置通配符规则,默认规则会过滤 mysql、sys、INFORMATION_SCHEMA、PERFORMANCE_SCHEMA、METRICS_SCHEMA、INSPECTION_SCHEMA 系统数据库下的所有表 # 若不配置该项,导入系统表时会出现“找不到 schema”的异常 filter = ['*.*', '!mysql.*', '!sys.*', '!INFORMATION_SCHEMA.*', '!PERFORMANCE_SCHEMA.*', '!METRICS_SCHEMA.*', '!INSPECTION_SCHEMA.*'] [tidb] # 目标集群的信息 host = "172.16.6.95" port = 4200 user = "root" #password = "rootroot" # 表架构信息在从 TiDB 的“状态端口”获取。 status-port = 11080 # 集群 pd 的地址 pd-addr = "172.16.6.95:2479"

数据源路径为 /data3/ORC_demo,路径下存放的是已经准备好的 schema,table 和 ORC data 文件;从配置中可以看到,本次导入采用 backend=local 的物理导入模式。

执行导入命令

执行 tidb-lightning 的导入命令:

./tidb-lightning -config ./import_config

正确执行的结果如下:

Verbose debug logs will be written to ORC_physical.log +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | # | CHECK ITEM | TYPE | PASSED | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 1 | Source csv files size is proper | performance | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 2 | the checkpoints are valid | critical | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 3 | table schemas are valid | critical | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 4 | all importing tables on the target are empty | critical | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 5 | Cluster version check passed | critical | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 6 | Lightning has the correct storage permission | critical | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 7 | local source dir and temp-kv dir are in different disks | performance | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 8 | local disk resources are rich, estimate sorted data size 2.013KiB, local available is 713.6GiB | critical | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 9 | The storage space is rich, which TiKV/Tiflash is 1.605TiB/0B. The estimated storage space is 6.038KiB/0B. | performance | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 10 | Cluster doesn't have too many empty regions | performance | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 11 | Cluster region distribution is balanced | performance | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ | 12 | no CDC or PiTR task found | critical | true | +----+-----------------------------------------------------------------------------------------------------------+-------------+--------+ tidb lightning exit successfully

导入完成后,查询平凯数据库集群中的导入数据:

MySQL > select * from ORC_supported_db.ORC_supported_table; +-------------+-------------+--------------+---------+------------+-----------+------------+-------------+------------+------------+----------------+--------------+----------------------------+------------+----------------------------------------------------------------------------------------------+---------------------------------------------------+-----------------------------------------------------------------------+--------------------------------------------------+ | boolean_col | tinyint_col | smallint_col | int_col | bigint_col | float_col | double_col | decimal_col | string_col | char_col | varchar_col | binary_col | timestamp_col | date_col | struct_col | array_col | map_col | union_col | +-------------+-------------+--------------+---------+------------+-----------+------------+-------------+------------+------------+----------------+--------------+----------------------------+------------+----------------------------------------------------------------------------------------------+---------------------------------------------------+-----------------------------------------------------------------------+--------------------------------------------------+ | 1 | 1 | 10 | 100 | 1000 | 1.23 | 3.14 | 99.99 | example1 | char_value | varchar_value1 | binary_hello | 2022-01-01 00:00:00.000000 | 2022-01-01 | {"field1": 1, "field2": "example1", "field3": {"subfield1": "sub_example1", "subfield2": 2}} | [{"element1": "element_example1", "element2": 3}] | [{"key": "key1", "value": {"value1": 4, "value2": "value_example1"}}] | {"type": "union_type1", "value": "union_value1"} | | 0 | 2 | 20 | 200 | 2000 | 2.34 | 4.56 | 88.88 | example2 | char_value | varchar_value2 | binary_world | 2022-02-02 00:00:00.000000 | 2022-02-02 | {"field1": 2, "field2": "example2", "field3": {"subfield1": "sub_example2", "subfield2": 3}} | [{"element1": "element_example2", "element2": 4}] | [{"key": "key2", "value": {"value1": 5, "value2": "value_example2"}}] | {"type": "union_type2", "value": "union_value2"} | +-------------+-------------+--------------+---------+------------+-----------+------------+-------------+------------+------------+----------------+--------------+----------------------------+------------+----------------------------------------------------------------------------------------------+---------------------------------------------------+-----------------------------------------------------------------------+--------------------------------------------------+