zoukankan      html  css  js  c++  java
  • storm启动流程

    email:chenguibin2004@126.com

    storm: 是一个分布式的实时流式计算框架,具有低延迟、高可用、分布式、可扩展、数据不丢失的特点,
    storm包含四个核心组件:
    Nimbus:负责资源分配和任务调度。
    Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。---通过配置文件设置当前supervisor上启 动多少个worker。  
    Worker:运行具体处理组件逻辑的进程。Worker运行的任务类型只有两种,一种是Spout任务,一种是Bolt任务。
    Taskworker中每一个spout/bolt的线程称为一个task. 在storm
    0.8之后,task不再与物理线程对应,不同spout/bolt的task可能会共享一个物理线程,该线程称为executor。
    storm的编程模型包含以下一个方面:

    TopologyStorm中运行的一个实时应用程序的名称。(拓扑)

    Spout:在一个topology中获取源数据流的组件,通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。

    Bolt:接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。

    Tuple:一次消息传递的基本单元,理解为一组消息就是一个Tuple,内部是一个list。

    Stream:表示数据的流向。
     
    Storm启动流程分析
     
    ------------程序员client------------------
     
    1、客户端运行storm nimbus时,会调用storm的python脚本,该脚本中为每个命令编写一个方法,每个方法都可以生成一条相应的java命令。
       命令格式如下:java -server xxxx.ClassName -args
       nimbus---> Running:/jdk/bin/java -server  backtype.storm.daemon.nimbus
       supervisor---> Running: /jdk/bin/java -server  backtype.storm.daemon.supervisor
     
    --------------nimbus---------------------   
     
       命令格式:storm jar xxx.jar   xxx驱动类  参数
       Running: /jdk/bin/java -client -Dstorm.jar=/storm/examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount-28
     
       该命令会执行 storm-starter-topologies-0.9.6.jar 中的storm-starter-topologies-0.9.6.jar的main方法,main方法中会执行以下代码:
        StormSubmitter.submitTopology("mywordcount",config,topologyBuilder.createTopology());
     
        topologyBuilder.createTopology(),会将程序猿编写的spout对象和bolt对象进行序列化。
     
        会将用户的jar上传到 nimbus物理节点的/storm/workdir/nimbus/inbox目录下。并且改名,改名的规则是添加了一个UUID字符串。
     
        在nimbus物理节点的/storm/workdir/nimbus/stormdist目录下。有当前正在运行的topology的jar包和配置文件,序列化对象文件。
     
     
    3、nimbus接受到任务之后,会将任务进行分配,分配会产生一个assignment对象,该对象会保存到zk中,目录是/storm/assignments ,该目录只保存正在运行的topology任务。
     
    --------supervisor------------------
     
    4、supervisor通过watch机制,感知到nimbus在zk上的任务分配信息,从zk上拉取任务信息,分辨出属于自己任务。
        ResourceWorkerSlot[hostname=192.168.1.106,memSize=0,cpu=0,tasks=[1, 2, 3, 4, 5, 6, 7, 8],jvm=<null>,nodeId=61ce10a7-1e78-4c47-9fb3-c21f43a331ba,port=6900]
     
    5、supervisor 根据自己的任务信息,启动自己的worker,并分配一个端口。
        '/export/servers/jdk/bin/java' '-server' '-Xmx768m' export/data/storm/workdir/supervisor/stormdist/wordcount1-3-1461683066/stormjar.jar' 'backtype.storm.daemon.worker' 'wordcount1-3-1461683066' 'a69bb8fc-e08e-4d55-b51f-e539b066f90b' '6701' '9fac2805-7d2b-4e40-aabc-1c85c9856d64'
     
    ---------worker----------------------
     
    6、worker启动之后,连接zk,拉取任务
        ResourceWorkerSlot[hostname=192.168.1.106,memSize=0,cpu=0,tasks=[1, 2, 3, 4, 5, 6, 7, 8],jvm=<null>,nodeId=61ce10a7-1e78-4c47-9fb3-c21f43a331ba,port=6900]
  • 相关阅读:
    Live2D 看板娘
    Live2D 看板娘
    python框架☞Flask
    Python框架☞Django
    Python ORM框架之SQLALchemy
    HTTP1.0 HTTP 1.1 HTTP 2.0主要区别
    【F12】修改 DevTools的主题
    【F12】网络面板
    【正在等待可用套接字】解决方法
    nginx反向代理压测问题记录
  • 原文地址:https://www.cnblogs.com/heitaok/p/5531535.html
Copyright © 2011-2022 走看看