Storm:storm架构


tuple:表示流中一个基本的处理单元,可以包括多个field,每个filed表示一个属性

topology:一个拓扑是一个个计算节点组成的图,每个节点包换处理的逻辑,节点之间的连线表示数据流动的方向

spout:表示一个流的源头,产生tuple

bolt:处理输入流并产生多个输出流,可以做简单的数据转换计算,复杂的流处理一般需要经过多个bolt进行处理

task:每个spout和bolt都可以作为task在storm中运行,一个task对应一个线程
Nimbus:
    -集群管理
    -调度Topology
相当于master,storm是master/slave的架构
    -第一,负责管理集群,这些slave都向zookeeper写信息,然后nimbus通过zk获取这些slave节点的信息,这样nimbus就知道集群里有多少节点,节点处于什么样的状态,运行什么任务
    -第二就是调度topology,当一个topology通过接口提交到集群上面之后,负责把topology里面的worker分配到supervisor上面运行

Supervisor:每台机器会起一个supervisor进程,supervisor就是slave
    -supervisor主要负责worker的启动和停止,当nimbus调用之后,supervisor去把worker启动起来

Worker:实际的工作者,每个机器上面supervisor会启动很多worker,每台机器会配置一定的worker,例如4个。
    -每个worker其实就是一个jvm,负责启动executor,并且负责worker和worker自己的通信
    -executor:真正干活的线程。worker启动executor,executor负责执行spout,bolt里面的nextTuple(),execute()等函数




1./storm/supervisors/supervisor-id
–首先最基本的每个supervisor的信息它要写进去吧,因为它要知道整个集群的状态,还要写一些topology的信息,name,id,状态的信息,这个地方可能有些奇怪了,这里为什么叫storm-id而不叫topology-id???
2./storm/storms/storm-id
–实际上这个地方就应该叫topology-id,只不过在storm最早开发的时候呢,它每一个topology不叫topology,叫一个storm,但是对外文档都叫做了topology,内部的调用什么没改,还是沿用之前的,所以这里看到的还是storm-id,这里storms其实就是storm,storm-id是topology-id,所以大家以后要是深入到storm代码里面去的时候,有些storm-id的地方其实就是topology-id的意思,并不是两个不一样的东西,就是同一个东西
3./storm/assignments/storm-id
–当topolgy提交到集群里面去之后呢,nimbus会对它进行调度,当然nimbus会把调度信息写入到zookeeper里面去,包括topology分配了多少个worker啊,每个worker有个id号啊,worker分配到哪些机器啊,等等这些信息
4./storm/workerbeats/storm-id/node-port
–那这些worker启动来之后呢,它也需要把这些心跳信息写到集群里面去,方便后面去监控,每个worker它会把信息写到对应的文件上面去,命名是node加port的形式,node就是supervisor的ID,port就是这个worker对应的port,因为不同的supervisor上对应的port一定也是唯一的,因为port是他们数据交换的端口,所以说这个地方node加port是可以保证唯一性的
5./storm/errors/storm-id/component-id
–最后一部分是错误信息,就是Spout和Bolt产生的错误会写到zookeeper上面去,方便分析问题,这个error信息写到zookeeper里面的时候,这里说明一下,它有个策略,就是每个component就是Spout或者Bolt,它最多写最近的20条,这样就防止往zk里面存储过多的数据,导致压力太大,因为zk不适合存储

Supervisor做了3件事
•nimbus就是这些,其实核心的核心就是:topology要提交到这个niumbus上面来,然后他要调度topology,supervisor要去执行这些topology
•supervisor是集群里面的slave,每个机器上面都运行一个supervisor的进程,supervisor干三件事情
–第一件事情呢就是启动worker
–第二件事情呢就是监控worker
–第三件事情呢就是把自己的情况汇报出去
•1.启动worker
–它和hadoop不一样的是,它不会像hadoop一样会去向master要我要去启动什么样的worker,而是它定期会去zookeeper上查阅master写的调度信息,然后它看看这个调度信息里面有没有我这个机器要做的事情啊,要做的任务,发现有我这台机器要去做的事情,那么它就去启动,这个启动呢主要是做两件事情,第一呢就是下载topology的JAR包,而
•2.监控worker
–在解压出来后创建相应的目录后呢,就开始启动worker的JVM进程,后面这个worker就可以开始干活了,那么在启动了这个worker之后呢,后面很自然的就可以对这个worker进行监控,它怎么去监控这些worker呢,这些Worker启动之后呢,它会在本地写一些监控信息,这个时候supervisor就去看这些信息,当很长的时间没有这个worker的信息了的话,就认为这个worker有问题了,然后就处理异常,把这个worker重新启动等等
•3.把自己的情况汇报出去
–定期在ZK上面更新supervisor的心跳,定期默认是5秒钟一次,5秒钟supervisor就把自己的默认信息写到zookeeper上去,然后这个主要是为了告诉nimbus说表明supervisor没有问题,否则nimbus会认为没有心跳,supervisor挂了nimbus就是处理

