粗粮厂的基于flink的汽车实时数仓解决方案

基于flink的实时数仓解决方案

  • 1 背景
  • 2 业务模型
    • 1 业务框架
    • 2 难点痛点
  • 3技术选型
    • 1 计算引擎
    • 2 中间存储
    • 3 查询引擎
    • 4 flink计算架构设计
      • 1 纯实时架构
      • 2 纯实时+定期补充离线数据
      • 3 纯实时+定期刷新过期binlog
      • 4 lamdba + 分字段更新 + 历史过期数据刷新
    • 5 痛点解决
      • delta join
      • merge-engine
      • hologres分字段更新

这里主要是做一个记录毕竟工作了这么多年,想要总结一下,所以就慢慢写,慢慢更新了,想到哪里写哪里吧。

1 背景

其实背景很简单,就是要做实时数仓,总的原因是提高数据的可用性与时效性,所以单纯的批处理已经无法满足业务需求了,甚至有些业务从动作发生,到业务处理,到数仓处理,到展示可能 要求整体流程在5s以内,所以就有了这么一个项目的诞生。

2 业务模型

在这里插入图片描述

1 业务框架

汽车领域的业务其实都大差不差,包含生产,销售,交付等等,所以在博主这里,主要分为以下数据域:线索,销售,交付,售后 四大部分。
其中有一些数据域的融合,例如 线索到销售的漏斗转化,线索到客服之类的融合。

2 难点痛点

其实具体的业务模型,对于开发汽车领域的同学来说,没什么具体作用,而痛点难点,却是相同的,例如:

  • flink超长周期的,秒级运算如何维护,一个客户21年留下来联系方式,今天忽然买了一辆汽车,这个转化率 如何能够秒级更新?有两张表,用户信息表(uid, tag_id, level),和用户标签表(tag_id,tag_name),下游想要一个,能够获取全部数据的,全量数据做主流推送,去更新宽表,两边数据的时间跨度会有好几年,这时候数据要怎么使用维护?
  • 一张300个字段的宽表,怎么保证实时更新每个字段?

3技术选型

1 计算引擎

这里可选的不多,在满足秒级更新与吞吐量的情况下,这里首选flink

2 中间存储

中间存储指的是,实时数仓中间存储层,flink内部状态,各种关联的维度表等等。
维度表:这里指实时维表,一个任务不停写入数据,另一个任务把他当做维度表来使用。

考察了 MySQL,iceberg,paimon,hologres 几个存储:

  • 其中MySQL吞吐量和单表不太够
  • iceberg 延迟太高,写入后可读要有一定延迟,达不到业务要求,而且hdfs查询也慢
  • paimon与iceberg差不多,但能好很多
  • hologres,性能最好,但价格最高
  • kafka 可读性与永久存储达不到要求

所以综合比较,最后选择了hologres来做中间存储,消费cdc消费binlog可以达到类似使用kafka的模式

3 查询引擎

这里主要指服务端查询数据的存储,这里用过很多存储,mysql ,doris,iceberg,hologres,最终目前采用的是iceberg+hologres的方案。

  • mysql还是那个样子,对于实时汇总的明细,例如百万 ,千万级明细,多维度汇总展示,性能上有欠缺。
  • doris 会有热点问题,而且需要专门的集群维护,另外服务端使用,经常会关联维度表展示,这部分性能也不是特别好
  • iceberg 便宜,量大,慢,除了慢,似乎没有不好的地方了
  • 所以最终采用的是 hologres+iceberg的模式,直接页面展示的各种汇总值,明细值,使用的都是hologres存储,在优化好索引后,千万级别的数据做聚合也可以做到500ms以内,iceberg提供明细下载能力,详细数据使用iceberg+spark提供给用户

4 flink计算架构设计

1 纯实时架构

这里可以理解为 flink+kafka 这种方式,我们运行过一段时间,但仅限于比较简单的业务架构,像是复杂一点的,尤其是历史累计值那种,就会很被动了,例如上面说的,要统计用户转化率,这个转化率周期可能会跨度好几年,所以就不太合适这种指标的开发,但是用作etl的动作,提供明细数据是非常合适的

2 纯实时+定期补充离线数据

这个其实是第一种方案的升级版本,也是flink+kafka,但是会定期的用spark把离线的数据推送一份到kafka里,也就是kafka的topic里时刻,都会有全部的数据,可能会有重复,但不会少数据,所以这样用flink计算,无论是累计值,还是明细,都可以在flink state里取到。唯一的区别是什么呢,资源消耗会比较大,因为kafka和flink使用的资源会

3 纯实时+定期刷新过期binlog

