• storm中的Scheduler


    Scheduler是storm的调度器,负责为topology分配当前集群中可用的资源。Storm分别提供了3中调度器:

    1. EvenScheduler:会将系统中的可用资源均匀地分配给当前需要任务分配的多个topology。
    2. DefaultScheduler:跟EvenScheduler基本上一样,唯一区别在于它在为topology分配任务之前先释放掉其他Topology不再需要的资源,然后调用EvenScheduler方法为topology均匀分配资源。
    3. IsolationScheduler:它有比较特殊的机制,使得用户可以单独为某些topology指定它们需要的机器资源(机器数)。用户需要在storm配置项中指定这些信息,IsolationScheduler会优先对这些Topology分配任务,保证分配给某个topology的机器只能运行这个特定的topology,也就是说这些topology的运行环境是相互独立的。

    这三个调度器是用clojure写的,先忽略掉,等待后面分析源码部分再写。

    先来举一个实际例子,看一下storm的调度过程,相信大家一看都能明白。

    【场景】假设当前集群中有6台机器,每台机器上可用端口均为6700、6701、6702、6703,并且当前急群中没有正在运行的topology,初始状态如如所示:

    下表是我们依次要提交的3个topology:

    Topology Worker数目 Executor数目 Task数目
    T-1 3 8 16
    T-2 5 10 10
    T-3 8 16 16

    正常情况下,EvenScheduler和DefaultScheduler的调度结果是一致的,这两个可以放在一起。看看会经过如下阶段:

    1、提交T-1

    • 可用的slot列表经过sort-slots方法处理后的结果是:{[S1,6700][S2,6700][S3,6700][S4,6700][S5,6700][S6,6700][S1,6701][S2,6701][S3,6701][S4,6701][S5,6701][S6,6701][S1,6702][S2,6702][S3,6702][S4,6702][S5,6702][S6,6702][S1,6703][S2,6703][S3,6703][S4,6703][S5,6703][S6,6703]}
    • compute-executors方法计算完后得到的Executor列表为:{[1,2][3,4][5,6][7,8][9,10][11,12][13,14][15,16]}(假设TaskList为自然序数)
    • 8个Executor在3个Worker上分布的情况是[3,3,2]
    • 分配结果如下:
    1. {[1,2][3,4][5,6]} ->[S1,6700]
    2. {[7,8][9,10][11,12]} ->[S2,6700]
    3. {[13,14][15,16]} ->[S3,6700]

    此时,集群中的任务分配情况为:

    2、提交T-2

    • 可用的slot列表经过sort-slots方法处理后的结果是:{[S1,6701][S2,6701][S3,6701][S4,6700][S5,6700][S6,6700][S4,6701][S5,6701][S6,6701][S1,6702][S2,6702][S3,6702][S4,6702][S5,6702][S6,6702][S1,6703][S2,6703][S3,6703][S4,6703][S5,6703][S6,6703]}
    • compute-executors方法计算完后得到的Executor列表为:{[1,1][2,2][3,3][4,4][5,5][6,6][7,7][8,8][9,9][10,10]}
    • 10个Executor在5个Worker上的分布情况是[2,2,2,2,2]
    • 分配结果如下:
    1. {[1,1][2,2]} ->[S1,6701]
    2. {[3,3][4,4]} ->[S2,6701]
    3. {[5,5][6,6]} ->[S3,6701]
    4. {[7,7][8,8]} ->[S4,6700]
    5. {[9,9][10,10]} ->[S5,6700]

    此时集群中的任务分配情况如下:

    3、提交T-3

    • 可用的slot列表经过sort-slots方法处理后的结果是:{[S1,6702][S2,6702][S3,6702][S4,6701][S5,6701][S6,6700][S1,6703][S2,6703][S3,6703][S4,6702][S5,6702][S6,6701][S4,6703][S5,6703][S6,6702][S6,6703]}
    • compute-executors方法计算完后得到的Executor列表为:{[1,1][2,2][3,3][4,4][5,5][6,6][7,7][8,8][9,9][10,10][11,11][12,12][13,13][14,14][15,15][16,16]}
  • 相关阅读:
    Computer Networking: Computer networks and the Internet
    编译pqxx源码configure时遇到codecs.py LookupError的解决方法
    DBMS-存储和文件结构
    DBMS-关系数据库的设计:范式、函数依赖、分解算法、多值依赖
    WebPack填坑笔记
    VsCode常用快捷键
    用户 在地址栏输入网址 经历了那些
    正向代理和反向代理
    检测浏览器(BOM)以及地址栏网址的API
    js变量按照存储方式区分,有哪些类型,并表述其特点
  • 原文地址:https://www.cnblogs.com/zengdan-develpoer/p/4638152.html
Copyright © 2020-2023  润新知