实时数仓建设实践——滴滴实时数据链路组件的选型

目录

前言

一、实时数据开发在公司内的主要业务场景

二、实时数据开发在公司内的通用方案

三、特定场景下的实时数据开发组件选型

3.1 实时指标监控场景

3.2 实时BI分析场景

3.3 实时数据在线服务场景

3.4 实时特征和标签系统

四、各组件资源使用原则

五、总结和展望

滴滴实时数据链路建设组件选型实践篇


   原文大佬介绍的这篇实时数据链路组件选型有借鉴意义的,这些摘抄下来用作沉淀学习。如有侵权,请告知~

前言

    随着滴滴内部技术栈的不断统一,实时相关技术组件资源的不断整合,各业务线实时数据相关开发经验的不断沉淀,基本形成了一套面向公司不同业务场景需求的最佳技术选型和具体落地方案。同时我们也发现,大部分实时开发同学在做实时数据建设过程中会笼统的把实时数据建设等同于flink数据开发,常常把实时数据处理过程中的其他相关组件放在边缘位置,无法高效的整合数据处理组件来完成不同业务场景的实时需求。为此,从当前公司内的典型实时数据开发方案出发,整理了不同场景下的实时数据建设技术选型,帮助更好的进行实时数据建设,为业务持续输出高质量且稳定的实时数据价值。

一、实时数据开发在公司内的主要业务场景

  目前公司内各业务线使用实时数据的主要场景分为四块:

  • 实时指标监控

   例如产研侧指标稳定性监控,业务侧实时指标异常波动监控,运营大盘业务健康监控等。这类场景的主要特点是对数据及时性要求很高,且高度依赖时间序列,主要依赖时间轴作为分析度量,数据分析复杂度一般。

  • 实时BI分析

  主要面向数据分析师和运营同学配置实时看板或实时报表,包括公司运营大盘,实时核心看板,展厅实时大屏等。这类场景的主要特点是对数据准确性要求极高,对数据集及时性容许有一定延迟,需要支持较复杂的数据分析能力。

  • 实时数据在线服务

 主要以API接口的方式提供实时指标,多用于为数据产品提供实时数据。这类场景对数据及时性和准确性要求较高,指标计算复杂度一般,对接口查询QPS要求非常高,在提供实时数据的同时需要保证整个服务的高可用。

  • 实时特征

  主要用于机器学习、模型更新、推荐预测、推荐策略,标签系统等方面。这类场景对数据及时性、准确性、查询QPS要求一般,但其本身实现逻辑对实时计算引擎的使用要求较高,要求实时计算引擎有较强的实时数据处理能力,较强的状态存储能力,较丰富的外部组件对接能力。

