实时数据中心建设思路与企业实践 | 青训营笔记

114 阅读7分钟

这是我参与「第四届青训营」笔记创作活动的的第18天

01.企业数据架构

截屏2022-08-18 11.13.31.png

1.1 数据集成-业务数据收集CDC

截屏2022-08-18 11.14.27.png 截屏2022-08-18 11.14.53.png

数据流向:业务数据库->数据系统

1.1 数据集成业务数据收集-Log

截屏2022-08-18 11.16.31.png

1.1 数据集成-系统间同步传输

截屏2022-08-18 11.17.45.png

存储系统间数据传输

1.2 数据生产-离线&实时

截屏2022-08-18 11.18.52.png

数据流向:原始数据->数据处理pipeline

1.3 数据服务

截屏2022-08-18 11.19.55.png

数据流向:数据系统->业务系统

02.数据中心案例

02.房产业务介绍

截屏2022-08-18 11.21.20.png

2.1 房产数据中心-核心数据指标

  1. 供需(房子全不全?客户多不多?)

(1)房源

 (i)房增(新增房子的录入量)

(2)客源

 (i)客增(新增客户的录入量)

2) 过程(工作做的怎么样?)

(1)通数经名人和客户电话次数)

(2)带看次人带客户看房次数)

  1. 结果(结果好不好?)

(1)成交量(成交合同量)

截屏2022-08-18 11.24.05.png

2.2 房产数据中心-数据查询要求

数据中心看板查询条件:

● 时间范围:今天前的任意日期范围

● 业务类型:租赁/买卖/全部

数据展示:

● 查询条件下的每个经纪人的汇总数据

● 支持下钻明细数据

技术要求:

● 300ms内返回结果

● 数据是实时秒级

截屏2022-08-18 11.26.03.png

03.实时数据生产

3.1 数据分析数据产出目标

用户要什么数据? 根据日期、业务类型(买卖、租赁)查询经纪人汇总数据

目标数据产出粒度:经纪人+业务日期+业务类型

截屏2022-08-18 11.36.37.png

3.1 数据分析数据生产可行性

生产逻辑:

select

Dk.date, //日期

Dk.staff id, //经纪人

House.house_ type, /业务类型

Count(id) as dk _cnt //指标,带看量

from dk left join house On dk.house_ id = house.house_ id

Where audit_ status = 1(可变更)

Group by dk.date, Dk.staff id, house.house_type

截屏2022-08-18 11.39.02.png 带看表dk(经纪人带客户看房)

截屏2022-08-18 11.39.53.png 房源明细表house

3.2 计算分析-目标

1)开发效率:较快满足用户的需要

2)资源成本:计算效率高

3)数据质量:准确无误、数据实时

3.2 计算分析计算架构-Lambda

截屏2022-08-18 11.41.34.png

3.2 计算分析-Lambda架构-数据产出

截屏2022-08-18 11.42.26.png

3.2 计算分析-Lambda架构-问题

截屏2022-08-18 11.43.20.png

带看表dk(经纪人带客户看房)

截屏2022-08-18 11.44.02.png

3.2 计算分析计算架构-全量计算

截屏2022-08-18 11.45.09.png

方案:用实时引擎来计算所有的数据

3.2 计算分析-全量计算架构-问题解决

截屏2022-08-18 11.46.26.png

1.取最新“快照"

create view dk as select * from select ,row_ number()

over (partition by id order by utime desc) as rownum

from dk ) wherenums1;

问题:

如果08-12-条带看记录从审核通过变成未通过,如何解决?

2.计算

select date,staff_ id,house_ type,count(id) as dk_ cnt

from dk where udit_ statu, E1 group by date, staff_ id, house_

type

截屏2022-08-18 11.48.05.png

3.2 计算分析计算架构-全量计算问题分析

截屏2022-08-18 11.50.11.png

方案:用实时引擎来计算所有的数据

问题:

1)如何获取全量的原始数据?

(1)数据湖:实时性相对差

(2)CDC: log等数据?

(3)其他?

3.2 计算分析计算架构-架构选择

