这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:大数据技术●降龙十八掌
一、 Storm简介
1、 介绍
Storm是一个分布式的实时计算系统,用来可靠地处理持续不断的数据流。
Storm可以应用到很多场景中,包括实时分析、在线机器学习、连续计算等。
Strom的处理速度非常快,而且是可伸缩、容错的系统,并且可以保证每一条数据被妥善处理。
2、 Storm框架核心
Storm框架的核心由7个部分组成:
(1) Topology
一个Topology是一个有向无环图,每个节点包含处理逻辑,节点之间的链接显示的是数据应该如何在节点之间传递。
(2) Stream
流是Storm的核心抽象,一个流是一个无界的持续的Tuple格式数据序列,在Topology中有向无环流淌。
(3) Spout
Spout是Topology的数据来源,Spout从外部读取数据,转换为Tuple,提交到Topology中进行计算。Spount可以有多个输出。
(4) Bolt
Topology中所有的处理都在Bolt中完成,Bolt可以进行过滤、业务处理、连接运算、连接、访问数据库等操作。Bolt也可以有多个输出。
(5) Stream Grouping (流分组)
Stream Grouping是定义在Bolt任务中应该如何分区。Storm有七个内置的流分组方式:
- Shuffle Grouping(随机分组)
- Fields Grouping(字段分组)
- All Grouping(全部分组)
- Global Grouping(全局分组)
- None Grouping(无分组)
- Direct Grouping(直接分组)
- Local or Shuffle Grouping(本地或者随机分组)
(6) Task
在一个线程上执行的一次Spout或者Bolt是一次Task,每个Spout或者Bolt在集群上对应很多Task,一个线程也可以顺序地执行很多Task,但是一个线程同时执行执行一个Task。
(7) Worker
3、 Storm的优势
(1) 集成了多种技术
Storm集成了多种消息队列和数据库。消息队列有:RabbitMQ/AMQP、Kafka、Kestrel、JMS。
(2) 简单的API
Storm中只有三个抽象类型:Spout、Bolt、Topology。
Storm有一个本地模式,用户可以在进程里模拟一个Storm集群进行测试。
(3) 可扩展
Topology是并行计算的,Topology的不同部分都可以指定并行度。
(4) 容错性好
当Worker死亡,Storm会自动在其他节点上重启他们。Storm的守护进程Nimbus和Supervisor被设计为无状态和快速失败的,所以当他们死亡时可以会重启。
(5) 保证数据被成功处理
Storm能保证每一个Tuple都能被完全处理,怎么处理由用户代码控制。如果中间失败了,Storm负责从消息源重新处理消息。
(6) 可以使用任何语言
Storm的核心是定义和提交一个Topology的Thrift定义,而Thrift可以用任何语言。
(7) 部署和操作简答
集群易于部署,仅需要少量的安装和配置就可以部署完毕
(8) 代码开源
二、 Storm基本知识
1、 基本概念
(1) Tuple
Tuple是Storm中消息传递的基本单元,是一个命名的值列表。也可以理解为是一种数据表达格式。
举例:[“id”:1,”name”:”zhangsan”,”isdel”:true]
Storm中的Tuple中支持所有的基本类型、字符串、字节数组作为字段值。
Topology中的每个节点必须声明emit的元组输出字段名称。
(2) Stream
Stream是Storm的核心抽象,是一个无界的元组序列,源源不断传递元组组成了流,在分布式环境中并行地进行创建和处理。
(3) Topology
Topology是Storm中运行的一个实时应用程序,这个应用程序由Spout和Bolt形成的节点和Stream流形成的边组成了逻辑上的拓扑结构。
(4) Spout
Spout是Topology中流的来源,是一个Topology中产生数据流的组件,Spout从外部读取数据,转为为Tuple,交予Topology中其他的Bolt进行处理。
Spout分为可靠的和不可靠的,可靠的Spout是当Storm处理Tuple失败后能够重新发射数据,进行再次处理,而不可靠的Spout一次发射后就会丢掉Tuple,不能重新发射Tuple。
Spout是主动去读取数据的,它有一个nextTuple方法,Storm框架会不停地调用这个方法,用户只要在这个方法中生成数据就可以了。
(5) Bolt
Bolt是Topology中进行业务逻辑处理的节点,Bolt可以完成过滤、业务处理、连接、访问数据库等操作。
Bolt是一个被动的角色,在Bolt接收到消息后就会调用它的execute()方法,用户可以在execute()中写自己的业务逻辑代码。
(6) Nimbus
Nimbus是Storm集群中主控节点上运行的守护进程,负责在集群中分发代码,进行任务分配,监视故障。
(7) Supervisor
Supervisor是Storm集群中工作节点上运行的守护进程,接收Nimbus上分配的任务,启动和停止Nimbus已经分配的任务。
(8) Stream Grouping
流分组定义了流如何在Bolt的任务之间进行分发。
(9) Worker
Worker是一个运行Topology的进程。
(10) Task
线程上运行一个Spout/Bolt就是一个Task。一个线程可以顺序执行多个Spout/Blot,但同一时间一个线程只能运行一个Task。
(11) Executor
一个线程是一个Executor。
2、 并行
(1) 两种并行
Storm有两个层次的并行:Worker层次的进程并行、executor线程的并行。
-
指定Worker并发数
-
topologyConf.setNumWorkers(2);
这个是指定Topology任务由两个进程执行。
指定executor并发数
-
builder.setBolt(SPLITBOLT_ID, new MySplitBolt(),3).shuffleGrouping(SPOUT_ID);
这个是配置Bolt由三个线程执行。
builder.setBolt(SPLITBOLT_ID, new MySplitBolt(),3).setNumTasks(12).shuffleGrouping(SPOUT_ID);
这个是指Bolt由三个线程执行12个Bolt任务,也就是每个线程顺序地执行4个Task
(2) 并行再平衡
Storm有个很好的特性是可以增加或者减少Worker、Executor的数量而不用重新启动集群或者Topology,这样的行为成为再平衡。
有两种方式可以实现Topology再平衡:
- 使用Storm Web UI。
- 使用CLI工具
举例说明用CLI再平衡:
$ storm rebalance mytopology –n 5 –e myspout=3 –e mybolt=10
这个是用命令修改mytopology这个Topology使用5个Worker进程,myspout 这个Spout节点使用3个Executor,mybolt这个Bolt节点使用10个Executor。
3、 消息可靠性保障机制
Storm能保证每个来自于Spout的消息都被完全处理。
(1) 完全处理的含义
Spout产生的Tuple消息传递给后面的Bolt,然后Bolt再传递后面的Bolt,当所有的Bolt的都成功处理了Tuple消息,Storm就认为是已经完全处理了。 当消息在指定时间内没有处理完毕,则认为是处理失败。
(2) 实现
Storm保证每一个Tuple将被Topology完全地可靠处理,它可以跟踪每一个Tuple。实现过程是,在Bolt成功处理后,调用ack()方法通知Storm已经成功处理,否则Storm认为Tuple没有被成功处理,当所有的Bolt都报告成功后,Storm才认为这个Tuple被成功处理,这样就实现了对每一个Tuple的可靠处理。