简介:《实时数仓入门训练营》由阿里云研究员王峰、阿里云高级产品专家刘一鸣等实时计算 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
版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。