二、实时数据开发在公司内的通用方案

    公司内实时数据开发通用方案组件主要包括:实时数据采集,数据通道,数据同步,实时数据计算,实时数据集存储,实时数据应用供六个部分,目前这六个部分使用的组件基本稳定,各组件都可以在相应的平台上灵活使用。

  • 数据源

     当前公司主要的实时数据来源是 MySQL 产生的 binlog日志和业务服务器上产生的 puliclog日志,MySQL的binlog日志是通过阿里开源的采集工具 Canal 完成,Canal的工作原理是把自己伪装成MySQL slave,模拟MySQL slave的交互协议向MySQL Master 发送 dump协议,MySQL Master收到 Canal发送的dump 请求,开始推送 binary log 给 Canal,Canal 解析 binary log 最终把结果发送给 DDMQ 中;

      Public log 是公司内规范定义的业务日志,通过在业务服务器上部署 LogAgent,由 Agent Manager 进行处理并生成采集配置,在 Agent 访问 Agent Manager 拉取采集配置之后,采集任务开始执行,最终把日志发送到 kafka 中。

  • 数据通道

   公司主流的消息通道是DDMQ 和 kafka,所有的binlog日志源头都来自 DDMQ,DDMQ 是滴滴2018年底开源的产品,他使用RocketMQ 和 kafka作为消息的底层存储引擎,主要特点是支持延迟和事务消息,同时也支持复杂的消息转发过滤功能;

   public log使用 kafka 作为消息通道,实时任务中间链路的开发也主要使用kafka作为存储媒介,其主要特点是高可扩展性和生态完善,与Flink配合开发效率极高,组件运维很方便。

  • 同步中心

   主要功能是把从源头采集的数据,根据业务需要进行离线和实时数据分离。平台对离线场景所需的数据以Datax为基础开发的数据链路同步功能,完成数据端到端的数据同步并将结果落盘到hdfs中。对实时场景所需的数据,使用内嵌实时计算引擎的 Dsink 任务完成数据采集配置并把结果推送到kafka消息队列中,同时也会把数据落盘到 hdfs 中构建离线增量或全量ods表。

  • 实时开发平台

    目前公司内实时任务开发已经全部整合到数梦(一站式数据开发平台)的实时开发平台上,支持 flink jar和 flink sql 两种模式,截止2022年6月平台上运行的实时任务中 jar 任务占8%,sql 任务占92%。在日常的实时任务开发中推荐使用 Flink 1.12的 SQL 语法完成实时任务的开发一方面保证指标口径的一致性另一方面也能提高实时任务的可维护性。用户在任务开发过程中,建议引入并使用本地调试功能,尽可能规避实时任务开发过程中的错误,提高实时任务上线成功率。通常在实时开发平台上主要完成的工作是ETL操作或轻度汇总指标的计算,然后把处理结果写入下游 sink 中

  • 数据集

     计算结果的下游 sink 一般包括 Kakfa、druid、Clickhouse、MySQL、Hbase、ES、fusion 等。对于实时任务的中间结果或者实时数仓的 dwd 层数据我们会写入 kafka 中;对于用于指标监控报警的数据,会写入Druid中,利用Druid时序数据库的特性提高实时指标的监控性能;对于业务bi分析的场景可以把数据写入 Clickhouse 中来配置多样化BI看板;使用flink完成指标计算的结果数据也可以直接写入 mysql,Hbase,ES 或者 fusion 中,这里的具体选型我们将在下一章具体业务场景下做具体说明。目前各下游 sink已经整合进平台,对于使用 druid 的情况一般需要在 Woater(统一指标监控平台)上配置 Datasource,对于使用 Clickhouse 的情况一般需要在数易(BI分析平台)上配置数据集。

  • 实时数据应用

   对于实时结果数据,常用的使用方式包括在 Woater (统一指标监控平台)平台上创建实时指标,同时配置对应的实时看板或者实时监控报警,满足业务分钟级的结果指标监控和实时曲线分析。也可以在数易(BI分析平台)上使用数梦流表( Druid 的 Meta 化表)或者ClickHouse 数据集来配置实时报表,满足业务侧不同的BI分析需求。

三、特定场景下的实时数据开发组件选型

   以上链路是当前实时任务开发的主要开发链路,在实时开发过程中,结合业务具体需要和各平台的能力劣势,我们需要具体问题具体分析,根据不同业务场景,选择最合适的开发选型

3.1 实时指标监控场景

场景特点:对时间序列依赖明显,对指标及时性要求较高,对指标精确度一般,对查询QPS要求较高,对实时数据产出稳定性要求较高。

具体链路:

     该类场景建议在Woater (统一指标监控平台)上配置DataSource,基于监控要求设置对应的指标列和维度列,为提升查询效率需要配置聚合粒度,常用聚合粒度为30s或1min,同时对于需要计算UV类指标的场景,需要把对应的指标列字段设置为hyperUnique 类型来提高计算性能,通过设置druid 的消费分区来提高druid消费topic数据的能力,一般建议topic分区数是druid 分区数的偶数倍。通过DataSource配置的实时指标,用于配置实时监控看板和实时监控报警。

核心重保链路:对应核心的监控场景,为了保障实时链路的稳定性和及时性,需要双链路开发。

    从原始数据源开始做实时数据处理过程的双链路,包括FLink 任务双活,结果topic 双活,Druid 表双活三个部分,同时需要支持实时指标级别的双活切换,实现稳定的指标查询,也避免下游监控报警出现误报的情况。

3.2 实时BI分析场景

场景特点:不完全依赖时间序列,对实时指标准确性要求高,能容许一定的时间延迟,对查询QPS要求一般,需要支持灵活的维度+指标组合查询。

具体链路:

   这类场景的主要方案是在 flink 任务中把需要的维度信息都尽可能打平,然后把打平的实时数据微批写入到 Clickhouse 的本地表中。我们以 ClickHouse 的 local 表作为底表,下游根据各类业务需要配置不同的物化视图表,对于需要基于主键做实时去重的场景可以使用CK的 ReplacingMergeTree 引擎实现,之后使用实时去重物化视图表作为数易(BI分析平台)的数据集或者数链(数据服务化平台)接口查询底表供下游配置BI看板;对于确定维度和指标的看板场景为了提高查询性能也可以在 ClickHouse 的 local 表基础上,基于业务需要的维度字段使用 AggregatingMergeTree 引擎创建聚合视图表。这样可以满足下游数易配置看板或者提供数链接口的需求;最后一种是不需要实时去重和预聚合的普通场景,可以把flink大屏的数据或者初步预聚合的数据写入CK的普通分布式表中,直接配置数易数据集让用户自行配置业务所需的指标看板。

