实时流计算与踩过的坑

0 概述

随着业务的推进,对数据的实时性要求更高,比如需要知道一个业务上线带来的实时流量,去衡量它上线之后的效果,实时的获取预算消耗情况,实时的掌握应用的响应情况,并且根据聚合结果再处理。
基于有一定实时流计算基础的情况,下面着重介绍设计过程中应该注意的地方。

1 设计方面

1.1 数据的倾斜、不平均

在APP中,统计一个活动区块的实时流量,区块可能被划分为多块,针对不同的用户,个性化推荐不同的活动,每个活动有bizId

比较简单的设计就是直接对bizId进行field grouping,然后统计bizId的PV,UV等。但是有些活动会被推荐给多个用户,有些活动只会推荐少数用户,导致每个逻辑统计bolt处理的数据不够平均

上图中,bizdId为1的流量较大,对应的Task处理压力大,会有消息堆积的情况。

比较好的解决方法是:

  • 我们先进行一次散列(直接用Storm的shuffle grouping ),在第一层 bolt 中,保证每个task处理数据量大致相等,但是这样数据会分散到每个task。
    然后分发继续可以使用field grouping,对之前已经聚合过一次的结果,在第二层bolt中,进行汇总。
  • 也有第二种解决方法,就是设计比较好的fileding grouping字段,保证每个字段的数据量大致相等(也就是自己思考如何散列),需要具体情况,具体分析

1.2 计算结果的聚合/更新方式

计算结果的聚合方式有三种

  1. 一种是全量式,按照时间间隔进行聚合,比如我统计1分钟的PV,那我在内存中进行聚合计算,一分钟之后再进行存储,存在的问题是,如果这个Bolt挂了,被重启,那可能就丢了之前已经聚合的一部分数据
  2. 第二种覆盖式,我提高写入频率,比如虽然是统计1分钟的数据,我每10秒就写入一次,写入过程判断是否存在这分钟数据,如果存在就update,否则直接存储。
  3. 第三种中心式,利用Redis进行存储,因为我们基本上value都是一个int类型的值,所以对redis操作的,KV加起来的字节数很小,在W级别的QPS下,响应时间avg基本可以在5MS下(同机房),因此我们的统计可以直接对redis操作,但是这样的做法是比较土豪的方式,消耗redis资源比较厉害,但是只做短时间的存储,另外起一个bolt,对存储的key进行记录,周期性的,对已经存储过的key可以进行load form redis 再 save to db ,进行持久化。

1.3 延时数据的统计

在大多数的实时流计算中,我们监听的是kafka的消息,进行消息处理。
一般情况下,kafka的性能很高,partion的设计使得可以承担更高的QPS,所以消息的到达几乎是没有延时的。

但是我们的topology 是无状态的,在我们进行重启,部署的时候,我们可以从offset开始消费,但是消息已经不是实时的,而是之前一段时间的,可以理解为消息到达的延时
比较好的处理方法是,所有的日志都需要带上时间戳,消息处理的时候,应该以日志自带时间戳为准,而不是以消息处理的时间为准。

1.4 超大数据的去重统计

在统计UV的时候,我们是基于用户的ID统计的,如果用户量少,那么可以直接用set或者map之类的,但是对于一些百万级别的用户,特别是统计不同维度的访问用户,就会成倍增加数据量。
这里有两种方法:

  • 布隆过滤器,布隆过滤器是由K个散列函数和一个二进制向量组成,当一个元素加入时,K个散列函数将元素映射到二进制向量的的K个点,并且置为1。检索时就看这些点是不是都是1,这个方法是可行的,但是误差比较随机

  • HyperLogLog,这是用来做基数统计的算法,RedisAPI自带,因此在我们的项目中,我们实际使用的就是这种方法,当然它也是一种误差范围内的算法。一般误差是在0.81%下
    引用官方文档的说明

The HyperLogLog data structure can be used in order to count uniqueelements in a set using just a small constant amount of memory, specifically 12k bytes for every HyperLogLog (plus a few bytes for the key itself).
The returned cardinality of the observed set is not exact, but approximated with a standard error of 0.81%.

2 监控方面

2.1 kafka消息的堆积

kafka消息直接做法是利用现成的监控工具查看,可以看到消息到达量和消费量

2.2 StormUI

用storm自带的Storm-UI就可以比较清楚的知道自己拓扑的情况,注意它也是采样的,不是精确的。

2.3.1每个bolt的性能

UI中点入自己的topology

鼠标放到对应英文上面就可以知道每个指标的含义
比如Execute执行时间,处理时间等。

2.3.3bolt的消息堆积情况

在Topology Visualization中点开,可以看到每个bolt的球球,其中颜色的深浅说明了消息的堆积情况。

其中从上往下说明堆积越来越严重

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容