【storm集群的搭建以及将开发好的拓扑提交到集群上运行的方法】

  在上一篇文章中,我们的拓扑直接运行,并在程序开始时候自动启动一个本地"集群"来运行拓扑。LocalCluster这种方式一般用于本地的开发和调试。而在实际的生产环境中,我们一般是有搭建好的storm集群,我们开发完topology后会提交到集群中的主节点nimbus,由nimbus来向supervisor分发代码,并启动woker来运行topology.下面我们将在本地搭建一个storm运行环境,并将开发好的WordCountTopology提交到本地"集群"上来运行。

  本地"集群"搭建

  1. 安装好JDK并配置系统环境变量;http://www.cnblogs.com/jonyo/p/5656386.html
  2. 安装zookepeer并配置系统环境变量;【待加。。。。】
  3. 下载storm压缩包,解压放到 /usr/local/下,在.zshrc中配置相关的环境变量
     export STORM_HOME=/usr/local/storm            
     export PATH=$PATH:$STORM_HOME/bin
  4. 进入到storm/conf下,修改storm.yaml配置文件,在末尾添加
    storm.zookeeper.servers:
    - "localhost"
    storm.local.dir: "/usr/local/storm/data"
    storm.zookeeper.port: 2181
    nimbus.host: "localhost"
    ui.port: 8080
    supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703

    这个文件主要是对storm使用的zookepeer地址,集群的nimbus,supervisor等信息进行了相关配置

  5. 步骤1~4完成以后,按照下面就可以启动集群了
    (1)启动zookepeer: 在/usr/local/zookeeper/bin下执行sh zkServer.sh start   接着执行sh zkServer.sh status查看启动状态,出现Mode: standalone即表示成功
    (2)启动nimbus进程:在/usr/local/storm/bin下执行 sh storm nimbus,会看到nimbus启动信息

    (3)启动supervisor进程,由于都是在同一台机器上启动的,需要重新开启一个控制台。在/usr/local/storm/bin下执行 sh storm supervisor

    (4)为了便于查看集群的信息,将ui也启动,在/usr/local/storm/bin下执行 sh storm ui, 然后通过localhost:8080可以查看集群状态

    UI界面,可以对拓扑进行管理,查看集群状态等等;由于没有任何拓扑提交,可以看到Topology Summary是空的,没有信息

    (5)将之前的WordCountTopology.java文件修改如下
     //        //建立本地集群,利用LocalCluster,storm在程序启动时会在本地自动建立一个集群,不需要用户自己再搭建,方便本地开发和debug
    // LocalCluster cluster = new LocalCluster();
    //
    // //创建拓扑实例,并提交到本地集群进行运行
    // cluster.submitTopology(TOPOLOGY_NAME, config, topologyBuilder.createTopology()); try {
    //submitTopology方法负责发送Topology到集群,[新增的代码]
    StormSubmitter.submitTopology(TOPOLOGY_NAME, config, topologyBuilder.createTopology());
    } catch (Exception e) {
    e.printStackTrace();
    }

    修改完成后,利用maven打成jar包:mvn compile       mvn clean package

    (6)将打出的jar包(拓扑)提交到集群上执行
    storm jar /Users/.../workspace/storm-learning/target/storm-learning-1.0-SNAPSHOT.jar  wordCount.WordCountTopology  wordCountTest
    在此打开localhost:8080会发现WordCountTopology在执行,并显示出执行的状态和相关信息

    拓扑提交到nimbus之后都发生了什么事情?即通过storm jar xxxxx.jar  xxx.Main agrs这个命令之后操作是怎么样的?

    storm jar会执行.../storm/bin目录下的storm.py脚本文件里定义的def jar(jarfile, klass, *args),在这个脚本中,通过一系列的设置,让后续main方法中的调用的StormSubmitter.submitTopology(name, conf, builder.createTopology())找到jar所在的地址,然后通过soket传输,将Jar文件上传到nimbus,nimbus在接收到jar文件后,存放到数据目录的inbox目录(inbox是在用户设置的storm.local.dir变量所指定的目录的nimbus下)
    inbox用于存放提交的Jar文件,每个Jar被重命名为stormjar+32位的uuid, 比如的的执行提交后是stormjar-a22e9169-e377-45db-9a07-a97357ccfbef.jar

    stormdist存放的是启动topology后生成的文件,每个topology都分配一个唯一的id,ID的规则是“name-计数-时间戳”。启动后的topology的jar文件名命名为storm.jar ,而它的配置经过java序列化后存放在stormconf.ser文件,而stormcode.ser是将topology本身序列化后存放的文件。这些文件在部署的时候,supervisor会从这个目录下载这些文件,然后在supervisor本地执行这些代码。

    进入重点,topology任务的分配过程(zookeeper路径说明忽略root):
    1.在zookeeper上创建/taskheartbeats/{storm id} 路径,用于任务的心跳检测。storm对zookeeper的一个重要应用就是利用zk的临时节点做存活检测。task将定时刷新节点的时间戳,然后nimbus会检测这个时间戳是否超过timeout设置。
    2.从topology中获取bolts,spouts设置的并行数目以及全局配置的最大并行数,然后产生task id列表,如[1 2 3 4]
    3.在zookeeper上创建/tasks/{strom id}/{task id}路径,并存储task信息
    4.开始分配任务(内部称为assignment), 具体步骤:
     (1)从zk上获得已有的assignment(新的toplogy当然没有了)
     (2)查找所有可用的slot,所谓slot就是可用的worker,在所有supervisor上配置的多个worker的端口。
     (3)将任务均匀地分配给可用的worker,这里有两种情况:
     (a)task数目比worker多,例如task是[1 2 3 4],可用的slot只有[host1:port1 host2:port1],那么最终是这样分配

    {1: [host1:port1] 2 : [host2:port1]
             3 : [host1:port1] 4 : [host2:port1]}


    ,可以看到任务平均地分配在两个worker上。
    (b)如果task数目比worker少,例如task是[1 2],而worker有[host1:port1 host1:port2 host2:port1 host2:port2],那么首先会将woker排序,将不同host间隔排列,保证task不会全部分配到同一个worker上,也就是将worker排列成

    [host1:port1 host2:port1 host1:port2 host2:port2]


    ,然后分配任务为

    {1: host1:port1 , 2 : host2:port2}



    (4)记录启动时间
    (5)判断现有的assignment是否跟重新分配的assignment相同,如果相同,不需要变更,否则更新assignment到zookeeper的/assignments/{storm id}上。
    5.启动topology,所谓启动,只是将zookeeper上/storms/{storm id}对应的数据里的active设置为true。
    6.nimbus会检查task的心跳,如果发现task心跳超过超时时间,那么会重新跳到第4步做re-assignment。

    最后的topology任务的分配过程 参考:http://blog.csdn.net/xiaolang85/article/details/38065185

