01Storm基础
目录
storm介绍
storm是一个分布式计算框架,主要使用Clojure和Java语言呢编写,storm分布式计算的特点,大量,实时,不间断的处理数据。
storm处理过程就像自来水一样,从数据的源头获取数据,通过层层处理下向流,中间可能经过数据的筛选,加工,存储,转换等等操作。
数据通过一个的处理层,可以分流成几股不同数据流,也可以几个数据流在一个处理层汇合成一个数据流。
storm有很多的应用场景,比如一个很大流量的门户网站,每时每刻有百万千万的用户访问,并使用。用户使用过程中产生的数据量是非常大的,对于这些数据,需要实时处理,因为每时每刻都有新的数据产生,所以storm就像一个流一样,会一直实时的处理数据。
storm基本概念
元组 Tuple
元组是构成流的基本数据单位,也是消息传递的基本单位,元组中的字段可以是任意类型的对象。在storm中元组作为其数据模型,storm中的元组支持Java基本类型,字符串,字节数组,以及只要实现序列化接口的对象,都可以当做元组使用。元组本来应该是一个key-value的Map,由于各个组件间传递的字段已经事先定义好,所以只要按序把元组填入各个value即可,所以元组可以看做一个value的List
流 Stream
Stream是storm的核心抽象,是一个无边界的元组序列,源源不断的传递这元组组成了流。
流由元组组成,使用OutputFieldsDeclarer声明流以及流的模式
龙卷 Spout
Spout是流的源头,产生数据的源头,是拓扑的流的来源,Spout是一个主动的角色,在其接口中的nextTuple()方法中会源源不断的产生Tuple,也就是数据。如果流中没有数据,那nextTuple会简单返回。
Spout可以发出超过一个流,使用OutputFieldsDeclarer类的declareStream方法可以声明多个流。使用SpoutOutputStream类的emit方法可以提交流,把数据源头的流提交到下个处理层Bolt
闪电 Bolt
在一个拓扑中,所有的处理操作都在Bolt中进行处理,也就是我们项目中的业务逻辑部分。
Bolt是流的处理节点。Spout是流的数据源节点,Bolt可以完成数据的过滤,业务处理,连接运算,连接与访问数据库等等。
Bolt是一个被动的角色,会不断的接受数据,进行处理,在Bolt接口中有一个execute()方法,在该方法中会获取从上一个处理层传来的数据,从而在这一层进行数据的再次处理。
拓扑 Topology
拓扑是Strom中运行的一个实时应用程序,由各个组件之间的消息流动二形成的逻辑上的拓扑结构。
上面是有一个Spout和三个Bolt组成的一个拓扑,图中箭头代表着流,Spout可以发送多个流,Bolt可以发送多个,也可以多个流合并。数据就是从Spout发出,进过多个Bolt向下传递。
在Java中使用TopologyBuilder类来构建拓扑
主控节点和工作节点
在Storm集群中有一个主控节点(Master Node)管理者整个拓扑,有多个工作节点(Work Node)处理者业务逻辑
Nimbus进程和Supervisor进程
主控节点运行这一个Nimbus进程,Nimbus负责集群中分发代码,对节点的分配任务,以及监视主机的故障。
每个工作节点运行着一个Supervisor进程,Supervisor监听其主机上已经分配的主机的作业,启动和停止Nimbus已经分配的工作进程。
流分组
在拓扑中不同节点之间的流类型是可以不相同的,流分组为每一个Bolt指定应该接受哪些流作为输入流,比如在一个Bolt节点上,希望接受特定标识的key的流,有些Bolt可能希望均匀的接受各个上层传过来的流。
Storm内置8中分组流,(下一篇会详细列出)
工作进程 Worker
工作进程是Spout/Bolt中运行的具体处理逻辑的进程。拓扑跨一个或者多个Worker进程执行。
每一个Worker进程是一个物理的JVM和拓扑执行所有任务的子集。
任务 Task
Worker中的每一个Spout/Bolt的线程为一个Task。每一个Spout/Bolt在集群中执行多个任务,每一个任务对应一个线程。
通过TopologyBuilder类的setSpout和setBolt方法来设置每个Spout和Bolt的并行度(任务数量)
执行器 Executor
在Storm0.8以后 Task不在于物理线程对应。同一个Spout/Bolt的Task可能会共享一个物理线程,这就是Executor。
配置拓扑的并行度(parallelism)
注意,这里所说的术语“并行度”主要是用于表示所谓的 parallelism_hint
,它代表着一个组件的初始 executor (也是线程)数量。在这篇文章里,我们使用这个“并行度”术语来说明在 Storm 拓扑中既可以配置 executor 的数量,也可以配置 worker 和 task 的数量