这种则是第二种方式的升级版,使用的是flink+binlog的方式,如果数据量少,可能用的是mysql,数据量大,可能hologres,用flinkcdc的方式,消费binlog数据,例如 如果flink state是7天的生命周期,每天update原始数据库的 7天以前产生的数据,把etl时间更新成now,这样 所有now - 7day以前的数据,都是过期的了,每次刷新的数据量就少了,更新的数据也少了

这个方案也使用过大约1年左右,目前发现 一个flink任务中,总的数据量 不超过20G以上,用这种方式都非常方便,甚至可以说又方便又快。

4 lamdba + 分字段更新 + 历史过期数据刷新

最后一种,也是正在使用的就是,用目前市面最常用的lamdba的方案 ,也就是实时+离线的方式,每次离线任务执行完,通过更新视图的方式,离线union实时 ,两张表 共同提供数据,使用业务时间做切分。

另外使用hologres的分字段更新,一个表10个字段,通过主键,多个flink任务共同更新一张hologres表,下游可以直接接binlog就可以一行数据,只要主键相同,就能接到好几个表的数据,而且不会过期,永久存储。这种方式,适用于上文说的 300个字段,多个数据域通过同一个主键来将数据打平一张大宽表。

5 痛点解决

delta join

这里主要是flink2.2中预计上线的一个能力,是双流 无状态join,需要双流都是binlog,也就是有原始的永久存储,也就是state中没有状态保留,每次都loop up join表,两个超级大表互相关联,flink只需要提供很小的内存就可以执行,并且不会有状态过期的问题,对于时间跨度超级大的场景最好用

merge-engine

这里主要是把paimon中的一些能力 应用到了flink 对于 hologres上,这里是对sink的 connector的改造
例如数据插入的时候,会默认保留首条,抛弃后续数据,或者保留最大最小等。

hologres分字段更新

这里是hologres的能力 ,通过相同数据,将不同数据写入到目标表的同一行里,省去了join的动作,一方面是解耦,另一方面解决的状态过期的问题

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

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

相关文章

Datawhale AI夏令营---coze空间共学

1.进入coze空间 2.点击免费使用 3.点击制作播客,微信上面选好链接 彻底搞懂深度学习-模型训练和推理(动图讲解) 4.运行过程 5.音频链接 https://lf-bot-studio-plugin-resource.coze.cn/obj/bot-studio-platform-plugin-tos/sami_podcast…

遥感机器学习入门实战教程|Sklearn案例⑥:网格搜索与超参数优化

在前几篇案例中,有同学在后台留言:“模型的参数到底怎么调?比如 SVM 的 C 和 γ,随机森林的树数和深度,要怎么选才能得到最优结果呢?”这是一个非常经典的问题:参数选不好,模型效果差…

论文精读(三)|智能合约漏洞检测技术综述

笔者链接:扑克中的黑桃A 专栏链接:论文精读 本文关键词:智能合约;合约安全;合约可靠性;合约质量保障;漏洞检测;合约程序分析 引 诸位技术同仁: 本系列将系统精读的方式,深入剖析计算机科学顶级期刊/会议论文&#…

YOLO --- YOLO11模型以及项目详解

YOLO — YOLO11模型以及项目详解 文章目录YOLO --- YOLO11模型以及项目详解一,开源地址二,重要模块2.1 C3K22.2 C2PSA2.3 检测头三,网络结构3.1 整体结构划分3.2 Backbone 结构分析(从下往上看)3.3 结构分析&#xff0…

Debezium监听MySQL binlog并实现有状态重启

Debezium实现MySQL数据监听了解Debezium​ 本期主要内容实现步骤1. 新建Maven工程2.导入依赖3.核心代码编写4.offset的存储5.OffsetBackingStore实现jdbc模式6.运行结果总结了解Debezium 官网:https://debezium.io/ Debezium是一组分布式服务,用于捕获数…

InfluxDB 存储优化:TSM 文件管理与空间回收(一)

一、InfluxDB 与 TSM 文件初相识**在数字化时代,数据量呈爆发式增长,尤其是时间序列数据,如服务器监控指标、传感器读数、金融交易记录等,它们都带有时间戳,记录着事物随时间的变化。InfluxDB 作为一款高性能的开源时序…

macos使用FFmpeg与SDL解码并播放H.265视频

效果: 安装依赖: brew install ffmpeg brew install sdl2 brew install x265 确认x265已启用 查看x265版本 工程CMakeLists.txt

C#开源库ACadSharp读取dwg图元的示例

文章目录介绍数据示例读取图元属性介绍 开源库ACadSharp的地址:https://github.com/DomCR/ACadSharp 可以在NuGet中搜索到该库并安装。 数据示例 数据是一个绘制了以下简单图元的dwg数据: 读取图元属性 创建了.net6控制台项目,通过NuG…

