写点什么

MatrixOne 实战系列回顾 | 导入导出项目场景实践

作者:MatrixOrigin
  • 2023-11-21
    上海
  • 本文字数:6931 字

    阅读完需:约 23 分钟

MatrixOne实战系列回顾 | 导入导出项目场景实践

本次分享主要介绍 MatrixOne 导入导出以及项目场景实践。将从四个方向为大家演示 MatrixOne 的功能,分别是数据的导入、导出、对接数据集成工具,以及 Java 连接实战。

数据导入会使用三种方式将数据导入至 MatrixOne 中。分别是 insert 语句、load data 语句还有 source 方式。特别注意的是 load data 支持从远端 S3 文件系统上拉取文件导入。

对于 json 文件,MatrixOne 也提供了导入方式,等下我们一起来尝试下。

数据导出 MatrixOne 也提供了多种方式,这里我们使用 select into outfile 的方式和 mo_dump 工具来实践一下数据的导出。

作为一款 HSTAP 数据库,MatrixOne 从一定程度上也支持了市面上比较流行的一些数据集成工具和计算引擎。本次视频会为大家演示 Datax、Flink、Spark 集成 MatrixOne。

最后,以一个简单 SpringBoot 项目,将 MatrixOne 作为业务数据库进行 CRUD 功能。

我相信,通过这四部分的实践,大家应该可以基本了解 MatrixOne 数据库的强大功能。

接下来我们开始进入第一部分,MatrixOne 数据导入。

Part 1 数据导入

#1 insert into 方式

这里需要在 MatrixOne 中创建一个客户表,客户表有由四个字段组成,分别是自增主键,客户名、市、国家均为 Varchar 类型。我们先指定列导入,然后使用批量 insert 方式进行导入。最后我们在创建一个客户表的备份表,采用 insert into select 方式,将客户表的数据备份至客户备份表。

#2 load data 方式

▶ 2.1 导入 csv 文件

下面我们来实践一下 load data 功能。先将本地已经提前准备好的 customer.csv 文件导入。

先看一下这个 csv 文件,有 3 行测试数据,起始行就是数据,无需去除表头,列分割符是英文逗号,行分隔符是换行符。

然后执行 load data 命令进行数据导入,需要注意地方就是文件的路径,如果不太确定的话就写绝对路径。

注意:如果你的数据文件与 MatrixOne 服务器在不同的机器上,即数据文件在你所使用的客户端机器上时,那么你连接 MatrixOne 服务主机需要使用 Mysql Client 命令需要增加一个 --local-infile 参数;并且导入的命令行需要使用 load data local infile 语法。

除此之外 MatrixOne 支持使用 load data 命令从 S3 对象存储服务批量导入 csv 文件、jsonline 文件。

我这里做了一个从阿里 OSS 文件系统中导入 csv 文件至 MatrixOne 的测试,由于时间问题我就不在演示了,我们一起看一下语法和效果。

首先需要我们提前在 OSS 中创建一个桶,然后获取一下授权所需的 Ak 和 sk 以及 region。

在 load data 中我们依次配置 OSS endpoint,ak,sk,桶名称,region,压缩格式,文件路径,别的方式和本地导入一致。

▶ 2.2 导入 json 文件

演示了导入 csv 文件,我们一起来试下导入 json 文件。

首先我们创建一个新表用于接收导入数据。创建一个 json_line_obj.jl 文件新增几条 json 测试数据。

然后使用使用 load data 命令进行导入,需要注意的是这个 json 文件里面的全部是 object,非数组结构,字段名称和类型需要和 MatrixOne 表中的字段名称类型对应。

然后我们在创建一个新表 t2,用来测试导入 json 数组的情况。

这里我们提前准备三个文件,第一个是普通的 json.jl 文件,第二个是一个压缩格式为 bz2 压缩包,解压以后可以看到里面就是一个 jl 文件,第三个是一个压缩格式为 gz 的。

我们依次执行三条导入命令,其中 jsondata 字段用于标识 json 结构,与之前区别就是这里不再是 object 而是填写 array。

第二条命令需要注意配置压缩格式。

第三条命令再导入的时候忽略了第一行进行导入,我们执行后看下效果。

