关于sql:实时数仓入门训练营Hologres-数据导入导出实践

97次阅读

共计 7902 个字符,预计需要花费 20 分钟才能阅读完成。

简介:《实时数仓入门训练营》由阿里云研究员王峰、阿里云高级产品专家刘一鸣等实时计算 Flink 版和 Hologres 的多名技术 / 产品一线专家齐上阵,合力搭建此次训练营的课程体系,精心打磨课程内容,直击当下同学们所遇到的痛点问题。由浅入深全方位解析实时数仓的架构、场景、以及实操利用,7 门精品课程帮忙你 5 天工夫从小白成长为大牛!

本文整顿自直播《Hologres 数据导入 / 导出实际 - 王华峰 (继儒)》
视频链接:https://developer.aliyun.com/learning/course/807/detail/13891

内容简要:
一、Hologres 生态介绍
二、Hologres 实时读写接口介绍
三、Hologres 实时读写场景介绍
四、Demo 演示
五、常见问题及将来瞻望

Hologres 生态介绍

(一)Hologres 生态

Hologres 是一款兼容 PostgreSQL 协定的实时交互式剖析产品,也曾经买通了大数据生态。以最常见的几个开源组件来说,如 Apache Flink、Spark、Hive、Kafka 等,Hologres 都曾经有了相干的 Connector 实现并进行了开源。

对于实时链路,用户依靠 Flink 或者 Spark,就能够将上游的比方埋点或业务数据等,以十分高的性能以及毫秒级的提早导入 Hologres。对于离线链路,Hologres 也反对把内部零碎的数据以十分简便的操作导入,反过来也反对再将数据备份回内部零碎,比方阿里云的 MaxComputer、OSS 等。

当数据导入 Hologres 之后,因为 Hologres 自身兼容 PostgreSQL 协定,所以能应用各种现成的查问工具,无缝连贯 Hologres 进行数据的展现、查问等。

(二)Dataworks 数据集成反对输出

除了方才提到的大数据场景之外,应用阿里云的 Dataworks 数据集成性能,咱们还能将用户存储在传统数据库中的数据导入 Hologres,实现不便高效的数据库整库实时镜像。

如上图所示,当下 Dataworks 数据集成反对将 MySQL 的 Binlog,SQLServer 的 CDC,Oracle 的 CDC 实时镜像同步至 Hologres。此外,Dataworks 也反对将 Kafka,还有阿里云 Datahub 的数据同步至 Hologres。

另外值得一提的是,Datahub 这个产品本身也提供了间接将数据实时同步到 Hologres 的性能,这个性能叫 Datahub Connector。应用这个性能用户就无需通过 Flink 或者其余组件,能够间接将数据导入到 Hologres,对于无需 ETL 的数据同步是一个比拟快捷的形式。

Hologres 实时读写接口介绍

Hologres 实时读写实现原理

上图为整个 Hologres 实时读写实现原理架构图。

从上往下看,最上游是利用端,也就是会读写 Hologres 的各种客户端,比如说数据集成,Apache Flink、Spark 等等。这些客户端通常会应用 SQL 接口,将读写数据的申请发送给 Hologres,这些申请会通过一个负载平衡服务器,而后这些申请就会路由散发到一个叫做 Frontend 的节点。一个 Hologres 实例通常有多个 Frontend 节点,这样就能够反对十分高的 QPS 申请。Frontend 节点次要是负责 SQL 的 Parse、优化等性能。

通过一系列的解决之后,Frontend 就会将用户的 SQL 申请转换成一个物理执行打算,而后这些物理执行打算就会被散发到后端的一个执行节点,执行真正的物理读写申请,最终写入的数据会长久化至分布式文件系统,比方阿里的 Pangu 零碎或者开源的 HDFS。

这里要特别强调的是,失常的 SQL 解析,而后通过 Query 的优化器优化生成最优执行打算,通常这部分的链路开销是比拟大的,对于高 QPS 的读写场景,这往往会成为一个性能的瓶颈。

所以对于一些常见的 SQL 场景,这里咱们列了几个 SQL,如下所示。

Fixed Plan

比方 Insert into table values (),就是简略地插入一行或者几行。还有 Insert into table values () on conflict do update,就是对数据进行几行的更新。Select * from table where pk = xxx 和 Delete from table where pk = xxx 是依据主键去进行数据的查找或者删除。

对于这些常见的 SQL,Hologres 的 Frontend 做了肯定的短路优化,略去了很多不必要的优化逻辑,间接生成最优的一个执行打算,并发送给后端的执行节点,这样就能晋升整体的申请吞吐。

上面咱们看一下,当物理执行打算发送到后端之后是如何解决的。


Hologres 后端的整体存储引擎是基于 Log Structured Merge Tree(LSM)来实现的,这里 LSM 可能把随机写变成程序写,大大晋升了数据写入的吞吐。

