开发组件:
Storm 集群和hodoop集群看起来类似,但是hadoop上运行的是mapreduce jobs ,而在storm上运行的是拓扑topology ,两者之前的区别是mapreduce jobs 运行完程序(离线数据)之后会结束,而topology不会结束(实时数据),除非手动kill,或者出现异常。
Storm 集群由一个主节点nimbus和一群工作节点 supervisor组成,通过zookeeper行动协调。
1)nimbus主节点:相当于hadoop 的JobTracker、yarn的ResourceManager,主要进行计算任务分配信息,哪些worker启动在哪些supervisor上,哪些worker运行那些线程上来执行task。
2)supervisor工作节点:相当于hadoopr的TaskTracker、yarn的NodeManager,负责接受nimbus分配的任务,启动或关闭属于自己管理的worker,每个工作节点都是topology的一个子集的实现,nimbus 和supervisor之间通过zookeeper集群进行协调。
3)zookeeper 集群:是完成nimbus和supervisor之间的协调服务。nimbus启动会将配制信息写入zookeeper,zookeeper的watch机制会通知supervisor,然后supervisor下载任务并启动worker,supervisor启动时也会将服务器上的配置信息写入zookeeper。
4)worker:运行具体处理组件逻辑的进程
5)task:worker中的每一个spout/bolt的线程称之为task,在storm8.0之后task不再与物理线程对接,同一个spout/bolt的task可能会共享一个物理线程,这个线程就是executor。
运行组件:
1)topology:storm中运行的一个实时程序,因为各个组件的消息流动形成一个逻辑上的一个拓扑结构,一个topology是由spouts和bolts 组成的,通过Stream Grouping将spouts和bolts 连接起来。
2)spout:在一个topology中产生源数据的组件,通常spout会从外部的数据源中读取数据,然后转换为topology内部数据,spout分为可靠和不可靠两种,当Storm接收失败时,可靠的spout会对tuple(元组、数据项组成的列表)进行重发;而不可靠的spout不会考虑成功与否只发送一次。Spout最主要的方法是nextTuple()该方法会发送一个新的tuple到topology,没有新的tuple会返回,而且nextTuple()方法不能阻塞,因storm在同一个线程上会调用所有消息源的spout的方法。另外两个比较重要的方法是ack()和fail() storm在检测一个tuple被整个topology成功处理的时候会调用ack(),否则会调用fail(),storm只会对可靠的spout调用ack()和fail()。
3)Bolt:topology的所有处理都有Bolt完成,即所有的消息处理逻辑都封装在bolt中,比如执行过虑、函数操作、合并、写入数据库等任何操作。
Bolt从spout中接收数据并处理,如果遇到复杂流的处理也可以将Tuple发送给另一个Bolt处理,bolt可以发送多条消息流,其中最重要的方法是executor()以新的tuple作为参数接收,不管是spout还是bolt,如果将tuple发送成多个流,这些流都可以用declareStream()来声明。
4)tuple:一个消息转递的基本单元,本来是以键值对存在的map,但是各个组件之间传递的tuple字段名已经事先定义好,所以tuple按序填入各个value就行了,所以就是一个value list。
5)stream:源源不断的tuple组成了stream,一个消息流是一个没有边界的tuple序列, 而这些tuple序列会以一种分布式的方式并行地创建和处理。通过对stream中tuple序列中每个字段命名来定义stream。在默认的情况下,tuple的字段类型可以是:integer,long,short, byte,string,double,float,boolean和byte array。你也可以自定义类型(只要实现相应的序列化器)。