可以看到这里导入的时候没有第一行数据。

#3 source 命令

最后我们采用 source 命令将提前准备好的 sql 文件导入 MatrixOne。

如果数据量比较大的话,可以采用 nohup 配合 Mysql 客户端 -e 参数进行后台导入。

接下来给大家分享一下 MatrixOne 的数据导出。

首先采用 select into outfile 的方式。

我提前准备了一张 sys_permission 表,里面有一些测试数据。

我们使用 SQL 进行导出。

导出完成后,可以在当前目录下看到对应产生的 sys_permission.csv 文件。

另外,在导出 SQL 中还可以指定分割符,再使用竖线作为列分隔符导出一次。

导出完成后,可以看到对应的文件中,列的分割符已经变成了竖线。


Part 2 数据导出

#1 mo-dump 工具

接下来给大家介绍一下 mo-dump 工具。它是 MatrixOne 的一个客户端导出工具,与 mysqldump 一样,它可以被用于通过导出 .sql 类型的文件来对 MatrixOne 数据库进行备份,导出的 sql 文件还包含表结构创建语句。

其中可以配置这些参数:

  • -u 指定连接 MatrixOne 服务器的用户名。只有具有数据库和表读取权限的用户才能使用 mo-dump,默认值 root。

  • -p 指定 MatrixOne 用户的密码。默认值:111。

  • -h 指定 MatrixOne 服务器的主机 IP 地址。默认值:127.0.0.1

  • -P 指定 MatrixOne 服务器的端口。默认值:6001

  • -db 指定必需参数。要备份的数据库的名称。

  • -net-buffer-length 指定数据包大小,即 SQL 语句字符的总大小。数据包是 SQL 导出数据的基本单位,如果不设置参数,则默认 1048576 Byte(1M),最大可设置 16777216 Byte(16M)。假如这里的参数设置为 16777216 Byte(16M),那么,当要导出大于 16M 的数据时,会把数据拆分成多个 16M 的数据包,除最后一个数据包之外,其它数据包大小都为 16M。

  • -tbl 是可选参数。如果参数为空,则导出整个数据库。如果要备份指定表,则可以在命令中指定多个 -tbl 和表名。

mo-dump 工具需要从 git 上下载源码进行编译,这里由于时间原因,我就不在演示编译过程了,直接用我提前编译好的二进制包进行演示。

通过 mo-dump 命令将我们之前创建的 test_json_load 表导出。

可以看到导出的结果就是一个.sql 的文件,我们查看下这个 sql 文件。

Part 3 对接数据集成工具

我们先通过 Datax 将数据从 Mysql 中导入至 MatrixOne。这里我们用到的 Mysql 版本为 8.0.32,我已经提前准备好了测试库表作为源数据。

MatrixOne 与 MySQL 8.0 高度兼容,由于 DataX 自带的 MySQL Writer 中适配的为 5.1 的 JDBC 驱动,为提升程序的兼容性,社区单独改造出基于 8.0 驱动的 MatrixOne Writer 插件。

另外注意这一句:在底层实现上, MatrixOneWriter 通过 JDBC 连接远程 MatrixOne 数据库,并执行相应的 insert into ... 的 sql 语句将数据写入 MatrixOne(内部会分批次提交入库)。

Datax 的部署和介绍就不在多说了。我们可以先看一下 Datax 作业配置文件,这个是我们需要自己编写的。

我们配置信息全部在 job 这个对象里面。job 对象有 2 个属性,分别是 setting content

  • setting 中可以配一些 Datax 的任务参数,如这个地方的 speed,表示导入速度,也就是设置的并行度。

  • content 中配置数据源和目标源信息,数据源信息配置在 reader 对象中,目标源配置在 writer 中,具体 reader 和 writer 的配置在后面做导入的时候根据我们自己编写的文件进行分析。

我提前准备好了 Datax,并且已经把 matrixOneWriter 放到了对应的 plugin 目录下。

接下来我们看一下自己编写的作业文件,习惯把这个文件放到 Datax 的 job 目录下。

先说一下我们的目标是从 Mysql 中读取数据写入 MatrixOne,所以这里的 reader 就用 Datax 自带的 mysqlreader 就行。writer 使用我们导入的 matrixonewriter。

