Storm集群架构及计算模型分析总结

1. 详述storm系统架构 Storm架构由四个部分组成: (1)Nimbus: 集群资源调度、任务分配、接收jar包; (2)Supervisor 接收nimbus分配的任务、启动、停止自己管理的worker进程(当前supervisor上worker数量由配置文件设定) (3)Worker 运行具体处理运算组件的进程(每个Worker对应执行一个Topology的子集)、worker任务类型,即spout任务、bolt任务两种、启动executor(executor即worker JVM进程中的一个java线程,一般默认每个executor负责执行一个task任务); (4)zookeeper: 存储storm集群的状态信息、监督所有worker进程节点的健康状态,并向nimbus汇报 2. 详述storm的计算模型 storm的计算模型如下图: Storm的计算模型为DAG计算模型,DAG由Spout和bolt节点在有向无环图里灵活组合,以stream数据流,以Tuple(元组)为数据流里面的数据单元。 Stream –每一个Stream都有一个ID,如果没有指定写ID就用的是默认的流,叫default,每个Spout/Bolt都有一个默认的Stream:default –一个stream中的Tuple有固定的schema –每个spout/bolt都有一个默认的stream:default –spout/bolt可以有多个流 Spout Spout它是产生Tuple的源头,Spout它有核心地方就是有个nextTuple()的函数,每个线程不断调这个回调函数,Spout主动去kafka取数据,然后再用emit方法生成一个Tuple给后面的bolt进行处理,这里用主动这个词是,因为数据不能打给storm,因为storm没有地方去接这个数据,storm是主动拉来数据的系统,数据放在消息队列kafka或者Storm自带的DRPC Server中 Grouping Grouping是一个路由的策略,决定一个Tuple发给下游某个bolt中n个并发中的哪一个Task,告诉topology如何在两个组件之间发送tuple,定义一个topology的其中一步是定义每个bolt接收什么样的流作为输入。stream grouping就是用来定义一个stream应该如果分配数据给bolts上面的多个tasks。 3.详述什么是storm的流分组?有哪几种?如何分组的? Storm里面有7种类型的stream grouping,也可以通过实现CustomStreamGrouping接口来实现自定义流分组 1. Shuffle Grouping随机分组,随机派发stream里面的tuple,保证每个bolt task接收到的tuple数目大致相同。 2. Fields Grouping按字段分组,比如,按"user-id"这个字段来分组,那么具有同样"user-id"的tuple 会被分到相同的Bolt里的一个task,而不同的"user-id"则可能会被分配到不同的task。 3. All Grouping广播发送,对于每一个tuple,所有的bolts都会收到 4. Global Grouping全局分组,整个stream被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。 5. None Grouping不分组,这个分组的意思是说stream不关心到底怎样分组。目前这种分组和Shuffle grouping是一样的效果,有一点不同的是storm会把使用none grouping的这个bolt放到这个bolt的订阅者同一个线程里面去执行(如果可能的话)。 6. Direct Grouping指向型分组,这是一种比较特别的分组方法,用这种分组意味着消息(tuple)的发送者指定由消息接收者的哪个task处理这个消息。只有被声明为Direct Stream 的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的task的id (OutputCollector.emit方法也会返回task的id)。 7. Local or shuffle grouping本地或随机分组。如果目标bolt有一个或者多个task与源bolt的task在同一个工作进程中,tuple将会被随机发送给这些同进程中的tasks。
posted @ 2019-06-25 09:26  HandsomeEric  阅读(441)  评论(0编辑  收藏  举报