Storm是一个开源的分布式实时计算系统,可以简单,可靠地处理大量的数据流。
----<<Storm实战构建大数据实时计算>>
(以下内容主要来自书本<Storm实战构建大数据实时计算>)
名词解释:
什么是Tuple:Tuple(元组),是消息传递的基本单元。Storm中使用Tuple作为其数据模型。
什么是Stream:Stream(流),是storm中的一个抽象概念,是一个无界的Tuple序列,源源不断传递的Tuple组成了Stream。
首先是Storm的几个比较大的特点:
1.编程模型简单:
Storm为大数据的实时计算提供了一些简单的原语,降低了开发并发并行实时处理任务的复杂性。
2.可扩展性:
在Storm集群中真正运行Topology的主要有三个实体:工作进程,线程,和任务。Storm集群中的每台机器上都可以运行多个工作进程,每个工作进程又可创建多个线程,每个线程可以执行多个任务,任务是真正进行数据处理的实体,Spout,Bolt被开发出来就是作为有一个或者多个任务的方式执行的。因此,计算任务在多个线程,进程和服务器之间并行进行,支持灵活的水平扩展。
3.高可靠性
4.高容错性
5.支持多种编程语言
6.支持本地模式
7.运维和部署简单
Storm与Hadoop的区别:
Hadoop是批处理框架,适合处理大量的离线数据,而Storm是流式处理框架,适合需要及时性的数据处理,可以做到随着数据的变化而不断对数据进行处理,并更新结果。Hadoop任务开启后,计算结束则进程结束。Storm任务开启后,除非手动结束,否者其进程会一直运行,实时的计算出最新的结果。
Storm的组成:
Storm集群中包含两类节点:主控节点(Master Node)和工作节点(Worker Node)
主控节点上运行一个被称为Nimbus的后台程序,它负责在Storm集群内分发代码,分配任务给工作机器,并负责监控集群的运行状态。Nimbus的作用类似于Hadoop中JobTracker的角色。每个工作节点上运行一个被称为Supervisor的后台程序。Supervisor负责监听从Nimbus分配给它执行的任务,据此启动或停止执行任务的工作进程。每一个工作进程执行一个Topology的子集,一个运行中的Topology由分布在不同工作节点上的多个工作进程组成。Nimbus和Supervisor节点之间的所有协调工作是通过Zookeeper集群实现的。
工作节点:
工作节点上有两种
Executor的数量计算:
每个组件的Executor的数量加上Work的数量
TopologyBuilder topologyBuilder=new TopologyBuilder(); topologyBuilder.setSpout("spout", new Spout(),2).setNumTasks(4); topologyBuilder.setBolt("fistbolt", new FistBolt(),1).shuffleGrouping("spout").setNumTasks(1); topologyBuilder.setBolt("twobolt", new TwoBolt(),1).shuffleGrouping("fistbolt").setNumTasks(1); Config config=new Config(); config.setNumWorkers(2);如上图所示,Executor的数量即为2+1+1+2=6个。
Work:工作进程,运行在一个个Supervisor的对应端口上
Executor:线程数
Tasks:任务数
一个工作进程可以运行多个线程,一个线程可以运行多个任务
如上图的spout的分布,如果是平均的,就可以看成是,每一个进程中运行一个线程,一个线程中运行2个任务
Storm的窗口机制:
Tumbling Window:
按固定的时间间隔或者Tuple数量划分窗口,每个窗口没有交互,每个窗口处理的数据是没有交叉的。
假如5秒一个窗口,如下图:
| e1 e2 | e3 e4 e5 e6 | e7 e8 e9 |... 0 5 10 15 -> time w1 w2 w3Sliding Window:
滑动窗口,数据有重叠。
假如:10s(窗口大小)一个窗口,滑动5s(步长),如下图:
| e1 e2 | e3 e4 e5 e6 | e7 e8 e9 |... 0 5 10 15 -> time |<------- w1 -------->| |------------ w2 ------->|