简单实时计算方案(kafka+flink+druid/es)

2022-11-30 17:09:45 浏览数 (1)

    最近在从事实时方面的工作,主要涉及到数据处理、加工及可视化,在采坑的过程中总结出一套比较简单的实时计算方案,供大家参考。主要涉及到几个组件,kafka,flink,redis,druid和es。相信大家对以上几个组件都比较熟悉了,这里就不细说了。我们从一个简单的需求,来说明各个组件是怎么协作的。

     假如现在我们有一个电商平台,每天访问的流量巨大,主要访问流量都集中在衣服类、家电类页面,那么我们想实时看到这两类页面的访问量走势(十分钟出一个统计量),当做平台的重要指标,可视化的数据如下。

时间段

页面类型

访问量

07:00am

衣服类

100000

07:00am

家电类

60000

07:10am

衣服类

80000

07:10am

家电类

70000

数据采集    

为了计算访问量,前提就是要进行数据采集,假设平台在每一次用户访问的时候,我们可以获取到信息包括:手机号,访问页面类型,访问时间。数据采集的方式有很多,一般我采用埋点的方式,将【手机号,访问页面类型,访问时间】,形成一条埋点计入日志,然后采用flume或其他组件,将埋点日志收集进入kafka(根据访问量,设置partition数量)

数据处理

数据处理是最关键的阶段,这里选用flink处理kafka的流,该过程包括过滤、格式转换、分组等等、去重、附加字段、聚合等。针对我们的需求,我们可以分为几个阶段:

1.数据过滤

数据过滤,就是为了过滤掉非法数据,针对我们的需求,比如过滤掉手机号为空的记录

2.数据分组

数据分组是一个比较重要的阶段,这涉及到我们数据统计的方式,在分组的时候我们一般按照数据最低维度来分组,增加数据灵活性,如果我们这里先按照页面类型分组,分组的结果就是我相同页面类型的数据会在同一个分组。

3.数据window

window选择

数据window是实时处理中比较重要的特点,因为我们需要看到数据的统计结果,所以必须先给数据流划分批次,然后对批中的数据做聚合,flink的window比较丰富,包括time window,thumb window等等。在我们的需求中要看到10分钟内的访问量,所以这里选用time window,为了应对灵活多变的需求,我们需要选择合适的窗口时长,比如现在的需求要看到10分钟内的访问量,如果想要看到每分钟的访问量该怎么办呢,所以一般我们窗口时长会选择最小的粒度,这里我们选择1分钟的窗口时长。

time 类型

选用time window时需要注意,我们的时间标准,有两个概念需要注意,一个是event time指时间发生时间,另一个是process time指消息处理时间,这两个时间是有差别的,比如用户在7:01:23的时候访问了平台,但是埋点经过flume,kafka再到flink延迟至7:01:45的时候才到,那么event time是7:01:23,process time是7:01:45,我们如果想准确统计访问量,就需要选用event time,值得注意的是,如果以event time为时间标准的话,需要kafka中的消息,带有时间戳。

4.数据聚合

当分组和window都设定好以后,就可以对数据做聚合了,比如分组之后的数据,我们直接可以做reduce,或count,sum,max,min。这里我们做reduce,对记录做count。需要注意的是,如果需求变了,需要对手机号做去重,那么在去重的时候还要加入去重的逻辑,去重如果量小的话可以再flink中做,如果量大的话,可以依赖redis等中间kv存储,做去重。

数据落地

数据聚合完之后,就需要将数据落地,这是可以选择直接落入存储,或发送到下游topic用来进行更加复杂的计算,我一般为了灵活扩展会将数据sink到下游topic,然后由kafka直接接入druid或es。在落入druid的时候需要注意,因为druid特有的预聚合方式,你要指定维度,指标,聚合时间戳字段以及时间段长度,所以聚合结果中需要带上,event time的时间戳,同时决定预聚合时长。回到需要:10分钟统计一次,因此预聚合时长可以在1~10分钟内任意选择。需要说明的是,数据不需要做特殊加工(比如不需要去重、不需要关联、数据量没那么大)的时候可以跳过flink阶段,直接落入druid中,因为druid本身就带有多种预聚合功能。

数据校验

本需求可能比较简单,但是在实际需求可能复杂的多,为了确保数据的正确性,需要把明细数据备份下来,方便数据校验,一般备份的数据不需要实时性的时候,可以将数据落入hive中,而需要实时校对的时候,可以将数据落入es中。

      在实际场景中,数据多种多样,该方案仅使用于特定场景,如有不足之处欢迎大家,评论指正!!!

0 人点赞