美文网首页大数据技术分享
Storm入门(二):架构模型和集群部署

Storm入门(二):架构模型和集群部署

作者: code_solve | 来源:发表于2019-06-20 15:15 被阅读35次

前言

上一篇文章我们通过 Storm 的本地模式对其编程模型进行了讲述....
本篇文章我们来讲一讲 Storm 的集群:

  1. Storm 的特点
  2. Storm 的架构和组件
  3. 如何安装 Storm 集群
  4. 如何提交作业到 Storm 集群

Storm 的特点

  • 分布式:这个没什么好说的,对于大数据来说,单台机器肯定是无法满足需求的

  • 高容错,高可靠:其容错下了很大的功夫,这个我们以后再细说。

  • 高性能:性能一直为大家所关注的一个点,storm其性能主要体现在以下几点:

    1. 流式处理而非微批处理,实时性更好(也是可以做微批的,不过一般不会这么做)
    2. 纯内存,不走磁盘
    3. Topology 的设计也是其性能的一个保障
  • 高扩展:水平扩展能力好,可以动态调整资源,而不需重启任务

  • 自带 UI,可维护性好

  • DRPC可以作为实时响应服务

  • 使用广泛,社区活跃

Storm 架构

Storm 架构图.png
从上图我们大概可以看到 Storm 的基本架构包括:(以下文本来源于此处
  1. Nimbus:

    • 主节点,本身无状态
    • 接收客户端任务Topology的提交,并负责在集群中分发代码,即Jar包
    • 分配工作给从节点supervisor,注意不是直接分配,而是将任务发布到zookeeper上,由supervisor到zookeeper上领取任务(在Zookeeper相应的znode节点上写入任务分配信息,由supervisor查看这些znode上的任务分配信息,获取分配到的任务)
    • 监控: 监听集群状态(从Zookeeper集群中相应znode上读取supervisor,worker进程的状态信息数据)
    • 容错:当supervisor节点挂掉,由Nimbus将该节点上正在运行着的任务重新分配给其他supervisor执行
  2. Supervisor

    • 从节点
    • 从Zookeeper上获取Nimbus分配的任务,负责启动和停止本机上worker进程来执行任务,worker的容错由Supervisor进程负责
    • 需要定时将自己的运行状态信息(心跳信息)汇报到zookeeper上,由Nimbus监控(在Zookeeper相应的znode节点上写入心跳信息)
  3. Worker

    • 真正的执行任务的进程,负责启动executor线程来执行任务
    • worker进程并不是常驻进程,不能通过手动启动
    • 负责与其他worker之间进行数据传输
      需要将自己的运行状态汇报到zookeeper上,由Nimbus监控
  4. Executor

    • 真正执行任务的线程(负责执行客户提交到Storm集群上任务中Task(spout/bolt)),由worker启动和停止
  5. Zookeeper

    • 存储任务调度信息、各节点状态信息、心跳
      使Storm集群各节点保持无状态,这样具有高可靠性
    • 这里也是找到一张Storm在zookeeper上的目录树图,可以看一下


      zookeeper上的目录树图.png
  1. UI (启动后进程名为 core)
    • storm web监控页面
    • 在storm.yaml配置文件中通过配置ui.port参数指定web ui访问端口
    • UI需要与Nimbus运行在同一台服务器上(这一点没确认过,一般是这样配置的)

从架构图我们可以知道,Storm 的 主节点 Nimbus 和 从节点Supervisor 不会直接进行通讯,而是依赖于 zookeeper 这个组件,这也是Storm的一个设计巧妙之处,很好的避免了 主从之间依赖而产生的系列问题

安装 Storm 集群

安装什么的比较简单,这里就不再造轮子了,
可以看下这篇
这里有张部署完之后,各个节点本地的目录树图

Storm本地的目录树.png

提交作业到 Storm 集群

  1. 这里我们将上一篇讲到的代码,稍微改一改就可以了,当传入的参数大于1,我们将第一个参数作为 该作业的 名称 提交到集群去运行,否则就是本地测试模式
public static void main(String[] args) {
        TopologyBuilder builder = new TopologyBuilder();
        builder.setSpout("textSpout", new MySpout(), 3);
        builder.setBolt("MyBolt", new MyBolt(), 3).shuffleGrouping("textSpout");

        Config config = new Config();
        StormTopology topology = builder.createTopology();
        if (args.length > 0) {
            try {
                StormSubmitter.submitTopology(args[0], config, topology);
            } catch (AlreadyAliveException e) {
                e.printStackTrace();
            } catch (InvalidTopologyException e) {
                e.printStackTrace();
            } catch (AuthorizationException e) {
                e.printStackTrace();
            }
        } else {
            LocalCluster localCluster = new LocalCluster();
            localCluster.submitTopology("test", config, topology);
        }
    }
  1. 打成 jar 包
    这个就不要我说了吧...

  2. 命令行提交
    到 Storm 集群的任意一台机器,使用 Storm 指令进行提交:
    storm jar xxx.jar com.package,name topologyName
    如果一切没有问题,就可以正常执行了

你的点赞是对作者最大的支持

相关文章

网友评论

    本文标题:Storm入门(二):架构模型和集群部署

    本文链接:https://www.haomeiwen.com/subject/hxndqctx.html