1. 什么是Storm?

较官方的解释 :
storm是一种用于事件流处理的分布式计算框架,它是有BackType公司开发的一个项目,于2014年9月加入了Apahche孵化器计划并成为其旗下的顶级项目之一。Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm用于实时处理,就好比 Hadoop 用于批处理。Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。

普通解释:
Storm是一个分布式、可靠、容错的实时流式计算系统。用于对大规模流式数据提供实时处理。

2.Storm的优势

  1. 简单的编程模型。类似于MR降低了并行批处理复杂性,Storm降低了进行实时处理的复杂性
  2. 服务化。一个服务框架,支持热部署,即时上线或下线APP,可以用各种编程语言,Java、R、Python
  3. 容错性。Storm会管理工作进程和节点的故障
  4. 水平扩展。计算是在多个线程、进程和服务器之间并行进行的
  5. 可靠的消息处理。Storm保证每个消息至少能得到一次完整处理。任务失败时,会负责从消息源重试消息
  6. 快速。系统的设计保证了消息能得到快速的处理
  7. 本地模式。Storm有一个本地模式,可以在处理时完全模拟Storm集群,这可以快速进行开发和单元测试
附 :Spark Streaming与Storm的优缺点分析
Storm是纯实时的
Storm的事务机制、健壮性、容错性、动态调整并行度特性,都要比Spark Streaming更加的优秀

Spark Streaming是准实时的
SparkStream, 有一点是Storm绝对比不上的,就是:它位于Spark生态技术中,因此Spark Streaming可以和Spark Core、Spark SQL无缝集合,也就意味这,我们可以对实时处理出来的数据,立刻进行程序中无缝的延迟批处理,交互式查询等条件操作
附 :Storm的可靠性原因:

1.分布式框架
2.配置HA高可用
3.Storm的容灾能力
4.ACK确认机制

3. Storm应用场景

主要应用于以下几种场景:

实时分析:如实时日志处理、交通流量分析等。

实时统计:如网站的实时访问统计、排序等。

实时推荐:如实时广告定位、事件营销等。

适用场景比较:

storm概述 stormem_实时处理

与离线系统集成

storm概述 stormem_storm概述_02

4.系统架构

storm概述 stormem_storm_03

相关组件概念:

Topology:Storm中运行的一个实时应用程序。
Nimbus:负责资源分配和任务调度。
Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。
Worker:运行具体处理组件逻辑的进程。

Spout:在一个topology中产生源数据流的组件,通常情况下回从外部数据源中读取数据。是一个主动的角色
Bolt:在一个topology中接受数据然后执行处理的组件。可以执行过滤、函数操作、合并、写数据库等操作。是一个被动角色。
Task:worker中每一个spout/bolt的线程称为一个task。
Streams/Tuple:一次消息传递的基本单元,一组KeyValue对;Streams是无限的Tuple序列。
Storm group定义了一个流在bolt任务间该如何被切分。有随机分组、字段分组、全部分组、全局分组、无分组、直接分组。

拓扑(Topology)介绍:

storm概述 stormem_hadoop_04

Worker介绍:

Worker:一个Worker是一个JVM进程,所有的Topology都是在一个或者多个Worker中运行的。Worker启动后是长期运行的,除非人工停止。Worker进程的个数取决于Topology的设置,且无设置上限,具体可获得调度并启动的Worker个数则取决于Supervisor配置的slot个数。

Executor:在一个单独的Worker进程中会运行一个或多个Executor线程。每个Executor只能运行Spout或者Bolt中的一个或多个task实例。

Task:是最终完成数据处理的实体单元。

关系图:

storm概述 stormem_storm_05

Task介绍:

storm概述 stormem_storm_06

5.Storm编程模型

消息分发策略(Stream Grouping)

这里只作简单介绍:
所谓的分组策略就是在Spout与Bolt、Bolt与Bolt之间传递Tuple的方式。 stream grouping用来定义一个stream应该如何分配给Bolts上面的多个Executors(多线程、多并发)。

Stream Grouping的类型:

storm概述 stormem_Streaming_07

Storm提供接口:
REST 接口
REST(Representational State Transfer)表述性状态转移接口。

Thrift接口
由Nimbus提供。Thrift 是一个基于静态代码生成的跨语言的RPC协议栈 实现,它可以生成包括C++, Java, Python, Ruby, PHP 等主流语言的代码,这些代码实现了 RPC 的协议层和传输层功能,从而让用户可以集中精力于服务的调用和实现。

Nimbus HA

storm概述 stormem_Streaming_08

容灾能力

storm概述 stormem_storm概述_09

消息可靠性

storm概述 stormem_实时处理_10

可靠性级别设置
如果并不要求每个消息必须被处理(允许在处理过程中丢失一些信息),那么可以关闭消息的可靠处理机制,从而可以获取较好的性能。关闭消息的可靠处理机制意味着系统中的消息数会减半。

有三种方法可以关闭消息的可靠处理机制:
将参数Config.TOPOLOGY_ACKERS设置为0。
Spout发送一个消息时,使用不指定消息messageID的接口进行发送。
Bolt发送消息时使用Unanchor方式发送,使Tuple树不往下延伸,从而关闭派生消息的可靠性。

ACK机制

storm概述 stormem_实时处理_11