三类表选择的主要原则:

  • 对业务指标准确性要求极高且有明确去重主键的业务场景,建议使用CK的实时去重视图表。
  • 对业务指标准确性较高,有明确的维度和指标定义,且查询逻辑较复杂或者查询 QPS 较高的场景,建议做预聚合操作,使用CK的聚合视图表。
  • 对业务量不大,业务变更逻辑频繁的场景,建议前期直接使用CK的分布式普通表提供下游看板配置,满足业务的快速迭代和取数需求。

3.3 实时数据在线服务场景

场景特点:实时指标准确性要求高,对查询QPS要求较高,对数据及时性要求一般

具体链路:

   这类场景主要特点是需要把所需的实时指标做各类前置处理。

   一种方式是把所需要的实时指标在flink任务中完成计算,把最终的结果实时写入到Mysql 或者 Hbase 等支持实时更新的存储中,供下游数据服务平台进行接口封装。这类方案适用于业务逻辑变更不频繁,且需要提供数据服务的场景;

    另一种方式是把聚合逻辑下移,flink任务主要做数据内容打宽和简单的预聚合,主要的指标统计工作交由下游的OLAP引擎计算,数据服务平台通过封装 OLAP 引擎来提供接口查询服务。这样做的好处是在业务指标逻辑频繁变更的情况下也能使用OLAP 的预聚合能力提供高效的实时指标服务,缺点是对 OLAP的查询压力较大,需要提供更多的资源供OLAP 消耗才能保证服务的高QPS。

3.4 实时特征和标签系统

场景特点:对实时指标准确性要求一般,对查询QPS要求较高且涉及到较大的实时状态运算,需要支持实时和离线指标融合的情况。

具体链路:

    该类场景一般会有明确的指标列和维度列,需要把大量的实时特征或者指标标签接入平台,方案一是直接通过 topic 让平台消费数据,平台封装后提供特征或者标签服务,方案二是利用 Hbase 和 Fusion 基于强大的主键更新能力,把实时和离线标签都灌入其中后接入平台的方式提供特征服务或者标签服务,供下游算法同学使用。   

四、各组件资源使用原则

   实时数据开发涉及到的组件较多,各组件在使用过程中建议遵循基本原则,做到资源充分利用,在满足实时任务开发的前提下,节约大量不必要的成本开销

数据采集:单一采集原则,对于业务需要的实时指标开发,上游数据源尽可能做到复用,保证实时和离线 ods 层统一

ddmq:一个 flink 任务对应一个 ddmq消费组,支持多个 topic使用一个消费组,不建议同一个消费组在不同实时任务中使用。

kafka单分区流量建议不超过3MB/s,重要的实时任务kafka存储时间需要控制在48~72小时左右,至少保证能回溯2天的历史数据

Flink:kafka 和 ddmq 的 source 并发数需要严格与 kafka 和 ddmq设置的分区数一致,这样的消费性能最佳。公司内 flink 任务的单TM资源是固定的 slot = 2、taskmanagermemory = 4096、containers.vcores = 2 。根据业务场景不同可以做适当调整,对于纯ETL场景可以适当调大单TM的slot数量,对于含有较大内存占用的任务可以适当调大 taskmanagermemory 数值。在正常实时任务开发过程中消费 kafka 任务的全局并发建议和 source 并发一致,消费 ddmq 的全局并发需要根据 ddmq 的流量确定,流量在(1000±500)区间的场景全局并发设置为3,超过的场景更加该比例折算,具体需要根据业务计算逻辑中算子耗时最大值预估。

druid:创建druid表时一定要设置聚合粒度,建议粒度为30s或者1min,数据存储周期默认为3个月,在确定的业务场景中创建的 druid表需要明确维度和指标字段,维度字段尽可能使用 String 类型,Druid 对 String 类型做了 bitmap 和倒排索引优化;指标字段在满足业务使用的前提下,尽可能使用预估类型来提高实时指标的计算性能。

