本文作者简介
吕永卫,微博广告资深数据开发工程师,实时数据项目组负责人。
黄鹏,微博广告实时数据开发工程师,负责法拉第实验平台数据开发、实时数据关联平台、实时算法特征数据计算、实时数据仓库、实时数据清洗组件开发工作。
林发明,微博广告资深数据开发工程师,负责算法实时特征数据计算、实时数据关联平台、实时数据仓库、FlinkStream组件开发工作。
崔泽峰,微博广告资深数据开发工程师,负责实时算法特征数据计算、实时任务管理平台、FlinkStream组件、FlinkSQL扩展开发工作。
引言
是随着微博业务线的快速扩张,微博广告各类业务日志的数量也随之急剧增长。传统基于Hadoop生态的离线数据存储计算方案已在业界形成统一的默契,但受制于离线计算的时效性制约,越来越多的数据应用场景已从离线转为实时。微博广告实时数据平台以此为背景进行设计与构建,目前该系统已支持日均处理日志数量超过百亿,接入产品线、业务日志类型若干。
一、技术选型
相比于Spark,目前Spark的生态总体更为完善一些,且在机器学习的集成和应用性暂时领先。但作为下一代大数据引擎的有力竞争者-Flink在流式计算上有明显优势,Flink在流式计算里属于真正意义上的单条处理,每一条数据都触发计算,而不是像Spark一样的Mini Batch作为流式处理的妥协。Flink的容错机制较为轻量,对吞吐量影响较小,而且拥有图和调度上的一些优化,使得Flink可以达到很高的吞吐量。而Strom的容错机制需要对每条数据进行ack,因此其吞吐量瓶颈也是备受诟病。
这里引用一张图来对常用的实时计算框架做个对比。
Flink特点
Flink是一个开源的分布式实时计算框架。Flink是有状态的和容错的,可以在维护一次应用程序状态的同时无缝地从故障中恢复;它支持大规模计算能力,能够在数千个节点上并发运行;它具有很好的吞吐量和延迟特性。同时,Flink提供了多种灵活的窗口函数。
如果你对大数据开发感兴趣,想系统学习大数据的话,可以加入大数据技术学习交流扣扣裙:数字522数字189数字307,欢迎添加,私信管理员,了解课程介绍,获取学习资源。
1)状态管理机制
Flink检查点机制能保持exactly-once语义的计算。状态保持意味着应用能够保存已经处理的数据集结果和状态。
2)事件机制
Flink支持流处理和窗口事件时间语义。事件时间可以很容易地通过事件到达的顺序和事件可能的到达延迟流中计算出准确的结果。
3)窗口机制
Flink支持基于时间、数目以及会话的非常灵活的窗口机制(window)。可以定制window的触发条件来支持更加复杂的流模式。
4)容错机制
Flink高效的容错机制允许系统在高吞吐量的情况下支持exactly-once语义的计算。Flink可以准确、快速地做到从故障中以零数据丢失的效果进行恢复。
5)高吞吐、低延迟
Flink具有高吞吐量和低延迟(能快速处理大量数据)特性。下图展示了Apache Flink和Apache Storm完成分布式项目计数任务的性能对比。
二、架构演变
初期架构
初期架构仅为计算与存储两层,新来的计算需求接入后需要新开发一个实时计算任务进行上线。重复模块的代码复用率低,重复率高,计算任务间的区别主要是集中在任务的计算指标口径上。
在存储层,各个需求方所需求的存储路径都不相同,计算指标可能在不通的存储引擎上有重复,有计算资源以及存储资源上的浪费情况。并且对于指标的计算口径也是仅局限于单个任务需求里的,不通需求任务对于相同的指标的计算口径没有进行统一的限制于保障。各个业务方也是在不同的存储引擎上开发数据获取服务,对于那些专注于数据应用本身的团队来说,无疑当前模式存在一些弊端。
后期架构
随着数据体量的增加以及业务线的扩展,前期架构模式的弊端逐步开始显现。从当初单需求单任务的模式逐步转变为通用的数据架构模式。为此,我们开发了一些基于Flink框架的通用组件来支持数据的快速接入,并保证代码模式的统一性和维护性。在数据层,我们基于Clickhouse来作为我们数据仓库的计算和存储引擎,利用其支持多维OLAP计算的特性,来处理在多维多指标大数据量下的快速查询需求。在数据分层上,我们参考与借鉴离线数仓的经验与方法,构建多层实时数仓服务,并开发多种微服务来为数仓的数据聚合,指标提取,数据出口,数据质量,报警监控等提供支持。
整体架构分为五层:
1)接入层:接入原始数据进行处理,如Kafka、RabbitMQ、File等。
2)计算层:选用Flink作为实时计算框架,对实时数据进行清洗,关联等操作。
3)存储层: 对清洗完成的数据进行数据存储,我们对此进行了实时数仓的模型分层与构建,将不同应用场景的数据分别存储在如Clickhouse,Hbase,Redis,Mysql等存储。服务中,并抽象公共数据层与维度层数据,分层处理压缩数据并统一数据口径。
4)服务层:对外提供统一的数据查询服务,支持从底层明细数据到聚合层数据5min/10mi