问题描述

1、在流式计算中经常需要对一批的数据进行汇总计算,类似SQL中的GROUP BY。在用JStorm来实现这一条简单的SQL时,面对的是一条一条的数据库变化的消息(这里需要保证有序消费),其实相当于在一堆的消息上面做了一个嵌套的SQL查询,用一张图表示如下:

2、业务DB中的表基本上不会有大宽表,也就是说获取数据时需要从把不同的表进行JOIN才能拿到结果,那么现在的问题是在JOIN的多个表中,任意一个表的数据出现变化都可能影响到最终的结果。也就是说在JStorm中需要针对每个表的变化想好应对的方法:

模型设计

最近看JStorm的接口,在分发消息的部分做了很多策略,我们设计模型的时候可以充分的利用这些策略来规避分布式情况下一些问题:

  1. 分布式锁
  2. 频繁访问持久化存储(这个操作一般比较慢)

GROUP BY

为了保证执行准确高效,在底层实现的时候需要处理很多细节。步骤:

  1. 在spout中监听顺序消息,将消息持久化到ots中。
  2. 在spout中根据offset批量读取ots中的数据放到本地队列中,然后在nextTuple中分发出去。
  3. 在bolt中根据group key字段接收消息并进行处理(相同的group key在同一个task上执行)。
    1. 幂等检查(如果是近期产生的数据,直接根据本地缓存判断,否则根据db判断)。
    2. 根据主键更新本地缓存中的数据,统计有哪些group key有更新。
    3. 定时将本地缓存中的数据批量刷到db,对消息进行ack确认(在spout的内存中统计发送、ack的消息数目)。
    4. 定时将有更新的group key刷到db。
  4. 在一个版本的所有消息消费成功之后在任务表写入记录。
  5. 在spout中监听任务表drc消息。
    1. 在spout中批量读取有变化的group key并在nextTuple中分发出去。
    2. 在bolt中根据group key接收消息,重新计算对应的统计值(max、min等)。
    3. 在spout本地统计所有的消息是否被成功消费,完成时在任务表中写入记录。
  6. 执行完成。

整体过程如下图:

在整个过程中有互相依赖的三个任务,消息和增量之间并行执行,增量和全量之间串行执行(只有增量执行完成才轮到全量):

JOIN

在联表操作中其实有很多的类型,在实际中有这样一个例子:包裹上有订单ID、包裹ID、拣选单ID,在拣选单上有打印状态,需要求订单对应的拣选单的最小的打印状态,整体的过程如下:

执行的步骤如下:

  1. 得到拣选单变化的增量,并将状态合并到拣选单全量表中。
  2. 得到包裹增量并合并到增量上面去。
  3. 取出拣选单、包裹的增量数据,执行更新操作。
    1. 对于拣选单,批量更新包裹状态。
    2. 对于包裹,更新单条记录。

配置方法

----- updating -----

最新文章

  1. .NET .ashx 文件 用Session 是需要注意的问题
  2. linux下多路复用模型之Select模型
  3. Delphi 指针
  4. Leeo 智能夜灯:默默守护你的家
  5. Spring MVC 快捷定义 ViewController
  6. ajax跳转到新的jsp页面
  7. Django(博客系统):基于pycharm如何一个django工程下创建多个app
  8. android添加阴影
  9. linux 下创建共享文件夹
  10. Kafka记录-Kafka简介与单机部署测试
  11. aliyun EC2配置利用filezilla配置ftp服务
  12. C# 因IIS回收导致定时器失效的解决方案
  13. 源自人脑的神奇算法 -- 读《How to make your own neural network》有感
  14. 10.python3标准库--加密
  15. POJ 2046 Gap 搜索- 状态压缩
  16. Perl 学习笔记-标量数据
  17. JavaScript Best Practices
  18. Chrome中输入框默认样式移除
  19. elasticsearch入门使用(一)es 6.2.2安装,centos 7
  20. 「NOIP2010」「LuoguP1514」引水入城

热门文章

  1. django 上传图片、使用PIL制作缩略图并保存到sea的storage
  2. HDU-1083
  3. 在cmd 中输入了错误mysql命令后,如何退出?
  4. [水煮 ASP.NET Web API2 方法论](1-2)在 WebForm 应用程序中添加 ASP.NET Web API
  5. 小米路由器3-R3 刷固件
  6. 2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17) 日常训练
  7. spark启动问题,发现任务都是在localhost下面运行的,原来启动spark-shell的时候需要带主节点的参数
  8. python之并发编程(线程\进程\协程)
  9. Sqli-labs less 11
  10. 【Go】语法基础之结构体