# 公司到底需不需要引入实时计算引擎?

# 实时计算需求

大数据发展至今,数据呈指数倍的增长,对实效性的要求也越来越高,所以你可能接触到下面这类需求会越来越多。


小田,你看能不能做个监控大屏实时查看促销活动销售额(GMV)?

小朱,搞促销活动的时候能不能实时统计下网站的 PV/UV 啊?

小鹏,我们现在搞促销活动能不能实时统计销量 Top5 啊?

小李,怎么回事啊?现在搞促销活动结果服务器宕机了都没告警,能不能加一个?

小刘,服务器这会好卡,是不是出了什么问题啊,你看能不能做个监控大屏实时查看机器的运行情况?

小赵,我们线上的应用频繁出现 Error 日志,但是只有靠人肉上机器查看才知道情况,能不能在出现错误的时候及时告警通知?

小夏,我们 1 元秒杀促销活动中有件商品被某个用户薅了 100 件,怎么都没有风控啊?

小宋,你看我们搞促销活动能不能根据每个顾客的浏览记录实时推荐不同的商品啊?

……

那这些场景对应着什么业务需求呢?我们来总结下,大概如下:

images 初看这些需求,是不是感觉很难?那么我们接下来来分析一下该怎么去实现?

从这些需求来看,最根本的业务都是需要 实时查看数据信息 ,那么首先我们得想想如何去采集这些实时数据,然后将采集的实时数据进行实时的计算,最后将计算后的结果下发到第三方。

# 数据实时采集

就上面这些需求,我们需要采集些什么数据呢?

  1. 买家搜索记录信息
  2. 买家浏览的商品信息
  3. 买家下单订单信息
  4. 网站的所有浏览记录
  5. 机器 CPU/MEM/IO 信息
  6. 应用日志信息

# 数据实时计算

采集后的数据实时上报后,需要做实时的计算,那我们怎么实现计算呢?

  1. 计算所有商品的总销售额
  2. 统计单个商品的销量,最后求 Top5
  3. 关联用户信息和浏览信息、下单信息
  4. 统计网站所有的请求 IP 并统计每个 IP 的请求数量
  5. 计算一分钟内机器 CPU/MEM/IO 的平均值、75 分位数值
  6. 过滤出 Error 级别的日志信息

# 数据实时下发

实时计算后的数据,需要及时的下发到下游,这里说的下游代表可能是:

1. 告警方式(邮件、短信、钉钉、微信)

在计算层会将计算结果与阈值进行比较,超过阈值触发告警,让运维提前收到通知,及时做好应对措施,减少故障的损失大小。

images 2. 存储(消息队列、DB、文件系统等)

数据存储后,监控大盘(Dashboard)从存储(ElasticSearch、HBase 等)里面查询对应指标的数据就可以查看实时的监控信息,做到对促销活动的商品销量、销售额,机器 CPU、MEM 等有实时监控,运营、运维、开发、领导都可以实时查看并作出对应的措施。

  • 让运营知道哪些商品是爆款,哪些店铺成交额最多,哪些商品成交额最高,哪些商品浏览量最多;

images

  • 让运维可以时刻了解机器的运行状况,出现宕机或者其他不稳定情况可以及时处理;

images images

  • 让开发知道自己项目运行的情况,从 Error 日志知道出现了哪些 Bug;

images

  • 让领导知道这次促销赚了多少 money。

images 从数据采集到数据计算再到数据下发,整个流程在上面的场景对实时性要求还是很高的,任何一个地方出现问题都将影响最后的效果!

images

# 实时计算场景

前面说了这么多场景,这里我们总结一下实时计算常用的场景有哪些呢?

  1. 交通信号灯数据
  2. 道路上车流量统计(拥堵状况)
  3. 公安视频监控
  4. 服务器运行状态监控
  5. 金融证券公司实时跟踪股市波动,计算风险价值
  6. 数据实时 ETL
  7. 银行或者支付公司涉及金融盗窃的预警
  8. ……

另外自己还做过调研,实时计算框架的使用场景有如下这些:

images 总结一下大概有下面这四类:

images 1. 实时数据存储

实时数据存储的时候做一些微聚合、过滤某些字段、数据脱敏,组建数据仓库,实时 ETL。

2. 实时数据分析

实时数据接入机器学习框架(TensorFlow)或者一些算法进行数据建模、分析,然后动态的给出商品推荐、广告推荐

