zoukankan      html  css  js  c++  java
  • Storm系列(二)系统结构及重要概念

    在Storm的集群里面有两种节点:控制节点和工作节点,控制节点上面运行Nimbus进程,Nimbus负责在集群里面分配计算任务,并且监控状态。每一个工作节点上面运行Supervisor进程,Supervisor负责监听从Nimbus分配给它执行的任务,Nimbus和Supervisor之间的所有协调工作都是通过Zookeeper集群完成。

     

    Storm集群结构图

    image 

     

    Topology

    一个实时计算应用程序的逻辑在storm里面被封装到topology对象里面称为计算拓补。storm里面的topology相当于Hadoop里面的一个MapReduce Job, 它们的关键区别是:一个MapReduce Job最终总是会结束的, 然而一个storm的topoloy会一直运行 — 除非你显式的杀死它。 一个Topology是spout和bolt组成的图状结构, 而链接spout和bolts的则是stream groupings。

     

    Spout

    spout在storm中是消息数据生存者角色,一般来说spout会从一个外部源读取数据并且向topology里面发出消息tuple。spout分为可靠的与不可靠两种,可靠的spout在所发送的tuple没有被成功处理的情况下会重新发送,不可靠的spout在发送完tuple后就不会去确定是否成功处理和重发。

     

    Bolt

    bolt在storm中是消息消费者角色,所有的消息处理逻辑被封装在bolt中,可以做很多事情如: 过滤、聚合、查询数据库等。bolt的主要方法是execute, 它以一个tuple作为输入,bolt使用OutputCollector来发射tuple, bolt必须要为它处理的每一个tuple调用OutputCollector的ack方法,以通知storm这个tuple被处理完成了,从而我们通知这个tuple的来源spout。 一般的流程是: bolt处理一个输入tuple,  发射0个或者多个tuple, 然后调用ack通知storm自己已经处理过这个tuple了,storm提供了一个IBasicBolt会自动调用ack。

     

    Supervisor中各组件运行示意图

    image

     

    Worker

    • Supervisor会监听分配给它那台机器的工作,根据需要启动/关闭工作进程,这个工作进程就是worker.
    • 每一个worker都会占用工作节点的一个端口,这个端口可以在storm.yarm中配置。
    • 一个topology可能会在一个或者多个工作进程里面执行,每个工作进程执行整个topology的一部分,所以一个运行的topology由运行在很多机器上的很多工作进程组成。

    Task

    每一个spout和bolt会被当作很多task在整个集群里面执行。默认情况下每一个task对应到一个线程(Executor),这个线程用来执行这个task,而stream grouping则是定义怎么从一堆task发射tuple到另外一堆task。

     

    Worker、Task、Executor关系图

     

    image

     

    Stream groupings(消息分发策略)

    Shuffle Grouping:随机分组,随机派发stream里面的tuple,保证每个bolt接收到的tuple数目相同。
    Fields Grouping:按字段分组,比如按userid来分组,具有同样userid的tuple会被分到相同的Bolt,而不同的userid则会被分配到不同的Bolt。
    All Grouping:广播发送,对于每一个tuple,所有的Bolt都会收到。
    Global Grouping: 全局分组,这个tuple被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。
    Non Grouping:不分组,这个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果,有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。
    Direct Grouping:直接分组,  这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的taskid (OutputCollector.emit方法也会返回taskid)
    Local or shuffle grouping:如果目标bolt有一个或者多个task在同一个工作进程中,tuple将会被随机发生给这些task。否则,和普通的Shuffle Grouping行为一致。

  • 相关阅读:
    Cognos11第三方权限认证之OpenDJ
    Sqlserver 2008 R2安装的盘符空间不够用的解决办法
    Cognos11中通过URL访问report的设置
    Cognos11中关于CJAP第三方认证的相关配置
    Cognos11中报XQE-JDB-0004查找驱动程序类错误
    项目管理半开源工具备份和恢复
    CentOS7.4 安装rabbitmq-3.7.x
    Spring Cloud Zuul的一个坑
    题五:10行杨辉三角
    题四:一对兔子生兔子,给个月份算有几只兔子
  • 原文地址:https://www.cnblogs.com/jianyuan/p/4409479.html
Copyright © 2011-2022 走看看