注意这个地方 reader、writer 名称是严格区分大小写的。

除了需要配置 name,还需要在 parameter 中配置导入的行 column,Mysql 的连接信息 connection,用户名,密码这些。

同理 writer 除了配置 name,也需要在 parameter 中配置 column,MatrixOne 连接信息,用户名,密码。

除了这个,可以 Datax 在做导出的时候提供了 preSql 字段用来实现 ETL。这个地方的 ETL

SQL 会在导入前先执行。

当配置文件编写完以后执行 Datax 命令,指定作业文件。这里注意作业文件的路径。

执行成功后可以看到数据已经写入到 MatrixOne 中了。

Part 4 Java 连接实战

接下来给大家演示一下通过 Flink 引擎,分别将 Mysql 和 Kafka 中的数据导入至 MatrixOne。

Apache Flink 是一个分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。

Flink 的概念我就不在过多介绍了,我们直接开始实践。

这里在多说一句,本次分享视频中使用的 MatrixOne 的版本均是 1.0.0 RC2。

#1 Mysql

我们先将 Mysql 作为数据源,将 Mysql 中的数据通过 Flink JDBC 的方式导入到 MatrixOne。可以看到这里我使用的 Mysql 版本为 8.0.32。

接下来,我们分别在 Mysql 中创建数据源表,并新增一些数据。再到 MatrixOne 中创建目标表用于接收从 Mysql 中导出的数据。

在 Mysql 中创建 test 数据库,并在这个数据库下面创建一个 person 表。通过 insert 方式新增 3 条数据用于演示。

同理在 MatrixOne 中创建一个 motest 库,在该库下创建一个与 Mysql 对应的 person 表,这里注意保持数据类型一致,否则会出现问题。

然后,需要在本地创建一个 Flink 项目。首先需要创建一个 Maven 项目,把我们需要用到相关依赖配置进来。这个项目我也提前创建好了。

先看一下 pom 文件,需要注意的是 Flink 的版本这里使用的是 1.17.0,JDK 的版本为 1.8,还需要引入 flink-connector-jdbc 和 mysql-connector-java,Mysql 驱动版本与 Mysql 的版本需要兼容。

还需要编写一个实体类 Person 用于映射数据库对应的数据。

当前面工作准备好以后,我们就可以编写 Flink 主程序了。

创建一个叫做 Mysql2Mo 的类,在 main 函数中编写 Flink 程序。

总结一下编写一个 Flink 程序大致需要几个步骤:

  1. 获取执行环境。

  2. 设置并行度,这里我设置 1 表示采用一个线程去执行。

  3. 然后设置查询的字段类型和字段名。

  4. 添加 Source,就是数据源,这里配置的就是 Mysql 的连接信息,通过 query 中配置的 SQL 将数据查出来。

  5. 拿到数据源以后,可以通过 Flink 程序做 ETL,这里举了个简单的例子,把拿到的结果封装成 Person 对象。

  6. 配置 Sink,就是数据最终写入的地址,也就是我们这里 MatrixOne,配置相关参数。

  7. 执行 Flink 程序。

执行成功以后,我们到 MatrixOne 中查看到之前新增到 Mysql 中的数据已经导入进来了。


#2 Kafka

然后我们将 Kafka 作为数据源,从 Kafka 中同步数据至 MatrixOne。

我本地已经安装好了 Kafka,用到的 Kafka 版本为 3.0.0。

我们继续用之前的 MatrixOne 创建的 person 表,为了更清晰的看见效果使用 truncate 命令先把之前的测试数据给清理掉。

然后使用 Kafka 命令行脚本创建一个主题。主题名称是 matrixone。

接下来我们需要编写 Flink 程序,主要步骤和之前一致。

我们主要看下最关键的 Source 和 Sink。

Source 这里配置的为 Kafka 的连接信息,包含消费者组和消费策略,然后自定义了一个序列化器,将字符串转为 Person 对象。

这里可以打印一下获取到的 Source 数据。

Sink 这里配置 MatrixOne 的连接信息,使用 JDBC connector。

然后我们启动项目,Flink 程序会阻塞在这里,等待我们往 Kafka 中生产数据。

