问题描述

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 -----

JStorm模型设计的更多相关文章

  1. JSTORM使用笔记

    安装部署 zeromq 简单快速的传输层框架,安装如下: wget http://download.zeromq.org/zeromq-2.1.7.tar.gztar zxf zeromq-2.1.7 ...

  2. Apworks框架实战(五):EasyMemo的领域模型设计

    在上一讲中,我们已经新建了一个聚合根对象Account,并已经可以开始设计领域模型了.在这一讲中,我们会着重介绍EasyMemo领域模型的分析和设计,并引入Visual Studio Ultimate ...

  3. MongoDB 存储引擎和数据模型设计

    标签: MongoDB NoSQL MongoDB 存储引擎和数据模型设计 1. 存储引擎 1.1 存储引擎是什么 1.2 MongoDB中的默认存储引擎 2. 数据模型设计 2.1 内嵌和引用 2. ...

  4. jstorm集群部署

    jstorm集群部署下载 Install JStorm Take jstorm-0.9.6.zip as an example unzip jstorm-0.9.6.1.zip vi ~/.bashr ...

  5. 数据库模型设计PowerDesigner

    Power Designer 是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,他几乎包括了数据库模型设计的全过程.利用Power Designer可以制作数据流程图.概 ...

  6. zookeeper+jstorm的集群搭建

    zookeeper的配置: zookeeper有三种配置方式:单机式/伪分布式/集群式 其中伪分布式是在一台电脑上通过不同的端口来模拟分布式情形,需要N份配置文件和启动程序,而集群式是多个zookee ...

  7. One to One 的数据库模型设计与NHibernate配置

    在数据库模型设计中,最基本的实体关系有三种:一对一.一对多.多对多.关于一对多和多对多使用的情况较多,之前也有过一些讨论,现在来说明一下在数据库中一对一的模型设计. 首先,关系数据库中使用外键来表示一 ...

  8. JStorm集群的安装和使用

    0 JStorm概述 JStorm是一个分布式的实时计算引擎.从应用的角度,JStorm应用是一种遵守某种编程规范的分布式应用:从系统角度, JStorm是一套类似MapReduce的调度系统: 从数 ...

  9. JStorm集群的部署

    JStorm是一个类似Hadoop MapReduce的系统,不同的是JStorm是一套基于流水线的消息处理机制,是阿里基于Storm优化的版本,和Storm一样是一个分布式实时计算的系统,从开发角度 ...

随机推荐

  1. Django web框架之权限管理一

    1. 需求分析: 准备:创建独立app, rbac #权限管理模块/组件 app01 #应用 分配权限,URL 2. 数据库设计 2.1 设计思路 第一版: 权限表: ID url title is_ ...

  2. ssm框架问题和Java

    http://blog.csdn.net/zzjjiandan/article/details/20853233 BeanFactory的作用是什么? BeanFactory是配置.创建.管理bean ...

  3. html5 -audio-移动端如何自动播放

    最近在做一些活动类页面或者类似于易企秀类型的轻应用经常遇到关于audio标签的应用,对于audio相关的常用知识点以及一些相关的问题如下: <audio id="audios" ...

  4. 595. Big Countries

    There is a table World +-----------------+------------+------------+--------------+---------------+ ...

  5. debian 7 安装 rz sz lrzsz

    https://blog.csdn.net/hchaoyangming/article/details/51582749

  6. AC日记——贪婪大陆 洛谷 P2184

    贪婪大陆 思路: 树状数组: 跪烂.. 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 int ...

  7. 2t3ik、ddgs与Linux异常文件下载处理

    异常1: 这样的邮件发生了两周了,烦得很.进入服务器,用top看来下进程. 解决办法 首先 kill 相关PID 进入/tmp/   删除相关文件 rm -rf 2t3ik相关文件 不给相关文件修改权 ...

  8. CentOS7安装和配置vsftpd

    (1)vsftpd基本介绍 作用:实现文件共享 1)vsftpd两种模式 主动模式 所谓主动模式,指的是FTP服务器"主动"去连接客户端的数据端口来传输数据,其过程具体来说就是:客 ...

  9. nginx中使用perl模块

    转载自:http://www.netingcn.com/nginx-perl.html 如果对于一个绝大部分内容是静态的网站,只有极少数的地方需要动态显示,碰巧你又了解一点perl知识,那么nginx ...

  10. BotBuilder Nodejs示例查看

    关于Bot Framework知识,可以参考<Nodejs Bot学习> 本文是根据bot framework官方示例<https://github.com/Microsoft/Bo ...