写申请首先会被写到 Write Ahead Log,也就是传统的 WAL 文件中,一旦写入胜利了,咱们就认为这条记录永恒写入胜利了。之后,咱们会把 WAL 日志 Apply 到 Mem Table 外面,Apply 实现后,数据就对外可见了,能够进行查问,这两头的提早通常在毫秒以内。

当 Mem Table 写满了之后,咱们会有一个异步的线程,将 Mem Table 刷盘长久化,整体流程是一个比拟标准化的 LSM 实现。

这里有别于其余 LSM 实现的存储系统,比方 HBase,Hologres 后端采纳了全异步的实现,基于协程省去了操作系统内核线程开销,大大晋升了零碎 CPU 的利用率,使得 Hologres 的读写性能十分优异。

咱们再回过头来看一下下面利用端的数据写入接口,当初 Flink、Spark 和 Dataworks 读写 Hologres 其实都应用了一个叫做 Holo-Client 的 SDK。

Holo-Client 基于 Jdbc 实现,对读写 holo 最佳实际的封装,能够加重数据集成开发工作量。
咱们也对一些特定场景的 SQL 做了肯定的优化,例如:

  • 数据写入
    1)攒批,基于 jdbc reWriteBatchedInserts 的实现原理;
    2)数据合并,雷同主键的 INSERT/DELETE 在一个批次中会合并缩小申请量;
    3)主动提交,反对基于批行数、批字节大小和最长提交距离主动提交。
  • 数据点查
    1)提供异步点查接口;
    2)QPS 高时主动转入攒批模式。
  • 数据 Copy
    提供并发 CopyIn 的繁难接口。
  • 异样解决
    对 holo 返回异样归类,正确在 holo 降级、扩容等场景下重试期待实例复原。

咱们十分举荐用户之后如果有读写 holo 的场景,就应用 Holo-client 这个 SDK。

Hologres 实时读写场景介绍

介绍完 Hologres 的读写接口的实现原理之后,接下来看一下基于 Hologres 读写接口能实现的几种常见的读写场景。

(一)实时写入场景

第一种是最简略的实时写入场景,如上所示。

这里咱们应用了一个 Blink SQL 的实例,其实就是生成一个随机数据源,而后将数据导入至 Hologres。对于实时写入的场景,Hologres 反对行存和列存这两种格局,还反对依据主键进行去重,这是相较于很多其余 OLAP 零碎的一个十分大的亮点。

另外,Hologres 的实时写入还反对整行数据更新或者数据的部分更新。对于性能而言,Hologres 导入即可见,领有非常低的提早,通常提早在毫秒以内。通过咱们本人的测试,以 TPCH PartSupp 表为例,咱们后端单 Core 能达到 2 万左右的 RPS,而且该性能能够随着实例的资源进行线性扩大。

(二)实时宽表 Merge 场景

而后接下来咱们介绍一下实时宽表 Merge 的场景,这里其实是应用了 holo 的整行部分更新的性能。

以上图为例,比方用户想将多个数据源的数据合并成一张宽表写入至 Hologres。咱们心愿整张表最终有 A |B|C|D|E| F 六个列,而后有一部分数据,比如说 A |B|C| D 这四个列是在一个数据源外面,而后 A |B|E| F 是在另外一个数据源里,咱们心愿把这两个数据源的数据合并写入至 Hologres 的一张宽表。

常见的一种实现是咱们会应用 Flink 的 Join 性能,就是应用两个流同时生产上述数据源,而后在 Flink 外面进行两个流的 Join,进行数据的打宽,最初写入到 Hologres 外面。

然而这种场景的一个问题是 Flink 的 Join 开销通常十分大,因为它须要缓存十分多的状态,这对于整个作业的保护是一个十分大的开销。

上面咱们来看一下 Hologres 是如何解决这个问题的。

上文提到 Hologres 本身反对整合数据的部分更新性能,如上图所示,咱们能够间接用两个流来间接写 Hologres,而无需进行再做 Flink 内的 Join。一个流比方 A |B|C| D 能够间接写 Hologres,另外一个流 A |B|E| F 也能够间接写 Hologres。因为这两个流的数据有雷同的主键,所以当两行数据用雷同的主键写入到 Hologres 的时候,Hologres 外部会进行一个 Merge,最终达到数据打宽的性能,省去了用户本人去写 Flink Join,以及保护这么一个简单作业的问题。

(三)实时维表 Join 场景

介绍完实时写入 Hologres 场景之后,上面咱们来看一下实时读的场景。

实时读通常分为两种,第一种就是咱们常见的 Flink 的实时维表 Join 场景,维表 Join 就是一个点查的实现。

这里 Hologres 的行存表通常能够替换 HBase 来实现 Flink 的维表性能,提供十分高的吞吐以及非常低的提早。

