** ·Nimbus 集群管理调度topology · Supervisor 启停worker · Worker 一个JVM进程资源分配的单位启动executer · Executer 实际干活的线程 · ZK 存储状态信息,调度信息,心跳 **
1】.一个slot就是一个worker,一个worker里面就是一个JVM,一个worker里面有多个executer,一个executer上执行一个或者多个Task,一般来说默认就是一个task;
2】.Spout可以调用nextTuple()函数来去从外部取数据,可以从DPRC取数据,可以从MQ,比如从Kafka中取数据,然后给后面的Bolt处理;
3】.Storm纯流式处理,处理数据单元是一个个Tuple,Storm计算模型—DAG计算模型,DAG是由Spout和Bolt组合起来的,它们都是节点,边就是stream数据流,数据流里面的数据单元就是Tuple,而grouping是做数据流里面的数据分发;spout和bolt都是在内存里面进行计算的,不会写入到磁盘中,所以运转效率非常高;
4】.Storm中最重要的就是一个topology,topology就是对DAG模型的实现; Storm关键的组件,nimbus 、supervisor,worker,executor,另外storm还用到了外围的zk组件来存储协调数据;
5】.可以把topology理解为一个Job, 对于hadoop的job就会有map和 reduce;对于Storm来说topology就会有spout和bolt;hadoop中的job是有生命周期的,最终会结束的,topology的生命周期是如果你不kill掉它,它会一直运行job;
6】.每个Stream都有一个ID,如果没有指定写ID就用默认的流,叫做default,每个spout/bolt都有一个默认的Stream:default;spout/bolt可以有很多流;很多情况下我们写的storm程序就是一个default流;
7】.spout是产生tuple的源头,一般从外部数据源如kafka取数据,生成tuple;spout的核心地方就是有一个nextTuple()函数,每个线程不断调用这个回调函数,Spout主动去kafka取数据,然后再用emilt()方法生成一个Tuple给后面的bolt进行处理;
8】.实现bolt的逻辑是交给java来实现的,当然其它语言也可以;实现bolt中最核心的又是实现一个execute回调函数,里面的参数就是新来的tuple,bolt是数据驱动,当数据来了就去处理,然后后面再产生新的tuple;
9】.Grouping其实就做一件事,它决定发给下游某个bolt中n个并发中的哪一个task, ShuffleGrouping随机乱发,fieldGrouping按照某个字段或某些字段做hash,allGrouping就是上游的数据发给下游,就是相当于发给下游的所有,相当于广播, CustomGrouping,自定义,相当于mapreduce自己去实现一个partition一样,你只需要相对说0,1,2哪个,它就会帮你去找真正集群里面是哪个;
10】.nimbus:相当于master,storm是master/slaves的架构; Nimbus负责两件事情:①负责管理集群,这些slaves都向zk写信息,然后nimbus通过zk获取这些slaves节点的信息,这样nimbus 就知道集群里面有多少个节点,节点处于什么样的状态。都运行着什么样的任务;②调度topology,当一个topology通过接口提交到集群上面之后,负责把topology里面的worker分配到supervisor上面执行;
11】.supervisor:每台机器都会器一个supervisor进程,supervisor就是slave,supervisor其实就是干一件事情,就是启停worker,当nimbus调用之后,supervisor去吧worker启动起来,这样的话worker就可以开始干活了;
12】.worker:实际干活的是worker,每台机器上面supervisor会启动很多个worker。每台机器配置一定的worker,比如4个worker,一个worker就是一个JVM,worker就做两件事:①启动executer,②负责同一个topology中的worker和worker之间的传输,task这些数据传输就是通过worker来做的,topology和topology之间没有任何相关性的;
13】.execute:真正干活的是worker里面的executor,worker启动executor,execut去执行spout,bolt里面的nextTuple(),execute()这些回调函数,是真正运行的线程;
14】.storm使用zk都往zk里面写什么内容呢???
15】.Nimbus干了5件事情 ① 调用topology,将调度信息写入ZK ② 检查supervisor/worker心跳,处理异常 ③ 处理topology submit,kill,rebalance等请求 ④ 提供查询cluster/topology状态的thrift接口 ⑤ 提供文件(如topology程序jar包)上传下载服务
16】.Supervisor做了3件事 Topology要提交到nimbus上面来,然后它要调度topology,supervisor要去执行这些topology;supervisor是集群里面的slave,每台机器上面都要运行一个supervisor的进程;
① 启动worker 它和hadoop不一样的是,它不会像hadoop一样会去向master要我要去启动什么样的worker,而是它定期会去zookeeper上查阅master写的调度信息,然后它看看这个调度信息里面有没有我这个机器要做的事情啊,要做的任务,发现有我这台机器要去做的事情,那么它就去启动,这个启动主要是做两件事情,第一呢就是下载topology的JAR包,而且把这个JAR包解压出来,再解压出来后创建相应的目录,这样后面就可以用这个JAR包了; ② 监控worker 在解压出来后创建相应的目录后后,就开始启动worker的JVM进程,后面这个worker就可以开始干活了,那么在启动了这个worker之后,后面很自然的就可以对这个worker进行监控,它怎么去监控这些worker呢?这些Worker启动之后,它会在本地写一些监控信息,这个时候supervisor就去看这些信息,当很长的时间没有这个worker的信息了的话,就认为这个worker有问题了,然后就处理异常,把这个worker重新启动等等 ③ 把自己的情况汇报出去 定期在ZK上面更新supervisor的心跳,定期默认是5秒钟一次,5秒钟supervisor就把自己的默认信息写到zookeeper上去,然后这个主要是为了告诉nimbus supervisor没有问题,否则nimbus会认为没有心跳,supervisor挂了,nimbus就得处理;
17】 . Worker干了三件事 Worker干了三件事,第一启动executor,executor真正去执行task,去运行spout和bolt的代码;第二它负责worker与worker之间的数据传输,因为分