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

119 阅读6分钟

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

一、企业数据架构。

1.企业数据架构:

22d13ed253739485474afb4c19eb66b.jpg

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

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

39db91d0e1705be7d7e98e328a441a8.jpg 数据集成-业务数据收集-Log:

数据流向:client/server log->数据系统

efaf06690a961653a2e1df9ef29716e.jpg 数据集成-系统间同步传输:

05fb8899314ab872d058ad39803f2d4.jpg

2.数据生产-离线&实时。

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

dcd25478619130ab876ff68d1804376.jpg

3.数据服务

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

1c432c0a27a14aa94b35d6e67562b60.jpg

二、数据中心案例。

1.房产业务介绍:

7a37e9e9ed07dd906b19ba9b014a024.jpg

1.1 房产数据中心-核心数据指标;
  • 供需(房子全不全?客户多不多?)
    • 房源
      • 房增(新增房子的录入量)
    • 客源
      • 客增(新增客户的录入量)
  • 过程(工作做的怎么样?)
    • 通话次数(经纪人和客户电话次数)
    • 带看次数(经纪人带客户看房次数)
  • 结果(结果好不好?)
    • 成交量(成交合同量)
2.房产数据中心-数据查询要求:

数据中心看板查询条件

  • 时间范围:今天前的任意日期范围
  • 业务类型:租赁/买卖/全部

数据展示:

  • 查询条件下的每个经纪人的汇总数据
  • 支持下钻明细数据

技术要求:

  • 300ms内返回结果
  • 数据是实时秒级

三、实时数据生产。

1.数据分析-数据产出目标:
  • 用户要什么数据?
  • 根据日期、业务类型(买卖、租赁)查询经纪人汇总数据
  • 目标数据产出粒度:经纪人+业务日期+业务类型

332c97b0c8c7d40e60bb562153ff713.jpg

数据分析-数据生产可行性:
  • 生产逻辑:
  • 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

d8eb42a895d6b171ce5ebd39a60a416.jpg

2.计算分析-目标。
  • 开发效率:较快满足用户的需要
  • 资源成本:计算效率高
  • 数据质量:准确无误、数据实时

计算分析-计算架构-Lambda:

8e43c007fc6223e09d9b468e13a3275.jpg 计算分析-Lambada-数据产出:

516629a9310be3a45b1a465ddf99c41.jpg 计算分析-Lambada架构-问题:

5fb95dd31e6f044ba8fc1cf74cb02a1.jpg

计算分析-计算框架-全量计算:

e3b37c9c7b21c3e42705c095ee35b51.jpg

计算分析-全量计算框架-问题解决:

dff69755d605fce1ed5304674b41edd.jpg 问题:

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

  • 1.取最新“快照”

    • create view dk as select * from (select*row number0over (partition by id order by utime desc) as rownum from dk) where rownum 1:
  • 2.计算

    • select date,staff id,house_type,count(id) as dk cnt from dk where audi Status - group by date,staff id, house type

532f27efff0f4eb38fea8307cc4ed32.jpg

计算分析-计算框架-全量计算问题分析:

问题:

  • 如何获取全量的原始数据?
    • 数据湖:实时性相对差
    • CDC: 1og等数据?
    • 其他?

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

计算分析-计算框架-架构选择:

24791f6aa4e580994d32dd4840f8de6.jpg

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

69d56858288625d75e9cd534aa37dad.jpg 方案:Hybrid base(Hive)+Delta(Kafka)

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

67290743775608d3e6fa886c36cec23.jpg

148e73a22c23fb8ab96ebfe04c41ed9.jpg 解决方法:

  • select from (select, row number() over (partition by id order by time desc) as rn from dk)where rn=1;
计算难点-准确-join乱序问题场景:

ad9113ae841c1a82fa76419bedb0ac2.jpg 级联 join 场景

d1ac62cb909b3afce503468d37eb7d0.jpg

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

增加ReOrder算子

a8cd50ad89c9c9479c2da98dcb2d3b3.jpg

953ec25e798c270cd8e504d186a6259.jpg

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

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

计算难点-计算效率-Join:

0310a5deb942a37368e926061e5a94d.jpg

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

关联触发:左右流互相关联触发回撤来源(left join举例):

  • 右表晚到
  • 左右表本身的回撤
计算难点-效率-Minibatch Join:

f39535daae32b04ed9432c44eb77801.jpg

  • 中间数据可抵消
    • Minibatch方案,抵消此次内的变更导致的中间数据
