美团外卖实时数仓建设实践( 二 )


如上图所示 , 拿到数据源后 , 会经过数据清洗 , 扩维 , 通过Storm或Flink进行业务逻辑处理 , 最后直接进行业务输出 。 把这个环节拆开来看 , 数据源端会重复引用相同的数据源 , 后面进行清洗、过滤、扩维等操作 , 都要重复做一遍 , 唯一不同的是业务的代码逻辑是不一样的 , 如果业务较少 , 这种模式还可以接受 , 但当后续业务量上去后 , 会出现谁开发谁运维的情况 , 维护工作量会越来越大 , 作业无法形成统一管理 。 而且所有人都在申请资源 , 导致资源成本急速膨胀 , 资源不能集约有效利用 , 因此要思考如何从整体来进行实时数据的建设 。
04
数据特点与应用场景
美团外卖实时数仓建设实践文章插图
那么如何来构建实时数仓呢?
首先要进行拆解 , 有哪些数据 , 有哪些场景 , 这些场景有哪些共同特点 , 对于外卖场景来说一共有两大类 , 日志类和业务类 。

  • 日志类:数据量特别大 , 半结构化 , 嵌套比较深 。 日志类的数据有个很大的特点 , 日志流一旦形成是不会变的 , 通过埋点的方式收集平台所有的日志 , 统一进行采集分发 , 就像一颗树 , 树根非常大 , 推到前端应用的时候 , 相当于从树根到树枝分叉的过程(从1到n的分解过程) , 如果所有的业务都从根上找数据 , 看起来路径最短 , 但包袱太重 , 数据检索效率低 。 日志类数据一般用于生产监控和用户行为分析 , 时效性要求比较高 , 时间窗口一般是5min或10min或截止到当前的一个状态 , 主要的应用是实时大屏和实时特征 , 例如用户每一次点击行为都能够立刻感知到等需求 。
  • 业务类:主要是业务交易数据 , 业务系统一般是自成体系的 , 以Binlog日志的形式往下分发 , 业务系统都是事务型的 , 主要采用范式建模方式 , 特点是结构化的 , 主体非常清晰 , 但数据表较多 , 需要多表关联才能表达完整业务 , 因此是一个n到1的集成加工过程 。
业务类实时处理面临的几个难点:
  • 业务的多状态性:业务过程从开始到结束是不断变化的 , 比如从下单->支付->配送 , 业务库是在原始基础上进行变更的 , binlog会产生很多变化的日志 。 而业务分析更加关注最终状态 , 由此产生数据回撤计算的问题 , 例如10点下单 , 13点取消 , 但希望在10点减掉取消单 。
  • 业务集成:业务分析数据一般无法通过单一主体表达 , 往往是很多表进行关联 , 才能得到想要的信息 , 在实时流中进行数据的合流对齐 , 往往需要较大的缓存处理且复杂 。
  • 分析是批量的 , 处理过程是流式的:对单一数据 , 无法形成分析 , 因此分析对象一定是批量的 , 而数据加工是逐条的 。
日志类和业务类的场景一般是同时存在的 , 交织在一起 , 无论是Lambda架构还是Kappa架构 , 单一的应用都会有一些问题 。 因此针对场景来选择架构与实践才更有意义 。
05
实时数仓架构设计
1. 实时架构:流批结合的探索
美团外卖实时数仓建设实践文章插图
基于以上问题 , 我们有自己的思考 。 通过流批结合的方式来应对不同的业务场景 。
如上图所示 , 数据从日志统一采集到消息队列 , 再到数据流的ETL过程 , 作为基础数据流的建设是统一的 。 之后对于日志类实时特征 , 实时大屏类应用走实时流计算 。 对于Binlog类业务分析走实时OLAP批处理 。
流式处理分析业务的痛点?对于范式业务 , Storm和Flink都需要很大的外存 , 来实现数据流之间的业务对齐 , 需要大量的计算资源 。 且由于外存的限制 , 必须进行窗口的限定策略 , 最终可能放弃一些数据 。 计算之后 , 一般是存到Redis里做查询支撑 , 且KV存储在应对分析类查询场景中也有较多局限 。