【UniApp打包鸿蒙APP全流程】如何配置并添加UniApp API所需的鸿蒙系统权限

一、前言:为什么选择 UniApp 打包鸿蒙应用? 随着鸿蒙生态的快速发展,越来越多开发者希望将现有跨平台项目快速接入鸿蒙系统。而 UniApp 作为国内领先的跨平台开发框架,凭借其“一次开发,多端发布”的特性,…

STM32-FreeRTOS快速入门指南(下)

第十一章 FreeRTOS事件标志组 1. 事件标志组简介 事件标志组与信号量一样属于任务间同步的机制,但是信号量一般用于任务间的单事件同步,对于任务间的多事件同步,仅使用信号量就显得力不从心了。 FreeRTOS 提供的事件标志组可以很好的处理多事…

KTH7812磁编码器芯片完全支持ABZ和UVW输出模式

KTH7812磁编码器芯片完全支持ABZ和UVW输出模式,具体功能细节如下:🔧 1. ABZ输出特性 分辨率可编程:支持 4~4096步/圈(对应1~1024个脉冲周期/圈),用户可通过配置寄存器自定义分辨率。 输出频率…

Android为ijkplayer设置音频发音类型usage

官方文档 多区音频路由 | Android Open Source Projecthttps://source.android.google.cn/docs/automotive/audio/audio-multizone-routing?hlzh-cn 背景 车机系统开发多分区(zone)功能,可以实现同一个app通过设置,在不同分…

C++ 循环:从入门到精通的深度解析

《C++ 循环:从入门到精通的深度解析》 目录 循环的本质与编程价值 三大基础循环结构详解 循环控制语句:break与continue的魔法 嵌套循环:构建复杂逻辑的基石 现代C++循环特性(C++11+) 循环性能优化与常见陷阱 实战案例:算法与工程中的循环应用 面试题深度解析与编程技巧…

| `cat /etc/os-release` | 发行版详细信息(如 Ubuntu、CentOS) |

在 Linux 或类 Unix 系统中,最简洁的命令查看操作系统类型是: uname -s✅ 输出示例: LinuxDarwin(macOS)FreeBSD 等🔍 说明: uname:显示系统信息-s:仅显示操作系统内核名…

Maya 3D建模:点、线、面、创建多边面

目录 一 点、线、面 二 创建多边面 一 点、线、面 鼠标放在模型上 按住鼠标右键:就可以选择点 线 面 shift 加选点线面 ctrl 减选点线面 顶点面:是一个检查模式,观察有无错误 选择面,单击一个面,按住shift键 同时…

CXR-LT 2024:一场关于基于胸部X线的长尾、多标签和零样本疾病分类的MICCAI挑战赛|文献速递-深度学习人工智能医疗图像

Title题目CXR-LT 2024: A MICCAI challenge on long-tailed, multi-label, and zero-shotdisease classification from chest X-rayCXR-LT 2024:一场关于基于胸部X线的长尾、多标签和零样本疾病分类的MICCAI挑战赛01文献速递介绍CXR-LT系列是一项由社区推动的计划&a…

拆解本地组策略编辑器 (gpedit.msc) 的界面和功能

我们来详细拆解本地组策略编辑器 (gpedit.msc) 的界面和功能。打开后,你会看到一个标准的微软管理控制台 (MMC) 窗口,主要分为三个部分。 这是一个典型的本地组策略编辑器界面,我们将其分为三个主要部分进行讲解: +-----------------------------------------------+----…

[NCTF2019]True XML cookbook

TRY 尝试XML外部实体注入 <?xml version"1.0" encoding"utf-8" ?> <!DOCTYPE user[<!ENTITY flag SYSTEM "file://./doLogin.php"> ]> <user><username> &flag; </username><password>1</pa…

嵌入式硬件篇---模块使用

在电子开发、自动化控制等领域&#xff0c;“模块” 是实现特定功能的标准化组件&#xff08;可以理解为 “功能积木”&#xff09;。不同模块分工明确&#xff0c;比如有的负责感知环境&#xff08;传感器&#xff09;&#xff0c;有的负责通信&#xff08;蓝牙 / WiFi&#x…

密码管理中Null 密码

Null 密码定义&#xff1a;Null 密码是指允许用户或系统账户使用空密码&#xff08;即不输入任何字符&#xff09;进行登录或身份验证的配置。危害&#xff1a;完全绕过身份验证&#xff1a;这是最严重的危害。攻击者无需破解或窃取任何密码&#xff0c;只需输入用户名并留空密…