Clickhouse:Flink 实时写入任务默认间隔不小于30s,写入并行度尽量控制在10以内,CK表数据存储周期控制在1个月左右,必须按照时间作为分区字段,其他类型的字段无法作为分区。实时数据写入场景推荐使用 Flink2Ck native connector 模式写入,提高实时写入的稳定性,同时减少CK的CPU消耗;Flink2CK写入吞吐量建议控制在20M/s(单并发)以内,间接保障CK集群的稳定性。

五、总结和展望

  上文从具体的业务场景出发总结了主流的实时任务开发方案以及技术栈,为用户从离线开发转向实时数据开发提供一定的入门基础,同时为产品和运营同学提供了较好的实时链路开发科普,一定程度上降低了实时数据建设的开发门槛。之后通过滴滴典型的四个业务场景实时指标监控、实时BI分析、实时数据在线服务、实时特征来具体说明各业务场景下实时组件的选型差异和遵循原则。可以帮助业务开发同学根据具体数据需求指定合理的实时开发方案并快速落地。最后本文对实时任务开发过程中的主要组件提供了配置建议,保证在完成用户实时任务开发的前提下尽可能降低开发成本,提高资源总体使用效率,降本提效。

参考文章:
 

滴滴实时数据链路建设组件选型实践篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅读 Natural Language Generation Model for Mammography Reports Simulation

浅读 Natural Language Generation Model for Mammography Reports Simulation 这是一篇报告生成 去伪 的文章,重点看生成报告的 真实性 Abstract Extending the size of labeled corpora of medical reports is a major step towards a successful training of …

手搓 Docker Image Creator(DIC)工具(02):预备知识

此节主要简单介绍一下 Docker、Dockerfile 的基本概念,Dockerfile 对的基本语法,Windows 和 macOS 下 Docker 桌面的安装,Docker 镜像的创建和运行测试等。 1 关于 Docker Docker 是一个开源的应用容器引擎,它允许开发者打包应用…

【Effective Web】文件上传

文章目录 前言一、选择本地文件1.设计一个上传文件按钮2.FileReader读取文件内容 二、使用拖拽方式1.设计一个拖拽容器2.拖拽文件的相关事件回调 三、使用粘贴方式1.设计一个粘贴容器2.paste事件回调 四、总结 前言 前端无法像app一样直接操作本地文件,对本地文件的…

MTMT:构建比特币生态平行世界 打造铭文生态繁荣

近年来,随着铭文市场的火爆以及比特币ETF成功通过,比特币生态正经历着一场复兴,尤其是铭文市场作为新一代Web3的叙事,带来了全新的生产方式,可以预见,铭文就像流动性挖矿对于上一轮DeFi Summer的推动一样会…

vue watch 深度监听

vue2文档&#xff1a;API — Vue.js vue3文档&#xff1a;侦听器 | Vue.js watch 可以用来监听页面中的数据&#xff0c;但如果监听的源是对象或数组&#xff0c;则使用深度监听&#xff0c;强制深度遍历源&#xff0c;以便在深度变更时触发回调。 一&#xff0c;监听 <t…

蓝桥杯算法题-正则问题

问题描述 考虑一种简单的正则表达式&#xff1a; 只由 x ( ) | 组成的正则表达式。 小明想求出这个正则表达式能接受的最长字符串的长度。 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是&#xff1a; xxxxxx&#xff0c;长度是 6。 输入格式 一个由 x()| 组成的正则表达式。…

ViveNAS性能调试笔记(一)

ViveNAS是一个开源的NAS文件服务软件&#xff0c;有一套独立自创的架构&#xff0c;ViveNAS希望能做到下面的目标&#xff1a; - 能支持混合使用高性能的介质(NVMe SSD)和低性能介质&#xff08;HDD&#xff0c;甚至磁带&#xff09;。做到性能、成本动态均衡。因此ViveNAS使用…

python 进程、线程、协程基本使用

1、进程、线程以及协程【1】进程概念【2】线程的概念线程的生命周期进程与线程的区别 【3】协程(Coroutines) 2、多线程实现【1】threading模块【2】互斥锁【3】线程池【4】线程应用 3、多进程实现4、协程实现【1】yield与协程【2】asyncio模块【3】3.8版本【4】aiohttp 1. 并发…

网络基础(二)——序列化与反序列化

目录 1、应用层 2、再谈“协议” 3、网络版计算器 Socket.hpp TcpServer.hpp ServerCal.hpp ServerCal.cc Protocol.hpp ClientCal.cc Log.hpp Makefile 1、应用层 我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在…