数据质量-任务稳定性:
  • 直接结果:消费堆积-MQLAG
  • JVM:GC耗时、次数
  • 资源:CPU、内存
  • 算子:倾斜、反压
数据质量-数据持续正确性-监控对比:

33f0355b1f644edb66c17db7b4c9762.jpg

7067c7a7dbeb118d1f9e29d72fde3fe.jpg

cba8e3fbcbaa9f9b360116100e1fea8.jpg 异常值对比

计算总结:

计算架构:开发效率

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

数据源获取:全量能力

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

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

  • 正确
    • 处理更新/重复:rownumber+retract机制
    • 乱序: join reorder
  • 效率
    • 时效性换效率:Minibatch (聚合、join)
  • 质量:稳定性监控、数据监控
3.数仓建设:

数仓建设:数据复用,减少重复开发。

数仓-数据组织方案:

b6d84f9a89825010a65a5825e4997f0.jpg

数仓-元数据管理:

45327095ce6e66e16362dec3b551e92.jpg

  • 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

四、数据服务。

数据服务架构:

d7a85e57f89f1f316d232dcaf0523eb.jpg

1.查询快-引擎选择:

4ec15395e79f1897cb33a5429caaf6b.jpg

查询快-怎么做?

8ce0c4cada9e7aca87159c3757b8a14.jpg 查询优化分析:

  • 关注目标:不需要的信息不关注,比如只查询带看量
  • 计算处理:能不能足够快,比如count/sum/avg等聚合函数
  • 原始信息:单表筛选够不够快、信息关联够不够快
查询快-关注目标信息:
  • select 带看量,通话量from table(100+列)
  • 行存:大量io,每行查找需要的列
  • 列存:直接取出对应的列文件
查询快-筛选-分区:

4782f9386ba6b4e3ca66a9bcbc7336a.jpg

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

1d6d39a6c5a207b50d0c6e9fde027c2.jpg

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

5d88b60c913479eb9ebe39e38d473d0.jpg

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

fd5520a1e7932fd3a9fca475d4bb13d.jpg

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

CPU支持向量化指令,单指令多数据处理。

e89db3887d006224fd39dc410e9416b.jpg

dd7205be3e8479bec1c2158c9165e62.jpg

查询块-执行计划:

cef56f376034793035be181055a762c.jpg

查询块-应用优化:
  • 原始信息关联
    • Local Join:如计算带看量,带看数据和房信息按照house id分布,无shuffle io开销
    • 预关联:直接生产“大宽表”
  • 计算复杂度
    • 预计算:提前聚合到特定粒度,如带看量聚合到经纪人+天+业务类型
    • 提升信息密度:bit化
查询块-应用-宽表构建:
  • 目标:减少查询现join,生产侧把相同粒度(如经纪人)指标及相关的维度数据关联成 “宽表”
  • Flink聚合函数:MAP数据结构

c55c0177ece969ad81d38990133248e.jpg

查询块-提升信息密度-bit化:
  • 背景:计算通话时长,业主既有租赁房又有二手房选择看全部业务时,不能重复累加
  • 要查询对应业务类型SrequestBiz(1租赁,2买卖,3全部)
  • 计算逻辑:
    • Select sum(duration) from table
    • Where biz & ($requestBiz)> 0
    • Group by

9000fdec2331edf5ff0cc8b50a0a77a.jpg Biz(业务类型):第1位代表是否有租赁(1/0),第二位代表是否有买卖(1/0)

查询块-提升信息密度-bitmap:

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

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

  • roaringBitMap :稀疏优化
    • 分桶:高16位
    • 低16位:数据稀疏用数组存储,否则用bit

c006b7d02a95734b15a8ae8f59bbeb6.jpg roaring bitmap :高效的交并等运算数据结构

2.稳定-解决的问题:

70c6d6998f2ecf41af9e65d9788bffe.jpg异常节点导致服务雪崩。

稳定-如何解决:

be85b19924e5cf5a5f2ed82876830c6.jpg 熔断触发策略:

  • 比如错误率每秒超过10%
  • 响应时间>5s

动作:

  • 直接返回失败

限流、降级

  • 限流:根据查询客户端、接口等配置查询限额
  • 降级:主备存储/服务集群,降级预案
3.查询数据管理:

8c567e5ac4349e0193ca7b03cceafeb.jpg

总结

经过本次课程的学习,我了解了企业数据平台架构,它围绕着一个房产业务的数据案例展开说明数据中心建设目标和要求,学习了实时数据生产和数据服务的实践方案,还学习了实时数据生产,它最大的特点就是快,还要保证任务执行时的稳定性和正确性等。