Storm——高性能流式计算处理框架

Storm

简介

  • Storm是实时的具备高容错的分布式流处理计算框架
  • 特点:storm常驻内存,在内存中处理

与MR对比

  • MR分钟级别响应,storm毫秒级
  • MR间歇性启停,storm一直运行
  • MR数据走磁盘,storm数据走内存,而且使用零拷贝技术

架构

Storm

  • Nimbus
    • 负责客户端请求的提交,通过zookeeper与supervisor通信
  • Supervisor
    • 负责worker的启动
  • Worker
    • 负责具体的计算工作
  • topology
    • 客户端提交的任务的拓扑模型

YARN/MR

  • ResourceManager
  • Nodemanager
  • AppMaster
  • Job

编程模型

Strom

  • Topology
    • 任务拓扑模型
  • spout
    • 流的输入
    • nextTuple() 最核心方法,每一个spout的业务逻辑
    • open()初始化方法
    • declareOutput()声明方法
  • bolt
    • spout或bolt互相连接,进行具体的计算
    • execute()最核心方法,bolt的业务逻辑
    • prepare()
    • declareOutput()

MR

  • map
  • reduce

计算模型

DAG有向无环图

  • 即,由一系列通过数据流相互关联的Spout、Bolt所组成的拓扑结构
  • 生命周期:此拓扑只要启动就会一直在集群中运行,直到手动将其kill,否则不会终止

Tuple

  • Stream中最小数据组成单元

Stream

  • 数据流,从spout源源不断流入数据,在spout与bolt之间的数据通道
  • 每个Stream需要声明一个ID

Spout

  • 数据源
  • 可同时发送多个数据流

Bolt

  • 数据流处理组件
  • 可同时接收多个spout或bolt的数据流

分组策略

  • shuffle随机分组
    • 随机均匀分组,保证每个bolt task得到的tuple数目大致相同
  • fields分组
    • 按某个字段分组
  • all
    • 广播,向所有bolts发送tuple
  • global
    • 向最小task id的task发送tuple
  • none
    • 与shuffle相同
  • direct
    • 指向型分组
  • local or shuffle
    • 同进程下优先,否则同shuffle

并发机制

Worker – 进程

  • 一个Topology拓扑会包含一个或多个Worker
  • 设置Worker进程数
    • Config.setNumWorkers(int workers)

Executor – 线程

  • 设置Executor线程数
    • parallelism_hint
  • Executor是由Worker进程中生成的一个线程

Task

  • 实际执行数据处理的最小单元
  • 每个task即为一个spout或者bolt

Rebalance – 再平衡

  • Storm CLI
    • storm rebalance mytopology -n 设置worker数量 -e 设置executor数量

通信机制

使用netty通信框架

零拷贝技术

worker内部通信

  • 监听端口6700,6701,6702…
  • worker内部有接收队列和发送队列,做数据缓存

容错机制

  • nimbus挂掉,不影响supervisor的重启worker进程,无法提交新的任务
  • supervisor挂掉,不影响worker正常工作,但是worker挂掉时无法重启本节点上的worker
  • 部分worker挂掉,不影响工作,会由supervisor重启,并把任务分发给其他worker

ack机制

消息的完整性

​ 从Spout中发出的Tuple,以及基于他所产生Tuple,由这些消息就构成了一棵tuple树,当这棵tuple树发送完成,并且树当中每一条消息都被正确处理,就表明spout发送消息被“完整处理”,即消息的完整性

spout端

  • 若回应消息完整,调用ack方法,否则调用fail方法

bolt端

  • 若业务逻辑处理完成,为了回应给spout端消息完整,调用collector的ack(input)

  • 若业务逻辑出现问题,为了回应给spout端消息不完整,调用collector的fail(input)

  • ack机制属于at least,至少一次

  • 当尾端并发数多时,某一个业务处理未完成,其他业务处理完成时发生数据重复读取现象

DRPC

  • 分布式远程过程调用
  • DRPC通过一个分布式服务端实现RPC功能
  • DRPC Server 负责接收 RPC 请求,并将该请求发送到 Storm中运行的 Topology,
    等待接收 Topology 发送的处理结果,并将该结果返回给发送请求的客户端。
  • 客户端通过向 DRPC 服务器发送待执行函数的名称以及该函数的参数来获取处理结果。实现该函数的拓扑使用一个DRPCSpout 从 DRPC 服务器中接收一个函数调用流。 DRPC 服务器会为每个函数调用都标记了一个唯一的 id。随后拓扑会执行函数来计算结果,并在拓扑的最后使用一个名为 ReturnResults 的 bolt 连接到 DRPC 服务器,根据函数调用的 id 来将函数调用的结果返回。

定义DRPC拓扑

  • LinearDRPCTopologyBuilder
    • 直接用TopologyBuilder,需要手动设定好开始的DRPCSpout以及结束的ReturnResults

版权声明:本文为Infinity_TP原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。