关于数据库:应用实践-物易云通基于-Apache-Doris-的实时数据仓库建设

4次阅读

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

导读: 物易云通目前已成为国内产融供应链经营服务平台的领军企业之一,平台年交易额超过 200 亿元 随着公司业务的疾速倒退,对数据计算剖析的时效要求也越来越高。经数据团队的调研比照,于 2021 年引入了 Apache Doris 作为实时数据仓库。实战过程中取得一些教训,在此分享给大家。

作者 | 物易云通 / 司机宝大数据负责人 吴凡

业务背景

武汉物易云通网络科技有限公司成立于 2015 年 6 月,总部位于湖北省武汉市东湖高新区。作为国内产业互联网的摸索先行者,公司致力于将产业互联网思维与新一代信息技术深入利用于煤炭、修建、再生资源三大业务畛域,以标准化、场景化、数字化的供应链综合服务解决能力,创始互联网化的“供应链技术 + 物流服务 + 金融场景”的产融协同新生态。目前公司已成为国内产融供应链经营服务平台的领军企业之一,平台年交易额超过 200 亿元。公司入选 2020 年中国互联网企业综合实力 100 强,2021 年武汉市软件支出第一名。

随着公司业务的疾速倒退,对数据计算剖析的时效要求也越来越高。之前的产品曾经无奈应答宏大的数据量,为解决这一问题,数据团队通过调研比照,在 2021 年引入了 Apache Doris 作为实时数据仓库。基于 Apache Doris 建设实时数仓的过程中,积淀了许多教训,借此机会分享给大家。

数仓架构演进

公司守业之初,是应用 MySQL 作为 BI 仓库,每天增量卸数后导入,通过定时调度存储过程进行计算。该计划能疾速满足公司的跨库数据关联计算的需要,然而随着业务倒退,数据和工作一直增多,MySQL 已难以反对,另外该计划局限性比拟大,如果业务表存在物理删除或者没有数据更新工夫的状况下,则会导致数据不准。

为了解决上述问题,咱们搭建了一套 CDH 作为数据仓库。通过 Canal 订阅 MySQL 的 Binlog 到 Kafka,进行编写生产程序,将数据写入 Hbase,而后增量合并到 Hive 中,通过 Oozie 调度计算脚本。

然而离线 T+1 的数据只能满足一部分的业务需要,因而咱们须要一套能疾速查问实时数据的数据仓库,同时能够反对离线需要和实时需要,通过许多产品的调研比照,证实 Apache Doris 能够很好地实现咱们的业务需要。

Doris 数仓架构通过 Flink CDC 实时接入生产库数据到 Doris,反对实时 OLAP,而后通过海豚调度器定时执行 SQL 脚本,代替 Hive 的离线数据计算工作。

新架构的劣势

1、数据处理架构简略
新的架构里咱们应用了 Flink CDC 来做数据同步(Flink CDC 内置了一套 Debezium 和 Kafka 组件,但这个细节对用户屏蔽),它岂但能够读取增量,还能读取全量数据,而后将数据通过 Stream load 的形式写入 Doris。

2、一份数据,实时全量
因为 Hive 查问很慢,所以之前是把 Hive 的数据通过 Sqoop 推送到 MySQL 进行查问,即有多份数据存储在不同的 MySQL 上,保护和存储老本都很高,并且 Hive 里只有 T-1 的数据,须要每天写脚本合并。Doris 反对 MySQL 协定,可间接查问,同时 Doris 反对主键数据去重及更新,有实时的全量数据,解决了实时报表和在线 OLAP 的需要。

3、架构简略,易于部署保护
绝对于 Hadoop 那一套各种组件来说,Doris 部署保护非常简单。

4、一键全库接入,构造实时同步
通过自研的数据易平台,实现了 MySQL 一键全库接入 Doris,即通过页面抉择后,一键生成 Flink CDC 工作在 Yarn 上继续运行。而且通过解析 Binlog 外面的 DDL 语句,将其转化为 Doris 语法,利用 Doris 的 Online Schema Change 个性,实时同步生产数据库的表构造变更,保障了表构造统一,新增字段数据统一。

5、秒级查问
Doris 查问是秒级,Hive 是分钟级,跑批的效率晋升了 20-30 倍。而之前用的是 Impala 减速 Hive 的查问,每个表在应用前都要 Refresh 一次,十分麻烦,并且 Count Distinct Impala 近似计算不精确。

零碎重点性能

数据接入

第一步 抉择须要接入的 MySQL 库类型,默认是 A,即最常见的全局库名惟一。

另外还存在几种其余的状况:

B、全局有多个名称雷同、构造不统一的数据库。比方:局部大表做了数据切割归档到另一台机器上了。

C、全局有多个名称雷同、构造统一的数据库,即分库。咱们须要将数据合并到一个 Doris 库表中,不便数据分析。

D、全局有多个名称不同、构造统一的库。比方:DB租户 A 的库,DB租户 B 的库,咱们也是要把数据合并剖析。

第二步,抉择 MySQL 库实例,进行提交(如果不想接入全库,能够勾选局部表)。对应的指标数据库是 Doris 外面的 ODS 贴源层,和生产数据保持一致,一个库一个工作,能够视状况调整内存等参数。

留神: 通过列表能够进行工作治理,复原工作是使用了 Flink CDC 的 Checkpoint 机制,在工作异样挂掉时能够复原运行。Flink CDC 工作目前是运行在 Yarn 上。

数据计算

咱们在数据易平台上开发了数据计算工作性能,用户编写 SQL 后,点击 SQL 解析,即可自动识别出脚本里用到了哪些起源表,生成了哪些后果表,最终在海豚调度器里生成对应的工作和上游工作 Depend 关系。

