01_Storm体系概要
1. Storm发展历史
Storm历史
1. 2010年12月,backtype公司Nathan,提出Storm的核心概念
2. backtype, 提供数据分析,数据处理服务的一个公司
3. 2011年4月,backtype完成storm开发,正式问世
4. 2011年5月,backtype被twitter收购,Storm开始开源
5. 2013年,Nathan加入Apache, Storm成为Apache开源项目
6. 2014年,Storm成为顶尖开源项目
Storm版本

2. Storm术语
集群架构

zookeeper的作用
1) nimbus和supervisor间的通信
2)监控storm集群各个物理节点的状态(online,offline)
Nimbus通过zk监控各个supervisor节点的状态(子节点列表事件)
supervisor失效,Nimbus收到Event通知,重新分发该Supervisor上的任务给其他Superviosr
注意:只有1个nimbus, 失效后不影响已经运行的topology,但新的topology无法提交(Nimbus不支持高可用)
1. nimbus
Storm集群的主节点,负责资源分配和任务调度,类似Hadoop中的JobTracker
只有1个nimbus(只有1台机器运行nimbus进程)
2. supervisor
Storm集群的从节点,多个supervisor(多台机器,每台上运行supervisor进程)
接收nimbus分配的任务,管理(起/停/监控)本节点上的多个worker进程
3. worker
Supervisor上的工作进程,1个supervisor上可以有多个worker进程
1个worker --- 1个JVM(worker内部会启动1个或多个executor线程,默认1个executor只执行1个task, 通过Conf可以针对每个spout,bolt在代码中设置executor个数和task个数,可以通过命令行调整worker进程数,spout/bolt各自的executor线程数)
4. task
worker下的工作线程,0.8版本后是逻辑线程,不再是物理线程
多个task共用1个物理线程(executor)

编程模型
5. Tolopogy

计算拓扑,由Spout,Bolt组成的图状结构
1个topology = 1个mapreduce Job
Topology实例分析
1)通过专用的数据接入API,将用户行为log输入给Spout
2) Bolt A, 进行数据去噪处理(丢弃格式不规范的数据,清理无效数据)并完成数据格式统一
3)Bolt B, 将规范后的数据写入磁盘进行存储(HDFS)
4)Bolt C, 可以筛选出VIP用户的数据
5)Bolt D, 将VIP行为日志存储到数据库(mysql-VIP行为日志)
6)Bolt F, 将VIP行为日志写入消息队列或缓存(redis)等,提供给其他系统使用
Topology的提交和运行
# storm jar code.jar MyTopology arg1 arg2
1) storm jar将连接nimbus, 上传code.jar到storm集群
2) MyTopology是要运行的主类(包含main方法,main中定义了topology)
3) Nimbus本质上是1个thrift服务,可以提交任何语言创建的topology
6. Spout
Storm编程模型中的消息源,提供消息的可靠传输(ack/fail机制)及 不可靠传输
从外部的消息队列(kafka), 数据库(HBase), API调用,分布式文件系统(HDFS)接入消息
主要开发接口是数据接入和nextTuple方法
7. Bolt
Storm编程模型中的消息处理组件,execute方法定义了实际的数据处理逻辑
execute中可以进行:输入tuple的过滤,合并等处理,对处理过的tuple进行ack或者set fail
Storm开发总结:
1)Spout的数据输入
2)Blot的处理逻辑(数据去噪,写入HDFS,写入数据库MySQL,写入消息队列或缓存)
3)Spout-Bolt-Bolt间的数据流向
4)Strom本身不存储数据,要自己设计数据落地
数据流
8.Stream
Topology中的消息流,节点间的边,由1个个tuple构成
每一条steam都会有1个id
通过id来检查消息是否被完整处理
9. tuple
消息的基本单位,消息封装为多个tuple, 多个tuple组成stream, 每一个tuple拥有tuple id
10. Stream Groupings 数据流分组策略