Worker干了3件事
•supervisor启动worker,那Worker又干什么事情呢?
•worker呢其实也就干三个事
–第一呢它启动executor,executor真正去执行task,去运行Spout和Bolt的代码
–第二个事情呢,它还负责worker与worker之间的数据传输,因为分布式系统嘛,肯定会有数据的传输
–第三呢就是把自己的信息定期往本地系统写一份,然后再往ZK上面写一份
•1.启动executor
–没什么可说的,值得一提的就是,一个worker可能会启动多个executor,当然这里多个executor必须是属于一个topology的,比如说这个topology有10个worker,30个executor,那每个Worker里面就会起3个Executor
•2.数据传输
–第二个就是网络传输,当然模型也非常简单,就是一个topology的worker之间呢建立网络连接,那不同的topology之间肯定是没有网络连接的,这个是毫无疑问的,就只有同一个topology内部呢才会有交换数据的需求,第二个就是在网络连接建好之后呢,在每个Worker内呢有一个收线程,和有一个发线程,负责进行实际数据Tuple收发的工作,其实对应呢每个线程还有一个buffer,一个收buffer,还有一个发送的buffer,来做数据的缓冲
•3.最后一个定期会在本地系统和ZK来写心跳信息
–本地它会写一个叫WorkerHeartbeat的数据结构,这个结构非常简单,就是会记录现在写心跳的时间,然后storm-id,就是topology-id,然后worker里面对应有哪些个executors,就是记录executor的ID,然后worker对应的是哪个端口,这个心跳信息有什么用呢?主要本地信息worker说我还活着,然后supervisor会去拿来读,哦看到说你还有心跳,还活着哈哈,相对然后worker往ZK里面写的信息,相对要复杂一些,是以executor为单位的,每个executor都有一些状态信息,这些基本信息包括一些时间啊,ID啊,还有这个executor处理了多少个tuple,然后它处理的延迟平均是多少,它ack了多少tuple,它emit多少tuple,等等这些统计信息还有


Executor干了3件事
•那我们最后看看executor到最后了,看看它到底做了什么事情?
•executor它实际上做了3个关键的事情
–它会去创建实际的Spout/Bolt的对象
–两个关键的线程:
•执行线程
•传输线程
•执行线程:
–它会去执行nextTuple()/execute()两个回调函数,这两个回调函数分别是Spout和Bolt的,这两个方法稍有区别,Spout的nextTuple()执行是死循环的,当然里面有sleep的,就是当上一次调用nextTuple()的时候发现没有数据,那就睡几毫秒,还有一种情况呢就是,当我SpoutNextPending已经到达的时候,当我发现数据还有大量的没有处理完的时候,那我要做流控,这个时候那我就不要再反复执行nextTuple()了,睡一会儿再执行,
–Bolt的execute()方法呢不是说我哗哗哗一直的去调用,而是说当我收到一个新来的Tuple的时候呢,我才会去调用这个execute()函数,Tuple作为参数传给bolt对象,execute()方法就会去处理这个tuple

传输线程:
–传输线程负责做一件什么事情呢,它就是负责将新产生的tuple放到worker的传输队列里面去,因为worker它是最后做数据传输的地方嘛,executor它本身不会做数据传输,它只会处理完数据把数据放到内存里面
–其实这里面呢,刚开始executor会从内存里面receive-queue里面取数据,然后进行处理,处理完了呢,再通过emit将tuple放到transfer-queue里面去
–也就是说这里面有两个关键内存DisruptorQueue,这个我们后面再讲数据传输机制时呢再仔细的探讨一遍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值