从零开始学Storm
学习自apache_storm_tutorial
Storm简介
什么是Storm
Storm是一个免费开源的分布式实时计算
系统,主要使用Clojure与Java语言编写。
Storm设计用于在容错和水平可扩展方法中处理大量数据。它是一个流数据框架,具有最高的摄取率。
Apache Storm vs Hadoop
基本上Storm和Hadoop都是用于分析大数据。在某些方面有所不同,两者互补。
Storm的优势在于实时计算,而Hadoop在批量处理上更有优势。
Strom核心概念
核心概念
Storm从一端读取实时数据的原始流,通过一系列有序的
的小处理单元传递,并在另一端输出 已处理/有用的 数据。
下图描述了Apache Storm的核心概念。
根据下面图表进一步认识上述组件:
Spout:也被形象的称为水龙头(数据源)。
Bolt: 也被形象称为转接头(数据处理单元).
示例:“Twitter Analysis
拓扑(Topology)
拓扑(Topology)是Storm中运行的一个实时应用程序,因为各个组件间的消息流动而形成逻辑上的拓扑结构。一个拓扑就是一个有向图的计算。
要使用Storm做实时计算,首先需要创建拓扑。可以通过把实时应用程序的运行逻辑打成jar包后提交到Storm的拓扑。
工作进程(Worker)
Worker是Spout和Bolt中运行具体处理逻辑的进程。拓扑跨一个或多个Worker进程执行。Storm尝试在所有的Worker上均匀的分布任务。
执行线程(Executor)
在Strom0.8之后,Task不再与物理线程对应,同一个Spout或Bolt的Task可能会共享一个物理线程,这个线程称之为Executor
。 运行期间可修改,rebalance.
Storm术语
“并行度(parallelism)”
专门用于描述所谓的并行度暗示,表示一个组件的执行器(线程)的初始数量
。
任务(Task)
简单来说,任务是每一个Spouts或Bolts的实例,它将由执行线程(executor)
执行处理。运行期间不可修改.
流分组(Stream grouping)
流分组,是拓扑定义中的一部分,为每个Bolt指定应该接收哪个流作为输入。流分组定义了流/元组如何在Bolt的任务之间进行分发。常用流分组有:
随机分组(Shuffle Grouping)
:是最常用的流分组方式,它随机分发元组到Bolt上的任务,这样能保证每个任务得到相同的元组。字段分组(Fileds Grouping)
:根据指定字段对流进行分组。指定字段值相同的元组由同一个
Bolt处理。广播分组(All Grouping)
:流被发送到所有的Bolt任务中。每一个Bolt都会收到一个元组的副本。全局分组(Global Grouping)
: 是指全部流都发送到Bolt的同一个任务中(具有最小值task_id的bolt(汇集
))。无分组
:即不关心如何分组,这种方式和随机分组是一样的效果,有点不同的是Strom会把这个Bolt放到Bolt订阅者的同一个线程中执行
直接分组(Direct Grouping)
:一种特殊的分组。这种方式意味着元组的生产者决定元组消费者的接收元组任务。直接分组只能在已经声明为直接流(Direct Stream)中使用自定义分组
:必须实现CustomStreamGrouping,Serializable接口
集群架构
Storm的一大亮点是:它是一个容错,快速,没有“单点故障”(SPOF)分布式应用程序。我们可以根据需要在多个系统中安装Apache Storm,以增加应用程序的容量。
下图描述了集群设计。
Apache Storm有两种类型的节点,
-
主控节点(Master Node)
-
主控节点只有一个。
-
主控节点运行在一个称为
Nimbus
的守护进程。 -
Nimbus的主要工作是运行Storm拓扑、分析拓扑并收集要执行的任务。然后,它将任务分配给可用的supervisor。
-
工作节点(Worker Node)
-
工作节点有多个。
-
每个工作节点工作运行在一个称为
Supervisor
的守护进程。 -
Supervisor将任务委派给工作进程。
ZooKeeper
Nimbus是无状态的,所以它依赖于ZooKeeper来监视工作节点的状态。ZooKeeper的帮助Supervisor与Nimbus交互。它负责维持Nimbus,Supervisor的状态。