截屏2022-08-18 11.52.28.png

3.2 计算难点-全量数据获取-Hybrid Source

截屏2022-08-18 11.53.19.png

方案: Hybrid base(Hive) + Delta(Kafka)

3.2 计算难点-准确-处理去重&更新(Retract)

截屏2022-08-18 11.54.30.png 原始带看binlog变更数据(1-更新,2-重复)

截屏2022-08-18 11.55.06.png 处理后的数据

解决方法:

select * from (select *,cg over (partition by id order by time

desc) as rn from dk)where ;

3.2 计算难点-准确-join乱序问题场景

截屏2022-08-18 11.56.52.png

SQL

截屏2022-08-18 11.57.00.png

执行DAG

级联join场景

3.2 计算难点-准确-join乱序问题场景

截屏2022-08-18 11.59.16.png

T1 Left join T2

left join T3

截屏2022-08-18 11.59.21.png

截屏2022-08-18 11.59.32.png

3.2 计算难点-准确-join乱序问题解决

截屏2022-08-18 12.01.13.png

3.2 计算难点准确-join乱序问题解决

截屏2022-08-18 12.01.57.png

3.2 计算难点-计算效率-聚合

截屏2022-08-18 12.02.50.png

截屏2022-08-18 12.02.57.png

聚合函数批式处理,本质是延迟换吞吐

3.2 计算难点效率-Join

截屏2022-08-18 12.04.06.png 原始带看binlog变更数据(dk表)

截屏2022-08-18 12.04.13.png 原始房源binlog变更数据(house表)

截屏2022-08-18 12.05.33.png

3.2 计算难点效率-Join算子逻辑

截屏2022-08-18 12.06.26.png

关联触发:左右流互相关联触发

回撤来源(left join举例):

● 右表晚到

● 左右表本身的回撤

3.2 计算难点-效率-Minibatch Join

截屏2022-08-18 12.08.24.png 中间数据可抵消

Minibatch方案,抵消批次内的变更导致的中间数据

3.2 数据质量-任务稳定性

截屏2022-08-18 12.09.50.png 直接结果:消费堆积-MQ L AG

截屏2022-08-18 12.09.58.png JVM: GC耗时、次数

截屏2022-08-18 12.10.06.png 资源: cpu、内存

截屏2022-08-18 12.10.15.png 算子:倾斜、反压

3.2 数据质量-数据持续正确性-监控比对

截屏2022-08-18 12.12.26.png 异构比对:实时VS离线

截屏2022-08-18 12.13.03.png 时间趋势:同环比

截屏2022-08-18 12.13.59.png 异常值占比

3.2计算总结 计算架构:开发效率

1)Lambda架构->全量计算:一套开发任务

数据源获取:全量能力

2)Hybrid Source(逻辑全量表,hive+kafka, 成熟存储方案)

计算:正确、效率,核心是算子选择+优化

3)正确

(1)处理更新/重复: rownumber +retract机制

(2)乱序: join reorder

4)效率

(1)时效性换效率: Minibatch (聚合、join)

5)质量:稳定性监控、数据监控

3.3 数仓建设

截屏2022-08-18 12.16.28.png 数仓建设:数据复用,减少重复开发

3.3 数仓数据组织方案

截屏2022-08-18 12.17.47.png DWD明细宽表 截屏2022-08-18 12.17.55.png DWM指标层key/val存储方案

3.3 数仓-元数据管理

截屏2022-08-18 12.19.17.png

Create table kafka_ dwm ( dimn varchar, key varchar, val bigint, ts bigint )with( cluster,topic); Select * from kafka_ dwm; || || || Select * from kafka.cluster.kafka_dwm

数据资产:管理查询

生产:免DDL

04.数据服务

04.数据服务架构

截屏2022-08-18 12.22.12.png

4.1 查询快引擎选择

指定key,查询value,类似HashMap

截屏2022-08-18 12.23.01.png

分析: join. Agg

截屏2022-08-18 12.23.54.png

截屏2022-08-18 12.24.01.png

4.1 查询快怎么做?