决定spout, bolt, bolt间的数据流动: 是否建立“边”,建立哪些边
1)shuffle Grouping: 随机选择1个bolt,向其发送数据;但storm提供了负载均衡,保证了bolt接收到的tuple数目基本相同
2)Fields Grouping: 按字段分组,相同数据内容构成的tuple都发往同一个bolt(单词统计)
3)All Grouping: 广播发送,每个tuple发送到所有bolt
4) Global Grouping:全局分组,所有tuple发送给1个bolt(task_id最小的)
5)Non Grouping:不分组,和Shuffle Grouping类似,发布者和订阅者是同一个bolt,spout
6) Direct Grouping:直接分组,使用特殊的发送方法
7)Custom Grouping:自定义分组,需要自己实现
3. 扩展、可靠、容错
3.1 高扩展性
1)Supervisor节点的水平扩展,千级节点
2)工作进程worker的扩展,1个从节点上可以运行多个worker进程
3)每个worker进程,可以创建多个executor线程
4)每个executor线程,可以执行多个task(轮询方式),task(spout,bolt)是真正的数据处理实体
task是逻辑线程,共享executor线程
3.2 高可靠性
消息,以消息树 + ack/fail机制保证每个消息都得到处理或者失败提示
1)每个spout和bolt,对处理的tuple发送ack或fail (发送给ack线程,ack将最终判定结果发送给spout)
2)多次都失败的消息,Spout将该消息丢弃
3)可靠消息处理机制,是storm区别于其他实时处理框架的特色
3.3 高容错
1)节点级别容错
nimbus通过zk集群监控supervisor状态,将失效的supervisor上的工作转移给其他supervisor
2)worker级别容错
supervisor会尝试重启出错的worker进程,并尝试一定次数
Storm在其他Supervisor上,启动新Worker进程,运行之前worker进程中的task
缺点:Nimbus没有高容错
3)数据容错(可靠消息处理如何实现?)
理想情况
每1个topology都包含1个acker组件(特殊的bolt, 默认1个,数量可设置)
针对每一个tuple,利用tuple id来维护1个tuple树(该tuple被发往了哪些bolt)
每个bolt处理完该tuple,反馈ack信息给acker, acker将该bolt从tuple树中删除
当tuple数被清空(所有bolt都成功处理),acker发送信息给spout, 说明该tuple被正常处理完成
现实情况:tuple树改良
1)每个tuple都要维护1个tuple数,内存占用巨大
2)实际实现:
* 使用固定大小的内存(20M),跟踪各个组件返回给acker的该tuple的ack value
* 各个组件(spout,bolt)返回的ack value = (输入tupleid) 异或(输出tupleid)
* spout反馈的ack value = 各个方向输出的tupleid的异或值
* 只接收tuple的bolt反馈的ack avalue = 各个方向输入的tupleid的异或值
* acker,将该tuple的所有ack value进行异或,最终结果为0则表示该tuple被正常处理,acker发送信息给spout,spout调用相应的ack方法,反馈tuple处理完成
开启tuple跟踪的前提:
1. 在spout emit tuple的时候,要加上第3个参数messageid
2. 在配置中acker数目至少为1
3. 在bolt emit的时候,要加上第二个参数anchor tuple,以保持tracker链路。
01_Storm体系概要的更多相关文章
- net core体系-1概要
.net core最近园子讨论频率很高的话题,从不久前发布正式版本后,也是开始从netcore官网一步一步走向学习之路:.net跨平台的设计让人很是兴奋起来,因为做了多年的互联网研发者,见识了很多一流 ...
- net core体系-Xamarin-1概要
大家在开发领域都知道Java是跨平台的,但是很多人认为.NET是只能在Windows下运行,不具有跨平台的特性,这种说法其实是不妥的. .NET其实在设计之初也是考虑像Java一样跨平台的,我们知道. ...
- net core体系-API-1Ocelot-(1)概要
从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中.当客户端(web站点.ios. app 等)访问web api时, ...
- net core体系-Xamarin-2概要(lignshi)
通过本套课程的学习,各位学员能够对Xamarin有一个比较清楚的认识,掌握Xamarin常用功能的使用方法,能够比较熟练的使用Xamarin进行App(移动应用)的开发,能够比较轻松.快速地投入项目当 ...
- 关于.NET知识体系结构图总结
转载:关于.NET知识体系结构图总结-零度http://www.xcode.me/book/net-framework-maps 最近对.NET框架方面的知识进行了概要的总结,整理了一些知识体系结构图 ...
- Hadoop体系架构简介
今天跟一个朋友在讨论hadoop体系架构,从当下流行的Hadoop+HDFS+MapReduce+Hbase+Pig+Hive+Spark+Storm开始一直讲到HDFS的底层实现,MapReduce ...
- 20160226.CCPP体系详解(0036天)
程序片段(01):01.多线程.c+02.多线程操作.c 内容概要:多线程 ///01.多线程.c #include <stdio.h> #include <stdlib.h> ...
- 20160220.CCPP体系详解(0030天)
程序片段(01):对称.c 内容概要:对称 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h ...
- 20160208.CCPP体系详解(0018天)
程序片段(01):main.c 内容概要:PointWithOutInit #include <stdio.h> #include <stdlib.h> //01.野指针详解: ...
随机推荐
- HDFS集群安装
DFS集群安装: 1.准备工作 (1)虚拟机(电脑8G 磁盘500GB) (2)3台linux系统(1台namenode 2台datanode) 2.安装HDFS(软件) (1)关闭防火墙 firew ...
- LINux网络的NAPI机制详解一
在查看NAPI机制的时候发现一篇介绍NAPI引入初衷的文章写的很好,通俗易懂,就想要分享下,重要的是博主还做了可以在他基础上任意修改,而并不用注明出处的声明,着实令我敬佩,不过还是附上原文链接! ht ...
- JXL导出Excel工具类
将Excel中的数据读取到List<Map<String, Object>>集合中 package com.mvc.util; import java.io.File; ...
- 软件project--作图
软工学习进行了一个多月,但是真正静下心来学习也只是一周左右吧,这段时间里给自己印象最深刻的就是作图了, 机房收费系统我们是先进行的编码,后学习软件project对它来了一次回想性的文档编写. 刚開始当 ...
- 现有mysql加入redis
spring-dao.xml(注意这里必须加上ignore-unresolvedable): redis.properties: redis.hostname=192.168.1.3 redis.po ...
- 宏表达式与函数、#undef、条件编译、
宏表达式在预编译期被处理,编译器不知道宏表达式的存在. 宏表达式没有任何的调用开销 宏表达式中不能出现递归定义. C语言中强大的内置宏 __FILE__:被编译的文件名 //双底线 __LINE__: ...
- 随机深林和GBDT
随机森林(Random Forest): 随机森林是一个最近比较火的算法,它有很多的优点: 在数据集上表现良好 在当前的很多数据集上,相对其他算法有着很大的优势 它能够处理很高维度(feature很多 ...
- 开源BBS论坛软件推荐
七款开源BBS论坛软件推荐(1) 本文介绍了七个开源的BBS论坛软件(在英文界一般叫做Forum).可能国内的朋友们比较熟悉Discuz!和PHPwind,但其实我们的选择还是很多的,而且下面介绍的这 ...
- ubuntu下python+tornado+supervisor+nginx部署
由于项目需要,老师让我写一个小web系统,之前都是用java写web,想到自己最近学机器学习要用python,所以用python来写一下,此外,因为想用点新东西,也介于程序比较小,所以考虑用mongo ...
- 什么是Java中的原子操作( atomic operations)
1.啥是java的原子性 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行. 一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么 ...