3. 实时监控告警

金融相关涉及交易、实时风控、车流量预警、服务器监控告警、应用日志告警

4. 实时数据报表

活动营销时销售额/销售量大屏,TopN 商品

说到实时计算,这里不得不讲一下和传统的离线计算的区别!

# 离线计算 vs 实时计算

再讲这两个区别之前,我们先来看看流处理和批处理的区别:

# 流处理与批处理

images 看完流处理与批处理这两者的区别之后,我们来抽象一下前面文章的场景需求( 实时计算 ):

images 实时计算需要不断的从 MQ 中读取采集的数据,然后处理计算后往 DB 里存储,在计算这层你无法感知到会有多少数据量过来、要做一些简单的操作(过滤、聚合等)、及时将数据下发。

相比传统的 离线计算 ,它却是这样的:

images 在计算这层,它从 DB(不限 MySQL,还有其他的存储介质)里面读取数据,该数据一般就是固定的(前一天、前一星期、前一个月),然后再做一些复杂的计算或者统计分析,最后生成可供直观查看的报表(dashboard)。

# 离线计算的特点

  1. 数据量大且时间周期长(一天、一星期、一个月、半年、一年)
  2. 在大量数据上进行复杂的批量运算
  3. 数据在计算之前已经固定,不再会发生变化
  4. 能够方便的查询批量计算的结果

# 实时计算的特点

在大数据中与离线计算对应的则是实时计算,那么实时计算有什么特点呢?由于应用场景的各不相同,所以这两种计算引擎接收数据的方式也不太一样:离线计算的数据是固定的(不再会发生变化),通常离线计算的任务都是定时的,如:每天晚上0 点的时候定时计算前一天的数据,生成报表;然而实时计算的数据源却是流式的。

这里我不得不讲讲什么是流式数据呢?我的理解是比如你在淘宝上下单了某个商品或者点击浏览了某件商品,你就会发现你的页面立马就会给你推荐这种商品的广告和类似商品的店铺,这种就是属于实时数据处理然后作出相关推荐,这类数据需要不断的从你在网页上的点击动作中获取数据,之后进行实时分析然后给出推荐。

# 流式数据的特点

  1. 数据实时到达
  2. 数据到达次序独立,不受应用系统所控制
  3. 数据规模大且无法预知容量
  4. 原始数据一经处理,除非特意保存,否则不能被再次取出处理,或者再次提取数据代价昂贵

images

# 实时计算的优势

实时计算一时爽,一直实时计算一直爽 ,对于持续生成最新数据的场景,采用流数据处理是非常有利的。例如,再监控服务器的一些运行指标的时候,能根据采集上来的实时数据进行判断,当超出一定阈值的时候发出警报,进行提醒作用。再如通过处理流数据生成简单的报告,如五分钟的窗口聚合数据平均值。复杂的事情还有在流数据中进行数据多维度关联、聚合、筛选,从而找到复杂事件中的根因。更为复杂的是做一些复杂的数据分析操作,如应用机器学习算法,然后根据算法处理后的数据结果提取出有效的信息,作出、给出不一样的推荐内容,让不同的人可以看见不同的网页(千人千面)。

# 实时计算面临的挑战

  1. 数据处理唯一性(如何保证数据只处理一次?至少一次?最多一次?)
  2. 数据处理的及时性(采集的实时数据量太大的话可能会导致短时间内处理不过来,如何保证数据能够及时的处理,不出现数据堆积?)
  3. 数据处理层和存储层的可扩展性(如何根据采集的实时数据量的大小提供动态扩缩容?)
  4. 数据处理层和存储层的容错性(如何保证数据处理层和存储层高可用,出现故障时数据处理层和存储层服务依旧可用?)

因为各种需求,也就造就了现在不断出现实时计算框架,在 1.2 节中将重磅介绍如今最火的实时计算框架——Flink,在 1.3 节中会对比介绍 Spark Streaming、Structured Streaming 和 Storm 之间的区别。

# 小结与反思

本节从实时计算的需求作为切入点,然后分析该如何去完成这种实时计算的需求,从而得知整个过程包括数据采集、数据计算、数据存储等,接着总结了实时计算场景的类型。最后开始介绍离线计算与实时计算的区别,并提出了实时计算可能带来的挑战。你们公司有文中所讲的类似需求吗?你是怎么解决的呢?