查询逻辑模型(简化)

select

Field1 , field2,field3.a)

From

{

select count,sum,max,avgbE)

from

table1 (left/right/inner join table2)(原始信息关联)

where field1 > XXX and field2 > XXX (原始信息关联)

group by group_ fields

}

查询优化分析:

● 关注目标:不需要的信息不关注,比如只查询带看量

● 计算处理:能不能足够快,比如count/sum/avg等聚合函数

● 原始信息:单表筛选够不够快、信息关联够不够快

4.1 查询快关注目标信息

select带看量,通话量from table(100+列)

行存:大量io,每行查找需要的列

列存:直接取出对应的列文件

4.1 查询快-筛选-分区

截屏2022-08-18 12.29.23.png

4.1 查询快-筛选-primary key构建

截屏2022-08-18 12.30.21.png

原始表数据 Primary key (house_ type,staff_ id) Order by (house_ type,staff_ id)

4.1 查询快-筛选- primary key查找

截屏2022-08-18 12.31.29.png

4.1 查询快原始信息关联-IO优化

截屏2022-08-18 12.32.37.png

4.1 更快的查询-计算向量化

截屏2022-08-18 12.33.17.png CPU支持向量化指令,单指令多数据处理 截屏2022-08-18 12.33.36.png

4.1 查询快执行计划

截屏2022-08-18 12.34.37.png

截屏2022-08-18 12.34.45.png

RBO: 举例, Filter push down

4.1查询快应用优化

➢ 原始信息关联

1)Local Join:如计算带看量,带看数据和房信息按照house_ id分布 ,无shuffle io开销

2)预关联:直接生产“大宽表”

➢ 计算复杂度

1)预计算:提前聚合到特定粒度,如带看量聚合到经纪人+天+业务类型

2)提升信息密度: bit化

4.1 查询快应用-宽表构建

截屏2022-08-18 12.37.14.png

截屏2022-08-18 12.37.29.png

目标:减少查询现join,生产侧把相同粒度(如经纪人)指标及相关的维度数据关联成“宽表”

Flink聚合函数: MAP数据结构

4.1 查询快提升信息密度-bit化

截屏2022-08-18 12.38.50.png Biz(业务类型):第1位代表是否有租赁(1/0),第二位代表是否有买卖(1/0)

背景:

计算通话时长,业主既有租赁房又有二手房,选择看全部业务时,不能重复累加

要查询对应业务类型$requestBiz(1租赁,2买卖,3全部)

计算逻辑:

Select sum(duration) from table Where biz & ($requestBiz) > 0 Group by ...

4.1 查询快提升信息密度-bitmap

截屏2022-08-18 12.40.39.png roaring bitmap:高效的交并等运算数据结构

场景:计算每天客户端uv数据

方案:可以将uid通过bitmap保存: 32 bits-> 1 bit

roaringBitMap:稀疏优化

  1. 分桶:高16位

  2. 低16位:数据稀疏用数组存储,否则用bit

4.2 稳定解决的问题

截屏2022-08-18 12.42.39.png

截屏2022-08-18 12.42.45.png 异常节点导致服务雪崩

4.2 稳定-如何解决

截屏2022-08-18 12.43.58.png Source Hystrix

熔断触发策略:

  1. 比如错误率每秒超过10%

  2. 响应时间> 5s

动作:

1)直接返回失败

限流、降级

1)限流:根据查询客户端、接口等配置查询限额

2)降级:主备存储/服务集群,降级预案

4.3 查询-数据管理

管理&查询

维度:

● 天(date)

● 经纪人(staff_ id)

● 业务类型(biz_ .type)

指标

● 带看量(dk_ cnt): count(dk id)

● 通话时长(call_ duratition): sum(duration)

模型表

● 经纪人指标表: dwm_ staff biz day_ _rt

|| || ||

查询:

Select count(dk_ id) ,sum(duration) from

dwm_ staff_ biz_ _day _rt

Where date between $[startDate] and date

between $(endDate]

And biz_ type- XXx and staff_ idin (1,2,3)