我们使用命令行工具,模拟一个 Kafka 生产者,往 Kafka 中写入 3 条数据。

然后观察 MatrixOne 也会同步这 3 条数据。

演示完适用于流处理的 Flink 引擎,接下来给大家演示一下批处理引擎 Spark 集成 MatrixOne,通过 Spark 将 Mysql 数据写入 MatrixOne。

这里使用的 MatrixOne 版本为 1.0.0 RC2 这个版本。是通过 mo_ctl 工具搭建的单机版本。

我们先将 Mysql 作为数据源,将 Mysql 中的数据通过 Flink JDBC 的方式导入到 MatrixOne。可以看到这里我使用的 Mysql 版本为 8.0.32。

接下来,我们分别在 Mysql 中创建数据源表,并新增一些数据。再到 MatrixOne 中创建目标表用于接收从 Mysql 中导出的数据。

在 Mysql 中创建 test 数据库,并在这个数据库下面创建一个 person 表。通过 insert 方式新增 3 条数据用于演示。

同理在 MatrixOne 中创建一个 motest 库,在该库下创建一个与 Mysql 对应的 person 表,这里注意保持数据类型一致,否则会出现问题。

然后,需要在本地创建一个 Spark 项目。首先需要创建一个 Maven 项目,把我们需要用到相关依赖配置进来。这个项目我也提前创建好了。

先看一下 pom 文件,需要注意的是 Spark 的版本这里使用的是 3.2.1,JDK 的版本为 1.8,额外注意 Mysql 驱动的版本与 Mysql 需要兼容。

还需要编写一个实体类 Person 用于映射数据库对应的数据。

当前面工作准备好以后,我们就可以编写 Spark 主程序了。

创建一个叫做 Mysql2Mo 的类,在 main 函数中编写 Spark 程序。

这里总结一下编写一个 Spark 程序大致需要几个步骤:

  1. 获取 Session 对象,通过 Session 拿到 Spark 上下文对象。

  2. 设置 Mysql 连接信息,包含用户名、密码、驱动类。

  3. 使用上下文对象配置 Mysql 连接 URL 进行数据读取。

  4. 4、将读取结果封装成 DataSet 对象。

  5. 通过 DataSet Stream 方式进行 ETL,这里筛选出 id 大于 2 的数据。

  6. 配置 MatrixOne 连接信息,将数据写入目标库。

执行成功以后,我们到 MatrixOne 中查看到之前新增到 Mysql 中的数据已经导入进来了。

#3 SpringBoot

最后一部分,我们将以一个 SpringBoot 项目,用 MatrixOne 作为业务数据库进行 CRUD 功能。

首先在 MatrixOne 中创建用户表并新增数据。

然后在本地搭建一个 Springboot 和 Mybatis-plus 的项目。

这里需要把用到的 jar 包通过 Maven 配置进来。

接下来在 Springboot 的配置文件中配置一下 datasource,这里的配置和配置 Mysql 一致。

然后编译一个 mapper,继承 Myabtis-plus 根接口 BaseMapper,就可以使用自带的基础的增删改查功能,无需自己编写。

这里我没有编写 Service 层,方便起见直接在 controller 层调用 mapper。

最后编写一下 controller 层,对外提供四个接口,分别是查询用户列表接口、新增用户接口、修改用户接口、删除用户接口。

然后我们启动项目,通过 Http 测试工具直接访问。

分享到此结束,感谢大家观看。


Q&A 环节

感谢大家和我一起学习导入导出项目场景实践的相关知识,下面进入 Q&A 环节。

Q:请问我想通过 mo-dump 工具只导出表结构,而不要数据,怎么导呢?

A:可以在导出命令后跟-no-data 参数,指定不导出数据。

Q:使用 load data 导入的 json 对象中缺少某些字段,导入会报错吗?

A:导入会报错,导入 json 中字段多余表中字段,可以正常导入不过多出字段会被忽略,如果少于的话,则无法导入。

Q:我在执行 source 导入的时候导入文件是否可以写相对路径?

A:可以写相对路径,是相对于您使用 mysql 客户端的当前路径的,这里还是建议写全路径,防止出错,另外注意文件权限问题。

