概述:html
storm集群有nimbus、supervisor组成java
storm集群nimbus只有一个,supervisor能够多个mysql
讲故事:sql
故事1:数据库
nimbus就是老板,supervisor就是包工头,worker就是工人。网络
Topology就是一车砖头,根据砖头的数量决定工人数量,而后worker就本身去干活吧,规定的时间必须把活干完,worker启动多线程干也行,可是每一个worker之间要配合好(分组)。数据结构
故事2:多线程
storm集群的工做原理有点像ansible+dubbo+java应用的架构。(多个worker)ansible能够把把一个java应用在一台机器上部署多个,(worker里面的多线程)java应用里面有一个线程池,(归组)java应用之间能够经过dubbo互相调用。区别是dubbo调用时主动调用服务,而Topology是数据流向同一分组中继续流动。架构
一、条件过滤 这是storm最基本的处理方式,对符合条件的数据进行实时过滤,将符合条件的数据保存下来,这种实时查询的业务需求在实际应用中很常见。 二、中间件计算 咱们须要改变数据中某一个字段(例如是数值),咱们须要利用一个中间值通过计算(值比较、求和、求平均等)后改变该值,而后将数据从新输出。 三、求TopN 相信你们对TopN类的业务需求也是比较熟悉的,在规定的时间窗口内,统计数据出现的TopN,该类处理在购物及电商业务需求中,比较常见。 四、分布式RPC storm有对RPC进行专门的设计,分布式RPC用于对storm上大量的函数调用进行并行计算,最后将结果返回给客户端。 五、推荐系统 在实时处理时从mysql及hadoop中获取数据库中的信息,例如在电影推荐系统中,传入数据为用户当前点播电影信息,从后数据库中获取的是该用户以前的一些点播电影信息统计。 六、批处理 所谓批处理就是数据积攒到必定触发条件 ,就批量输出,所谓的触发条件相似事件窗口到了,统计数量够了及检测到某种数据传入等等。 七、热度统计 热度统计实现依赖于TimeCacheMap数据结构,该结构可以在内存中保持近期活跃的对象。咱们可使用它来实现例如论坛中的热帖排行统计等。
1、Storm究竟是什么?负载均衡
一、mysql,hadoop与storm
mysql:事务性系统,面临海量数据的尴尬
hadoop:离线批处理
storm:实时计算
二、storm的特色是什么?
(1)支撑各类实时类的项目场景:实时处理消息以及更新数据库,基于最基础的实时计算语义和API(实时数据处理领域);对实时的数据流持续的进行查询或计算,同时将最新的计算结果持续的推送给客户端展现,一样基于最基础的实时计算语义和API(实时数据分析领域);对耗时的查询进行并行化,基于DRPC,即分布式RPC调用,单表30天数据,并行化,每一个进程查询一天数据,最后组装结果
storm作各类实时类的项目都ok
(2)高度的可伸缩性:若是要扩容,直接加机器,调整storm计算做业的并行度就能够了,storm会自动部署更多的进程和线程到其余的机器上去,无缝快速扩容
扩容起来,超方便
(3)数据不丢失的保证:storm的消息可靠机制开启后,能够保证一条数据都不丢
数据不丢失,也不重复计算
(4)超强的健壮性:从历史经验来看,storm比hadoop、spark等大数据类系统,健壮的多的多,由于元数据所有放zookeeper,不在内存中,随便挂都没关系
特别的健壮,稳定性和可用性很高
(5)使用的便捷性:核心语义很是的简单,开发起来效率很高
2、Storm的集群架构以及核心概念
一、Storm的集群架构
Nimbus,Supervisor,ZooKeeper,Worker,Executor,Task
二、Storm的核心概念
Topology,Spout,Bolt,Tuple,Stream
Topology 拓扑:务虚的一个概念
Spout:数据源的一个代码组件,就是咱们能够实现一个spout接口,写一个java类,在这个spout代码中,咱们能够本身尝试去数据源获取数据,好比说从kafka中消费数据
bolt:一个业务处理的代码组件,spout会将数据传送给bolt,各类bolt还能够串联成一个计算链条,java类实现了一个bolt接口
一堆spout+bolt,就会组成一个topology,就是一个拓扑,实时计算做业,spout+bolt,一个拓扑涵盖数据源获取/生产+数据处理的全部的代码逻辑,topology
tuple:就是一条数据,每条数据都会被封装在tuple中,在多个spout和bolt之间传递
stream:就是一个流,务虚的一个概念,抽象的概念,源源不断过来的tuple,就组成了一条数据流
3、Storm的并行度以及流分组
并行度:Worker->Executor->Task,没错,是Task
其实就是多个task共同运行
流分组:Task与Task之间的数据流向关系
策略:
Shuffle Grouping:随机发射,负载均衡
Fields Grouping:根据某一个,或者某些个,fields,进行分组,那一个或者多个fields若是值彻底相同的话,那么这些tuple,就会发送给下游bolt的其中固定的一个task
你发射的每条数据是一个tuple,每一个tuple中有多个field做为字段
好比tuple,3个字段,name,age,salary
{"name": "tom", "age": 25, "salary": 10000} -> tuple -> 3个field,name,age,salary
All Grouping
Global Grouping
None Grouping
Direct Grouping
Local or Shuffle Grouping
应用案例:
一、基于storm的应用系统:
(1)基于storm的网络爬虫系统的设计与实现:
大致框架:
众所周知,爬虫系统里几个必不可少的模块,像下载、解析、回写待爬资源、存储等,本质上他们像是一个责任链,但后一个module又基于前一个module,因此能够理解为一种流处理模型,从咱们拿到待爬URL一直处处理完毕存储数据,这是一个完整的过程。如您看到的这张图,若是咱们实现了storm化,那么基于storm强大的功能,咱们的爬虫能够完美运行在storm集群上,而且每类处理器咱们均可以很是灵活的分配其线程数,耗时的处理咱们多开几个线程,能够实现资源合理利用,固然既然是集群,你的某个任务具体运行在哪里,storm已经帮您分配好了,而且帮咱们实现了节点失效等处理。
最后若是bolt间传输的消息量比较大,有可能网络是个瓶颈。