阐明: 为了保障各个 T+1 报表的数据一致性,咱们做了 ODS 层到 DWD 层的一套计算工作,即每天 0 点将 ODS 层中近 2 天的增量数据 insert into 到 DWD 层进行更新,后续 T+1 的计算工作对立从 DWD 层进行计算。

留神: 须要把物理删除变成逻辑删除,应用时剔除。如果间接在 ODS 外面同步物理删除,会导致 DWD 层里无奈通过增量形式同步删除。

新架构的收益

升高资源老本

以后咱们的集群配置为 5 台阿里云 ESC,16 核 64G。在雷同集群配置下,1000 个表的每日增量数据合并工作,用 Hive 须要 3-5 小时,用 Spark 须要 2-3 小时,然而同样的需要 Drois 使用 Unique Key 模型实现只须要 10 分钟,大大提前了后续计算工作的开始工夫。

另外,因 Hive 跑得慢,咱们后续的几百个 Hive 计算工作,排队状况很重大,不得不把一些优先级低的工作排到下午甚至早晨,日工作全副跑完须要十几个小时。而咱们把全副批工作迁徙到 Doris 上计算后,全副工作跑完只须要 2 小时不到,后续减少新的需要工作齐全无压力。

总而言之,应用 Doris 后,报表数据的更新工夫大大提前,长期的数据查问需要响应时长大大缩短,至多节约了每年几万的大数据集群扩容老本,同时取得了各部门的认可。

晋升开发效率

随着公司业务疾速的倒退,会一直的有新的数据分析需要,就须要咱们接入新库新表,给老表加字段等,这对于 Hive 数仓是十分苦楚的,表要重建、全量数据要抽,这就须要每周有半天工夫都在解决这些事件。

在应用 Doris 作为数仓后,通过咱们的数据易平台配置 Flink CDC 工作疾速接入 MySQL 库表的全量 + 增量数据,同时利用 Doris 的 Online Schema Change 个性,实时同步 Binlog 里的 DDL 表构造变更到 Doris,数据接入数仓零开发成本。

另外因为 Doris 反对 MySQL 协定间接对接数据可视化利用,咱们不须要再把后果数据从 Hive 推到 MySQL 里提供数据服务,节约了数据库资源,缩小了开发步骤。

体现数据价值

Doris 有审计日志,咱们能够通过日志,剖析出每个表每天的查问应用状况,以便咱们评估跟进数据价值、下线废除报表及工作。另外还能够预警资源耗费多、查问慢的查问语句,帮忙用户进行语法优化等。

问题与教训

1、MySQL 和 Doris 字段类型不统一
MySQL 的 Blob、Mediumint、Year、Text 等字段类型在 Doris 中没有,须要咱们转换成 Doris 对应的字段类型,Varchar 的长度咱们对应在 Doris 需扩充成 3 倍。

2、MySQL DDL 语法兼容性问题
MySQL 的 Bigint Unsigned、AUTO_INCREMENT、CURRENT_TIMESTAMP 等语法在 Doris 里不反对。

3、多个大表 Join 计算时,内存应用过大,导致 BE 挂掉,影响数据写入。
目前 Doris 新版本已对内存管制这部分进行优化。

4、Hive 和 Doris 差别
将 Hive 计算脚本改成 Doris 计算脚本时遇到一些语法问题,如:

  • Doris 不反对 Lateral View,降级新版本已解决。
  • 之前的一些 Hive UDF 函数是 Java 写的,Doris 不反对,咱们用另外的程序对数据做的二次加工解决,后续 Doris 新版本会反对。
  • Doris 短少一些函数,如 Last_Day 通过取日期下个月的第一天再减一天来实现,Collect_Set 通过先去重再 Group_Concat 实现等。

5、剖析函数问题

  • 剖析函数 XX() over(partition by) 在外层和子查问中同时存在时,报 errCode = 2, detailMessage = can’t support。咱们通过将子查问数据放入长期表解决该问题,前面 Doris 1.0 版本已解决该问题。
  • 多个 lag PARTITION by 函数和 min PARTITION by 一起应用时,有乱码的状况。撰文时该 Bug 已修复,期待合并发版。

6、Doris 动静分区
动静分区字段必须为 Date 到月、周、日,不能依据写入的数据主动创立分区,目前咱们通过建表时指定初始化的分区数解决此问题。

7、Stream Load 写入过于频繁报错
Stream Load 写入 Doris,写入太频繁会报错误码 235 问题,同样的表 Routine Load 不会呈现这个问题,咱们通过批量提交解决,Doris 新版本已优化该问题。

以上问题在向社区反馈后,失去了社区的疾速响应。截止目前,上述问题基本上都曾经失去修复,并且将在行将公布的新版中上线。

写在最初

首先感激 Apache Doris 社区的 PPMC 张家锋和多个 Committer 的大力支持,有任何问题都能很快失去响应。也感激公司领导对咱们计划的认可和反对,做技术改造不仅要花费很多金钱和精力,而且还需扭转的勇气和动摇的信念。也感激各位同行在应用 Apache Doris 上给了咱们很多教训和信念。最初祝福 Apache Doris 社区倒退越来越好!

SelectDB 是一家开源技术公司,致力于为 Apache Doris 社区提供一个由全职工程师、产品经理和反对工程师组成的团队,凋敝开源社区生态,打造实时剖析型数据库畛域的国内工业界规范。基于 Apache Doris(incubating)研发的新一代云原生实时数仓 SelectDB,运行于多家云上,为用户和客户提供开箱即用的能力。

相干链接:
SelectDB 官方网站:
https://selectdb.com (We Are Coming Soon)
Apache Doris 官方网站:
http://doris.incubator.apache…
Apache Doris Github:
https://github.com/apache/inc…
Apache Doris 开发者邮件组:
mailto:dev@doris.apache.org

正文完
 0