Storm入门3-集群搭建的更多相关文章

  1. 【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell

    Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实 ...

  2. 全文搜索引擎 Elasticsearch 入门:集群搭建

    本文主要介绍什么是 ElasticSearch 以及为什么需要它,如何在本机安装部署 ElasticSearch 实例,同时会演示安装 ElasticSearch 插件,以及如何在本地部署多实例集群, ...

  3. k8s入门之集群搭建(二)

    一.准备三台节点 从上篇文章 k8s入门之基础环境准备(一)安装的Ubuntu虚拟机克隆出三台虚拟机,如图所示 启动这三台虚拟机节点,分别做如下配置 虚拟机名称 IP HostName k8sMast ...

  4. 大数据初级笔记二:Hadoop入门之Hadoop集群搭建

    Hadoop集群搭建 把环境全部准备好,包括编程环境. JDK安装 版本要求: 强烈建议使用64位的JDK版本,这样的优势在于JVM的能够访问到的最大内存就不受限制,基于后期可能会学习到Spark技术 ...

  5. RabbitMQ入门教程(十四):RabbitMQ单机集群搭建

    原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...

  6. [转帖]kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

    kafka入门:简介.使用场景.设计原理.主要配置及集群搭建 http://www.aboutyun.com/thread-9341-1-1.html 还没看完 感觉挺好的. 问题导读: 1.zook ...

  7. 基于.NetCore的Redis5.0.3(最新版)快速入门、源码解析、集群搭建与SDK使用【原创】

    1.[基础]redis能带给我们什么福利 Redis(Remote Dictionary Server)官网:https://redis.io/ Redis命令:https://redis.io/co ...

  8. hadoop+spark集群搭建入门

    忽略元数据末尾 回到原数据开始处 Hadoop+spark集群搭建 说明: 本文档主要讲述hadoop+spark的集群搭建,linux环境是centos,本文档集群搭建使用两个节点作为集群环境:一个 ...

  9. 分布式实时日志系统(一)环境搭建之 Jstorm 集群搭建过程/Jstorm集群一键安装部署

    最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式 ...

  10. kafka集群搭建和使用Java写kafka生产者消费者

    1 kafka集群搭建 1.zookeeper集群  搭建在110, 111,112 2.kafka使用3个节点110, 111,112 修改配置文件config/server.properties ...