(四)Hologres Binlog 场景

实时读的第二种场景是 Hologres Binlog 场景。Binlog 和 MySQL 的 Binlog 是一个相似的概念,应用 Hologres Binlog 咱们就能实时生产 Hologres 单表的 Change log,能够对每行数据的更新进行追踪记录。

当初实时计算 Flink 版的 Hologres CDC Source,能实现表的实时镜像同步,甚至应用 Flink + Hologres,可能实现 ODS 到 DWD 表的实时 ETL。

Hologres 的 Binlog 性能默认是不开启的。

上图是一个例子,列出了如何应用 Hologres 的 Binlog,这里是一个建表的 DDL。

能够看到咱们有额定两个表的属性,一个叫做 binlog.level,设置为 replica,代表这张表会开启 Hologres 的 Binlog 性能,’binlog.ttl’就是代表 Binlog 数据的一个生命周期,上面咱们应用 Hologres Binlog 看看能达到一个什么样的成果。

因为 Hologres 是一个强 Schema 的数仓,所以咱们甚至可能用 SQL 接口来查问 Hologres 的 Binlog。如上所示,这里咱们通过提供几个暗藏列:hg\_binlog\_lsn,hg\_binlog\_event\_type,hg\_binlog\_timestamp\_us,就能查问到 Hologres 的 Binlog。

这里 hg\_binlog\_lsn 就是代表了每条 Binlog 生成的 LSN 序列号,而后 hg\_binlog\_event\_type 是代表了 Binlog 的音讯类型,它是代表 Delete 还是 Insert 的,或者是 Before Update,或者是说 After Update。这里的 hg\_binlog\_timestamp\_us 代表这条 Binlog 生成的工夫。

有了这几个暗藏列之后,用户就能够十分不便地应用 SQL 来进行 Binlog 的查问,进行数据的 Debug。

Demo 演示

(一)实时计算 Flink 版实时读写 Hologres Demo

介绍完 Hologres 的读写场景之后,咱们通过实际操作的 Demo 来看一下如何应用 Flink 来实时读写 Hologres。

如上图所示,首先,咱们这里有两张 Hologres 的表,这两张表都会开启 Binlog。咱们假如这两者会有实时的写入,而后咱们会写另外一个 Flink 工作去施行生产这两张表的 Binlog,进行这两张表 Binlog 的 Merge,甚至进行肯定的 group by 计算操作,最终将这两张表的数据同步写入之后关 Hologres 的另一张后果表。

接下来进入演示,首先咱们看一下 Hologres 建表的 DDL,如下所示。

a 表的建表 DDL

b 表的建表 DDL

这两张表有两个雷同的字段,别离叫 id 和 create\_time,之后会进行一个数据的聚合。每张表还会有一个不同的值,value\_from\_a 是表 a 所特有的,value\_from\_b 是表 b 所特有的。

构造表

最初咱们会有一张构造表,这张后果表有 a 和 b 两张表共有的两个列,别离从 a 和 b 两张表失去了另外两个列 a 和 b,咱们心愿将 a 和 b 的数据进行一个实时聚合,写入到 Sink 表外面。

咱们看一下整个 Flink 的 SQL。

这里首先是别离申明了两张 Hologres 的 source 表,须要实时的生产 Hologres 两张表的 Binlog。

须要留神的是,咱们这里须要开启‘binlog’=‘true’这个参数来让 Flink 进行生产 Hologres 的 Binlog 以及开启 CDC 模式。

后果表

而后咱们来看一下后果表的申明,如上所示。

在这里须要留神的是,咱们须要设置一个‘ignoreDelete’=‘false’,这样避免咱们会疏忽包含 Delete 或者 beforeUpdate 这种类型的数据,导致数据的不统一。

咱们看一下整个 Flink 计算逻辑的 SQL,如上所示。

这里的逻辑其实比较简单,其实只是将两张表的后果 union 起来,而后进行一个 group by id 和 create\_time 进行实时的 sum,写入到 Hologres 的后果表。

这里的作业上线之后,咱们能够间接启动运行该作业。

在启动的过程中,咱们能够看一下以后 Hologres 这几张表的状态。

能够看到以后 Hologres 这几张表都是一张空表,咱们会对这几张表进行更新,而后看一下数据的同步的过程。

首先往 a 表插入一条数据,能够看到 a 表的数据曾经实时同步到后果表中。
接下来对 b 表数据进行一个更新。

能够看到这两个流的数据曾经实时更新到后果表,并进行了精确的数据聚合。

接下来咱们再更新 a 表。

能够看到对于源表 a 的实时更新,曾经正确地反映到了后果表当中,Flink 十分正确地计算出了两个流的后果。

咱们甚至能够看一下这张 sink 表的 binlog 数据,因为咱们这张构造表也同样开启了 binlog 的性能,如下所示。

