ITPub博客

首页 > 大数据 > Storm > 好程序员大数据学习笔记:Storm架构

好程序员大数据学习笔记:Storm架构

原创 Storm 作者:好程序员IT 时间:2019-06-11 16:40:47 0 删除 编辑

  好程序员分享大数据学习笔记: Storm 架构 Storm 架构 :master/slave

 

  主节点 :Nimbus

 

  负责在集群上进行任务 (Topology) 的分发与资源的调度以及监控

 

  工作节点 :Supervisor

 

  接收到任务请求后,启动一个或多个 Worker 进程来处理任务 ; 默认情况下,一个 Supervisor 最多启动 4 Worker

 

  工作进程 :Worker

 

  在 Supervisor 中的子进程,存在着若干个 Spout Bolt 线程,来负责 Spout Bolt 组件处理任务 ( 实际是开启的 executor 线程 )

 

  作业 :Topologies( 死循环,不会结束 )

 

  Spout: 获取数据的组件

 

  Bolt: 处理数据的组件

 

  Stream:Spout Bolt 之间数据流动的通道

 

  Tuple:

 

  1)Stream 的最小组成单位, Spout Bolt 发送一次数据叫一个 Tuple

 

  2) 同一个 Stream Tuple 的类型相同,不同的 Stream 中可能相同 / 不同

 

  3) 一个 key-value 形式的 Map

 

  数据流分发策略 (Stream groupings):

 

  解决 Spout Bolt 之间数据传输 ( 发送 Tuple 元组 ) 的问题

 

  1)shuffleGrouping:

 

  随机派发 Stream 中的 Tuple Bolt

 

  2)fieldsGrouping:

 

  根据字段的哈希值与 Bolt 个数进行取模操作然后进行分组发送,一个节点是一个 Worker , 一个 Bolt 是一个 task , 全部节点的 Spout Bolt 的个数叫并发度。

 

  Storm 并发度设置 :

 

  1.Worker 并发度 :

 

  首先按照集群规模和集群的物理位置来设定

 

  一般会把 Worker 均分到每一个节点里, 一个 supervisor 默认设置一个 Worker

 

  2.Spout 数量设定 :

 

  Spout 总数默认等于 Kafka( 消息中间件 ) 对应 Topic 的分区数,提高吞吐速度

 

  一般一个 Worker 设置一个 Spout

 

  3.Bolt1 数量设定 :

 

  首先根据数据量和处理数据的时间来设定

 

  一般情况下, Bolt1 的数量是 Spout 数量的 2 ( 根据项目进行修改 )

 

  4.Bolt2 数量设定 :

 

  首先根据数据量和处理数据的时间来设定,因为 Bolt1 传过来的中间结果数据已经减少很多, Bolt2 的数量可以酌情减少。

 

  容错机制 : 异或方式 < 相同为 ,不同为 1>

 

  tupleId - 产生新数据,会产生一个 tupleId;

 

  整个过程中的 tupleId 按顺序两两异或到最后

 

  若结果为 ,则数据正确,否则错误

 

  messageId - 代表整条信息, API 中指定提供给程序员, long

 

  rootId - 代表某条信息,提供给 storm 框架

 

  出现数据运算失败的两种情况 :

 

  execute(){

 

  1. 异常 ( 数据异常 )

 

  2. 任务运行超时 -- 认为处理失败

 

  }

 

  因为数据发送时导致的数据重复发送问题, 如何解决 ?

 

  Ⅰ .

 

  1. 比如对订单信息做处理, 处理成功后, 把订单信息 ID 存储到 Redis(set)

 

  2. 信息发送时, 判断是否处理过此信息

 

  execute(){

 

  if()

 

  else()

 

  }

 

  Ⅱ .

 

  不作处理 : 点击流日日志分析 : pv uv

 

  指标分析 : 订单人数, 订单金额

 

  消息的可靠性保障和 acker 机制 : open / nextTuple / ack / fail/ close

 

  Ⅰ .Spout :

 

  在发送 tuple 时, Spout 会提供一个 msgId ,用于在后续识别 tuple;Storm 会根据 msgId 跟踪创建的 tuple 树,直到某个 tuple 被完整处理,根据 msgId 调用最初发送 tuple Spout ack() 方法,检测到超时就调用 fail() 方法 -- 这两个方法的调用必须由最初创建这个 tuple Spout 执行 ; Spout 从消息队列 (Kafka/RocketMQ) 中取出一条数据时,实际上没有被取出,而是保持一个挂起状态,等待消息完成的信号,挂起状态的信息不会被发送到其它的消费者 ; 当该消息被 " 取出 " 时,队列会将消息体数据和一个唯一的 msgId 提供给客户端,当 Spout ack()/fail() 方法被调用时, Spout 根据发送的 id 向队列请求将消息从队列中移除 / 重新放入队列。

 

  Ⅱ .acker 任务 :

 

  高效的实现可靠性 -- 必须显式的在 Bolt 中调用定义在 Spout 中的 ack() fail() 方法, Storm 拓扑有一些特殊的称为 "acker" 的任务,负责跟踪 Spout 发送的 tuple DAG ,当一个 acker 发现 DAG 结束后,它就会给创建 Spout tuple Spout 任务发送一条消息,让这个任务来应答这个消息。 acker 并不会直接的跟踪 tuple 树,在 acker 树中存储了一个表,用于将 Spout tuple id 与一对值相映射, id 为创建这个 tuple 的任务 id ,第二个值为一个 64bit 的数字 (ack val) ,这个值是这棵树中所有被创建的或者被应答的 tuple tuple id 进行异或运算的结果值。

 

  Ⅲ . 移除可靠性 :

 

  1. Config.TOPOLOGY_ACKERS 设置为

 

  2. SpoutOutputCollector.emit 方法中省略消息 id 来关闭 spout tuple 的跟踪功能

 

  3. 在发送 tuple 的时候选择发送“非锚定”的 (unanchored)tuple

 

  各位大数据爱好者,虽然现在学习之路很辛苦,前方的道路还有很多攻坚战要打,希望大家这段时间沉下心来,不管有多累,都要向着前方,不断的奔跑 !


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69913892/viewspace-2647193/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
欢迎关注公众号:好程序员特训营 web前端教程分享 723729549 大数据教程分享 703503210

注册时间:2019-03-20

  • 博文量
    233
  • 访问量
    181972