随机推荐

  1. Quoit Design---hdu1007(最近点对问题 分治法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 题意:给你n(2<=n<=10^6)个点的坐标,然后找到两个点使得他们之间的距离最小 ...

  2. Android 基于Android的手机邮件收发(JavaMail)之一(准备工作)

    界面一共是五个界面,分别是welcomeActivity,ReceiveAndSendActivity,ReceiveListActivity,SendMailActivity,MailDetails ...

  3. android:descendantFocusability用法简析

    开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写,问题就出现了 ...

  4. GPS部标监控平台的架构设计(十一)-基于Memcached的分布式Gps监控平台

    部标gps监控平台的架构,随着平台接入的车辆越来越多,架构也面临越来越大的负载挑战,我们当然希望软件尽可能的优化并能够接入更多的车辆,减少在硬件上的投资.但是当车辆增多到某一个临界点的时候,仍然要面临 ...

  5. jQuery工具方法

    目录 常用工具方法 判断数据类型的方法 Ajax操作 $.ajax 简便写法 Ajax事件 返回值 JSONP 文件上传 参考链接 jQuery函数库提供了一个jQuery对象(简写为$),这个对象本 ...

  6. CentOS7下Apache及Tomcat开启SSL

    安装: 复制代码 yum install -y openssl #使用openssl可手动创建证书 yum install -y httpd yum install -y mod_ssl 防火墙打开8 ...

  7. Python爬虫爬取糗事百科段子内容

    参照网上的教程再做修改,抓取糗事百科段子(去除图片),详情见下面源码: #coding=utf-8#!/usr/bin/pythonimport urllibimport urllib2import ...

  8. 浅析JS中的模块规范(CommonJS,AMD,CMD)////////////////////////zzzzzz

    浅析JS中的模块规范(CommonJS,AMD,CMD)   如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已.     ...

  9. rdesktop的使用方法

    工作时一般是开两台电脑 ,一台linux,一台windows,以前也用过虚拟机什么的,但是 有时候 跑起来拖泥带水的十分不爽,所以慢慢的就习惯了两台电脑的工作方式,一般我大部时间都在linux下面.用 ...

  10. Notepad++自动刷新文本

    现在的日志信息往往都是打印在硬盘上,而不是保存到线上,所以我们常常会使用notepad++来查看硬盘上的文本文件 这时往往会出现两个问题 (1)在notepad++长时间最小化后,再次打开会提示是否下 ...