AtCode DP专练A-P

链接&#xff1a;Educational DP Contest - AtCoder A - Frog 1 题意&#xff1a;有n个石头&#xff0c;从1石头出发&#xff0c;每次可以跳一格或者俩格&#xff0c;代价为俩个格子间的高度差 思路&#xff1a;对于第i个石头&#xff0c;可以从石头i-1和i-2得到&#xff0c…

31.Python从入门到精通—Python数据压缩 性能度量 测试模块

31.从入门到精通&#xff1a;Python数据压缩 性能度量 测试模块 个人简介数据压缩性能度量测试模块 个人简介 &#x1f3d8;️&#x1f3d8;️个人主页&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Python领域新星创作者&#xff0c;CSDN实力新星认证&#xff0c…

分类预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记忆网络多输入分类预测

分类预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记忆网络多输入分类预测 目录 分类预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记忆网络多输入分类预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记…

深度好文:解决Ubuntu 18.04安装nvidia显卡驱动,导致内核不匹配:无需重装系统修复内核

深度好文&#xff1a;解决Ubuntu 18.04安装nvidia显卡驱动&#xff0c;导致内核不匹配&#xff1a;无需重装系统修复内核 目录 一、问题描述二、尝试修复三、安装Nvidia驱动和CUDA并配置cuDNN四、总结 一、问题描述 昨天打算更新一下Ubuntu 18.04的显卡驱动&#xff0c;以支持…

Eclipse新建java类的操作流程

一、在左侧空白区域&#xff0c;点击鼠标右键。 二、点击new&#xff0c;选择Java Project &#xff08;由于这里不知道怎么截图&#xff0c;就用手机拍了一张&#xff0c;希望不要介意&#xff09; 三、 给project文件起个名字&#xff0c;其他都不用管&#xff0c;点击Finis…

云防护是怎么能帮助用户做好网络安全

在数字化时代&#xff0c;网络安全威胁呈现出愈发复杂和多样化的趋势。 无论是个人用户、小型企业还是大型企业&#xff0c;都面临着来自全球各地的网络攻击风险。这些攻击可能导致数据泄露、服务中断、财务损失甚至声誉受损。因此&#xff0c;采取有效的安全防护措施变得至关…

HarmonyOS 应用开发之Stage模型启动FA模型PageAbility

本小节介绍Stage模型的两种应用组件如何启动FA模型的PageAbility组件。 UIAbility启动PageAbility UIAbility启动PageAbility和UIAbility启动UIAbility的方式完全相同。 说明&#xff1a; 需注意FA模型中abilityName由bundleName AbilityName组成&#xff0c;具体见示例。 i…

不允许你不知道的 MySQL 优化实战(一)

文章目录 1、查询SQL尽量不要使用select *&#xff0c;而是select具体字段。2、如果知道查询结果只有一条或者只要最大/最小一条记录&#xff0c;建议用limit 13、应尽量避免在where子句中使用or来连接条件4、优化limit分页5、优化你的like语句6、使用where条件限定要查询的数据…

uniapp开发App(二)开通 微信授权登录功能(应用签名、证书、包名 全明白)

前言&#xff1a;开发App肯定要包含登陆&#xff0c;常用登陆方式很多&#xff0c;我选择微信登陆。 一、如何获得微信的授权登陆 答&#xff1a;申请&#xff0c;根据uniapp官网的提示有如下三个步骤 开通 1. 登录微信开放平台区&#xff0c;添加移动应用并提交审核&#xf…

C语言中的文件和文件操作

目录 为什么会有文件&#xff1f; 文件名 ⼆进制⽂件和⽂本⽂件&#xff1f; ⽂件的打开和关闭 流 标准流 ⽂件指针 ⽂件的打开和关闭 顺序读写函数介绍 对⽐⼀组函数&#xff1a; 文件的随机读写 fseek ftell rewind ⽂件读取结束的判定 被错误使⽤的 feof ⽂件…

PCL点云处理之重复随机采样一致性(RRANSAC法)平面拟合(二百三十七)

PCL点云处理之重复随机采样一致性(RRANSAC法)平面拟合(二百三十七) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 pcl::SAC_RRANSAC"是 PCL库中的一个方法,是 RANSAC 方法的改进版本,通过多次重复采样和模型拟合来提高鲁棒性。RRANSAC 的思想是在 RANSAC 的基…