乐趣区

关于数据库:为在线数据库构建基于-Kudu-的实时数据同步

简述

Kudu 是 Cloudera 开源的新型列式存储系统,是 Apache Hadoop 生态圈的成员之一。它专门为了对疾速变动的数据进行疾速的剖析,填补了以往 Hadoop 存储层的空缺。

本篇文章将会介绍几种数据数据同步到 Kudu 的计划抉择,而后从性能和应用角度介绍 CloudCanal 如何帮忙咱们解决数据实时同步到 Kudu。

几种计划

Kudu 是一个存储层组建,若要同步数据到 Kudu 的能够有三种抉择

  • 基于 RDB)选用相似 DataX 这类开源中间件,同时 Kudu 搭建下层 SQL 引擎。可选的 SQL 引擎有:Hive、Impala
  • 基于 MQ)选用 Kafka 生态,基于 Kafka + Flume + Kudu 实现数据同步。
  • 基于编码)开发对应的数据迁徙程序,间接将数据写入 Kudu 存储。

如何抉择?

基于 RDB 计划

  • 须要 Kudu 下层有一个 SQL 引擎。在官网文档上提到了两种应用 Kudu 的形式

    • Hive 是基于 MapReduce 架构、Impala 是基于 MPP 架构
  • 单纯的数据写入并不需要简单的计算逻辑,抉择 MPP 架构显然更适宜一些。

    • 这种状况下举荐 Impala + Kudu + DataX

基于 MQ 计划

  • 比拟适宜源端数据变动有多个不同的消费者,数据同步仅仅是其中一条链路。

基于编码方案

  • 比拟适宜在数据同步过程中须要对数据进行加工。

同步的技术点

建表

  • 对于 Kudu 上的建表须要通过 kudu-client 来进行,例如:
List<ColumnSchema> columns = new ArrayList(2);
columns.add(new ColumnSchema.ColumnSchemaBuilder("key", Type.INT32).key(true).build());
columns.add(new ColumnSchema.ColumnSchemaBuilder("value", Type.STRING).build());
List<String> rangeKeys = new ArrayList<>();
rangeKeys.add("key");
Schema schema = new Schema(columns);
client.createTable(tableName, schema, new CreateTableOptions().setRangePartitionColumns(rangeKeys));
  • Kudu 因为存储引擎限度,每张表必须要指定 Partition Column。
  • 被设置为 Partition 的列不容许 update,如若批改 Partition Column 列的值。须要删除整行数据从新插入。

数据写入

  • Kudu 数据写入 Kudu 反对 InsertUpdateDeleteUpsert 四种操作
KuduTable table = client.openTable(tableName);
KuduSession session = client.newSession();
session.setTimeoutMillis(60000);
for (int i = 0; i < 3; i++) {Insert insert = table.newInsert();
    PartialRow row = insert.getRow();
    row.addInt(0, i);
    row.addString(1, "value" + i);
    session.apply(insert);
}
session.flush();
session.close();

数据类型

  • Kudu 1.6 之前,不反对 Decimal。因而源端数据类型如果是浮点数只能够抉择:float、double、int、string 来承载
  • Kudu 1.15 开始,提供了 varchar 类型能够与 数据库的 varchar 互相对应。在此之前该当抉择 string 类型。

基于 CloudCanal 疾速实现数据同步

后面介绍的三种形式中 RDB 计划要求减少配置 SQL 引擎、MQ 计划 则要求减少 Kafka 和 Flume。它们的数据同步链路都较长一旦呈现问题,比拟不容易排查起因所在。CloudCanal 是采纳了第三种形式。

  • 从源端间接订阅数据变更
  • 通过 kudu-client 间接将数据写入到 Kudu 存储引擎
  • 整个过程无需 MQ 或 SQL 引擎的反对。

比照后面两种形式具备下列几个劣势

  • 资源开销小
  • 链路简略高效
  • 产品化操作便捷

举个 ” 栗子 ”

筹备 CLOUDCANAL

  • SAAS 版参考 自建机器客户端装置 文章
  • 社区版参考文章 docker 装置 文章

增加数据源

  • 登录 CloudCanal 平台
  • 数据源治理 -> 增加数据源
  • 抉择 自建数据源 ,并填写相干数据库信息,其中 网络地址 请按提醒带上端口号
  • 这里须要有两点提醒

    • kudu-client 默认拜访的是 7051 端口,并非提供 Web 界面的 8051
    • 如果 Kudu 是集群化部署,那么在配置网络地址时须要填写集群 ip:port 列表。逗号距离。

同步工作

  • 工作治理治理 -> 创立工作
  • 在创立工作的时候,默认高级选项中会要求至多 3 正本。能够依据 Kudu 集群状况来批改对应配置。
  • 工作类型环节抉择 数据同步
  • 在表抉择环节能够抉择要同步的源端表以及同步的动作
  • 最初到确认环节创立工作即可。
  • 在构造迁徙工作跑完之后,就能够看到 Kudu 管制台上曾经把对应的 Kudu 表全副创立结束

在最初举例应用 Impala 来查问位于 Kudu 中的数据,如下是建表语句:

CREATE EXTERNAL TABLE `canal_test_case_column_default` STORED AS KUDU
TBLPROPERTIES(
    'kudu.table_name' = 'my-j52hri3880d6dka.canal_test_case.column_default',
    'kudu.master_addresses' = '192.168.0.254:7051')
  • 工作在进入增量同步之后尝试对源端就会发现数据曾经实时的进入到 Kudu 啦,此时通过 SQL 查问 Impala 上的 Kudu 表就能够看到数据

能力和限度

  • 反对 MySQL、PostgreSQL、Oracle 作为源端到 Kudu 的同步
  • 反对主键变更同步,转换为 Kudu 删除在插入
  • 对端 Kudu 要求 1.6 版本
  • 不反对源端 无主键表
  • 不反对 DDL 增量同步

总结

本文简略介绍了几种将数据同步到 Kudu 的形式,以及基于 CloudCanal 是如何实现实时同步数据到 Kudu。各位小伙伴,如果感觉还不错,请点赞、评论加转发吧。

更多精彩

  • 5 分钟搞定 MySQL 到 ElasticSearch 迁徙同步 -CloudCanal 实战
  • 5 分钟搞定 MySQL 到 MySQL 异构在线数据迁徙同步 -CloudCanal 实战
  • 5 分钟搞定 MySQL 到 ClickHouse 实时数据同步 -CloudCanal 实战
  • MySQL 到 ElasticSearch 实时同步构建数据检索服务的选型与思考
  • 构建基于 Kafka 直达的混合云在线数据生态 -cloudcanal 实战
  • 5 分钟搞定 MySQL 到 TiDB 的数据同步 – CloudCanal 实战

社区快讯

  • 咱们创立 CloudCanal 微信粉丝群啦,在外面,你能够失去最新版本公布信息和资源链接,你能看到其余用户一手评测、应用状况,你更能失去激情的问题解答,当然你还能够给咱们提需要和问题。快快退出吧。

    • 扫描下方二维码,增加咱们小助手微信拉您进群,接头语(“CloudCanal yyds”)


退出 CloudCanal 粉丝群把握一手音讯和获取更多福利,请增加咱们小助手微信:suhuayue001
CloudCanal- 收费好用的企业级数据同步工具,欢送品鉴。
理解更多产品能够查看官方网站:http://www.clougence.com
CloudCanal 社区:https://www.askcug.com/

退出移动版