能够看到,咱们拿到这张表所有的变更记录,和咱们预期的成果放弃了统一。

以上就是 Flink 实时读写 Hologres 的 Demo。

(二)Dataworks 实时同步 Hologres Demo

接下来咱们看一下应用 Dataworks 将 PolarDB 的数据实时同步到 Hologres 的 Demo 演示。

首先咱们进入到数据集成,数据同步要进行一个数据源的增加,点击数据源增加。

接着新增数据源,抉择 Hologres,填充完所有的信息之后,咱们就能够进行一个数据的增加。

新增数据源

接下来进行数据同步的演示。

如上所示,首先这里曾经有了一个 PolarDB 的数据库,以及事后创立好了一张 user\_details 表,能够看到这里曾经有三条查问后果记录,之后咱们心愿把这张表的数据同步到 Hologres 当中。

而后咱们返回到数据集成,点击一键实时同步至 Hologres,如下所示。

在根本配置中,数据源抉择事后创立好的数据源 PolarDB,之后抉择须要同步的表 user\_details,而后点击下一步。

之后,咱们会须要抉择指标 Hologres 的数据源,增加后进行刷新,能够刷新出 user\_details 这张表,而后能够配置这张表是否须要主动建表,还是用曾经有的表,这里抉择咱们主动建表,而后点击下一步。

在 DDL 音讯解决规定中,咱们能够配置各种各样的策略解决,依据需要配置好规定后抉择下一步。

接下来进行运行资源配置。对 Dataworks 数据进行实时同步,咱们通常须要一个独享资源组,在这里咱们曾经实现了独享资源组的购买,而后抉择各个同步性能所须要的资源组,实现配置并点击立刻执行,期待作业的启动。

能够看到 PolarDB 的数据曾经实时同步到 Hologres 这张构造表当中。

接下来能够对这张表再进行肯定的更新,咱们往这张 user\_details 表外面从新插入一条 1004 数据,数据插入胜利后能够看一下 Hologres 构造表。

从后盾能够看到,1004 这条数据曾经实时同步至 Hologres,如下所示。

通过上方的演示能够看到,应用 Dataworks 实时同步 Hologres 性能,咱们能够十分便捷地将数据库中的数据同步到 Hologres。

常见问题及将来瞻望

(一)实时计算 Flink 版 Hologres Connector 常见问题

通过上述提到的对于 Hologres 利用场景以及几个 Demo,接下来看一下在应用过程中通常会遇到什么问题。

Q: 作业启动失败,无奈连贯 Hologres。
A: Hologres 实例须要与 Flink 集群在同一 Region,且应用 VPC Endpoint。

Q: 实时写入后果表数据不合乎预期。
A: 通常是由回撤引起,须要正确设置 ignoreDelete 参数。

Q: 实时写入性能慢。
A: 以后高 QPS 场景的列存表部分更新开销较大,倡议换成整行更新或者行存写入。

Q: 维表查问性能较差,且 Hologres 实例 CPU 负载高。
A: 通常是因为应用了列存表作为维表,倡议切换至行存表。

Q: 实时生产 Binlog 报错。
A: 通常是因为表没有开启 Binlog 导致,须要重建表。

(二)将来瞻望

接下来看一下整个 Hologres 在实时读写链路上的一个将来的布局和瞻望。

– Flink One-To-Many 维表 Join

这是一个行将上线的性能,咱们会在 Flink 实现一对多的维表 Join 性能,就不须要强制应用 Hologres 表的主键进行维表查问。
但须要留神的是,这种场景上面通常性能不会特地好,因为难以避免的查问会导致整表的扫描,使得提早比拟高,所以还是倡议用户尽可能应用一对一的点查场景。

– 基于 JDBC 实时生产 Hologres Binlog

以后 Hologres Binlog 实现是应用了内置接口,临时没有对外透出。之后,咱们会实现基于 JDBC 的接口实现让用户实时生产 Hologres Binlog。

– Dataworks 数据集成实时生产 Hologres Binlog

以后数据集成并不反对生产 Hologres 数据,之后咱们会反对应用 Dataworks 的数据集成,可能实时生产 Hologres Binlog,这样就能将 Hologres 的数据实时镜像地同步到其余的数据库当中。

– 无连贯限度的 SQL 读写

因为 PostgreSQL 的模型限度,以后 Hologres 整个实例的连接数有肯定的限度,之后咱们会提供一个无连贯限度的 SQL 读写的性能。

上文提到 Hologres 的一些 connector 和 Holo-Client,都曾经开源到 Github 下面,有需要的用户能够拜访下方链接进行应用。

  • https://github.com/aliyun/alibabacloud-hologres-connectors
  • https://github.com/hologres/holo-client

版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

正文完
 0