Q:使用 load data 命令导入一个大文件时比较耗时,有时候就会断掉又得重新来一遍,能否优化呢?

A:您可以在导入时候指定 PARALLEL 为 true 开启并行导入,例如,对于 2 个 G 的大文件,使用两个线程去进行加载,第 2 个线程先拆分定位到 1G 的位置,然后一直往后读取并进行加载。这样就可以做到两个线程同时读取大文件,每个线程读取 1G 的数据。也可以自己切分数据文件。

Q:Load data 导入有事务吗?

A:所有的 load 语句都是有事务的。

Q:source 导入 sql 时涉及触发器和存储过程会执行生效吗?

A:目前如果 sql 中存在不兼容的数据类型、触发器、函数或存储过程,仍需要手动修改否则执行会报错。

Q:mo-dump 支持批量导出多个数据库吗?

A:仅支持导出单个数据库的备份,如果你有多个数据库需要备份,需要手动运行 mo-dump 多次。

Q:MatrixOne 支持从 Minio 导入数据吗?

A:是支持的,load data 命令支持从本地文件、S3 对象存储服务以及 S3 兼容的对象存储服务中导入数据到 matrixone 中,

而 Minio 也是基于 S3 协议的,所以也是支持的,具体参考文档:https://docs.matrixorigin.cn/1.0.0/MatrixOne/Deploy/import-data-from-minio-to-mo/

Q:MatrixOne 导入导出数据时,如果出现编码问题,导致数据乱码,我们一般是怎么解决的?

A:由于 matrixone 默认只支持 UTF8 这一种编码且无法更改;所以在导入数据时如果出现了乱码,我们就不能通过修改数据库和表的字符集来解决,可以试着转换数据编码为 UTF8。常见的转换工具有 iconv 和 recode,比如:将 GBK 编码的数据转换为 UTF-8 编码:iconv -f GBK -t UTF8 t1.sql > t1_utf8.sql。

Q:MatrixOne 导入导出时 ,需要哪些权限?

A:租户管理员的话,通过默认角色可以直接进行导入、导出操作。普通用户的话,导入时,需要导入表的'insert'权限;select...into outfile 方式导出时,需要导出表的'select'权限;mo-dump 导出时,需要所有表(table *.*)的'select'权限和所有库(database *.*)的'show tables'权限。


关于 MatrixOneMatrixOne 是一款基于云原生技术,可同时在公有云和私有云部署的多模数据库。该产品使用存算分离、读写分离、冷热分离的原创技术架构,能够在一套存储和计算系统下同时支持事务、分析、流、时序和向量等多种负载,并能够实时、按需的隔离或共享存储和计算资源。云原生数据库 MatrixOne 能够帮助用户大幅简化日益复杂的 IT 架构,提供极简、极灵活、高性价比和高性能的数据服务。MatrixOne 企业版和 MatrixOne 云服务自发布以来,已经在互联网、金融、能源、制造、教育、医疗等多个行业得到应用。得益于其独特的架构设计,用户可以降低多达 70%的硬件和运维成本,增加 3-5 倍的开发效率,同时更加灵活的响应市场需求变化和更加高效的抓住创新机会。在相同硬件投入时,MatrixOne 可获得数倍以上的性能提升。MatrixOne 秉持开源开放、生态共建的理念,核心代码全部开源,全面兼容 MySQL 协议,并与合作伙伴打造了多个端到端解决方案,大幅降低用户的迁移和使用成本,也帮助用户避免了供应商锁定风险。MatrixOrigin 官网:新一代超融合异构开源数据库-矩阵起源(深圳)信息科技有限公司 MatrixOneGithub 仓库:GitHub - matrixorigin/matrixone: Hyperconverged cloud-edge native database关键词超融合数据库、多模数据库、云原生数据库、国产数据库

发布于: 刚刚阅读数: 4
用户头像

MatrixOrigin

关注

还未添加个人签名 2021-12-06 加入

一个以技术创新和用户价值为核心的基础软件技术公司。

评论

发布
暂无评论
MatrixOne实战系列回顾 | 导入导出项目场景实践_分布式数据库_MatrixOrigin_InfoQ写作社区