Club Blog

SEU LINUX Blog


  • Home
  • Archive
  • Tags
  •   

© 2018 SEU Linux Club

Theme Typography by Makito

Proudly published with Hexo

Storm简介

Posted at 2017-08-24 Storm 

Storm的历史

  • Storm是由Nathan Marz和他的团队在BackType创建的。BackType是一家帮助公司和品牌衡量社交媒体影响力的数据分析公司。
  • 后来BackType被Twitter公司收购之后,Storm被开源。
  • 在很短的时间内Storm就成为了分布式实时处理系统的标准。
  • Storm由Java和Clojure语言写成。

Storm是什么

​ Apache Storm 是一个分布式实时大数据处理系统。Storm是为使用具有容错性和横向可伸缩的方法处理大量的数据而设计。它是一个高摄取率的流式数据框架。虽然Storm是无状态的,但是它使用Apache ZooKeeper来管理分布式环境和团簇状态。它简单易用,可以并行的对实时数据做各种操作。

​ Apache Storm仍然是实时数据处理的领导者。Storm易于部署、操作,并且它可以保证每一个信息至少通过拓扑结构处理一次。

Apache Storm vs Hadoop

​ 总体上讲Storm和Hadoop都是用来处理大数据的框架。它们互为补充,在某一些方面不同。Storm不具有持续性,而Hadoop没有实时处理能力。

Storm Hadoop
实时流处理 批处理
无状态 有状态
基于ZooKeeper协调的主从结构。主节点称为雨云(Nimbus),从节点称为监督者(Supervisor) 无论是否使用ZooKeeper都为主从结构。主节点称为作业追踪器(Job tracker),从节点称为任务追踪器(Task tracker)
在一个簇中,一个Storm流过程每秒可以访问上万条信息。 Hadoop分布式文件系统(HDFS)使用映射规约(MapReduce)框架,用几分钟或几小时处理大量数据。
Storm拓扑会一直执行直到用户关闭或者出现了不可恢复的异常。 映射规约任务顺序执行,最终结束。
分布式、具有容错性 分布式、具有容错性
如果主/从节点挂掉,重启之后会继续原来的工作,不会有任何影响。 主节点挂掉会丢失所有执行中的任务。

Apache Storm 的用例

  • Twitter:Twitter使用Storm来做发布者分析。发布者分析处理每一个用户动态和Twitter平台的点击数。
  • NaviSite:NaviSite使用Storm作为日志监视系统。系统生成的每一条日志都会经过Storm,由Storm来检查这条信息是否被特定的正则表达式匹配。如果可以匹配,这条信息就会存入数据库。
  • Wego:Wego是一个旅行数据搜索引擎,它使用Storm来搜索实时的旅游数据并反馈给用户最佳匹配结果。

Storm的优势

  1. Storm开源、健壮、对用户友好。
  2. Storm具有容错性、灵活性、可靠性,并且支持各种编程语言。
  3. 实时流处理。
  4. 快速。
  5. 高度可定制。
  6. 低延迟。
  7. 智能运行。
  8. 即使团簇中相连的节点挂掉或者信息丢失也不会影响数据的处理。

Apache Storm 的核心概念

​ Apache Storm 从一端读取未经处理的实时数据流,然后让这些数据通过一系列小的处理单元,最后向另一端输出处理过的信息。

组件 描述
Tuple元组 元组是Storm的主要数据结构,它是一个有顺序的元素列表。元组默认支持所有数据类型。一般来说元组是以逗号分隔的值的集合。
Stream流 流是一系列无序的元组。
Spout龙卷 龙卷是流的源头。Storm可以接受Twitter Streaming API, Apache Kafka queue, Kestrel queue等等未经处理的数据源的输入数据,也可以自己写一个龙卷来从数据源读取数据。”ISpout”是实现龙卷的核心接口,还有一些具体的接口,比如IRichSpout, BaseRichSpout, KafkaSpout等等。
Bolts 闪电 闪电是逻辑处理单元。龙卷将数据传给闪电,闪电处理并产生新的输出流。闪电和数据源、数据库一起可以做过滤,聚合,连接,交互操作。闪电会获取数据并将数据传给一个或多个闪电。”IBolt”是实现闪电的核心接口,还有一些常用的接口,比如IRichBolt, IBasicBolt等等。

实例:Twitter Analysis

​ Twitter Analysis的输入数据来自Twitter Streaming API。龙卷会使用Twitter Streaming API来读取用户的”Tweets”,然后输出元组流。龙卷输出的一个元组里包含一个Twitter用户名和一条Tweet,用逗号分隔。之后,这个元组流会被送到闪电那里去,闪电会将每一条Tweet分词、计算词数并且将这些信息保存到指定的数据源中,之后我们可以查询数据源来获得结果。

Topology 拓扑结构

​ 龙卷和闪电相连形成拓扑结构。实时应用的逻辑在Storm的拓扑结构中指定。简单来说,拓扑结构是一个有向图,图的节点指代计算,图的边代表数据流。

​ 一个简单的拓扑结构一般从龙卷开始,龙卷将数据提交给一个或多个闪电。闪电代表的是拓扑结构中拥有最小处理逻辑的节点。每一个闪电的输出结果都可以作为另一个闪电的输入数据。

​ Storm会保持拓扑结构的运行,直到手动关闭这个拓扑。

Tasks 任务

​ 现在我们已经了解了龙卷和闪电的基本概念,他们是拓扑结构的最小逻辑单元,拓扑结构由一个龙卷和一组闪电构成。为了正确执行拓扑,这一个龙卷和一组闪电必须按照一个指定的顺序执行。

​ Storm中所有的龙卷和闪电的执行称为任务。简单来说,一个任务要么是龙卷的执行,要么是闪电的执行。在给定的时间里,每一个龙卷和每一个闪电都可以有多个实例运行在多个不同的线程中。

Workers 工人

​ 拓扑是分布式运行在多个工人节点上的。Storm 将任务平均地分给所有的工人节点。工人节点的责任是监听是否有工作到来,并且当新工作到来时开始或停止进程。

Stream Grouping 流分组

​ 数据流从龙卷流向闪电,或者从一个闪电流向另一个闪电。流分组控制拓扑中元组的走向,帮助我们理解拓扑中的元组流。以下介绍四种内置的分组方式。

Shuffle Grouping 随机分组

​ 在随机分组中,等量的元组随机分配给所有执行闪电的工人。

Field Grouping 字段分组

​ 字段中具有相同值的元组被分成一组,传给同一个工人。

Global Grouping 全局分组

​ 所有的流被分为一组发送给一个闪电。这种分组策略将数据源的所有实例生成的所有元组发送给一个目标实例,特指ID最低的工人。

All Grouping 全分组

​ 全分组将每一个元组发给作为接收方的那个闪电的所有实例。这种分组方式被用来向闪电发送信号,还有利于合并操作。

Cluster Architecture 簇结构

​ Apache Storm的亮点之一就是它是一个高速、具有容错性、没有单点故障的分布式程序。我们可以任意地将Storm安装在大量的系统中来增加应用的容量。

​ 现在我们来看一下Apache Storm的簇是如何设计的。

  • Apache Storm 有两种类型的节点,雨云(主节点)和监督者(从节点)。
    • 雨云是Apache Storm 的核心组件,它的主要工作是运行Storm拓扑。雨云分析拓扑结构并且收集将要执行的任务,之后它将任务分配给一个空闲的监督者。
  • 监督者会包含一个或多个工人进程,它将任务分发给各个工人进程。工人进程会生成所需数目的执行者来执行任务。
  • Apache Storm使用一个内部的分布式消息系统,雨云和监督者之间交流更方便。
组件 描述
雨云Nimbus 雨云是Storm簇的主节点,簇中其他的节点都是worker nodes工人节点/从节点。雨云/主节点负责向所有的从节点分发数据、指定任务和监控错误。
监督者Supervisor 听从雨云指令的节点称为监督者/从节点,一个监督者包含一个或多个工人进程。监督者监督工人进程完成雨云指定的任务。
工人进程Worker Process 工人进程执行与特定拓扑相关的任务,但是它自身不执行任务,而是产生执行者,让执行者执行特定的任务。一个工作进程包含多个执行者。
执行者Executor 执行者是由工人进程产生的线程,它可以执行一个或者多个任务,但是它只为一个龙卷Spout或一个闪电Bolt服务。
任务Task 任务执行实际的数据处理,所以它是龙卷或者闪电。
ZooKeeper框架 Apache ZooKeeper是被簇用来协调节点、以健壮的同步机制管理共享数据的服务。雨云是无状态的,所以它依靠ZooKeeper来监控处于工作状态的节点的状态。ZooKeeper帮助监督者与雨云交互,负责维持雨云和监督者的状态。

​ Storm从设计之初就是无状态的,虽然无状态有它的缺点,但是它使得Storm能够以最优最快的方式处理实时数据。

​ 但是Storm也不是完全无状态的,它的状态存储在Apache ZooKeeper里。正因如此,一个挂掉的雨云可以从它挂的地方重新启动,继续工作。像monit这种监控雨云的程序可以在错误发生后重启雨云。

​ Apache Storm还有一种高级的拓扑叫做Trident Topology(三叉戟拓扑),它在提供处理大吞吐量数据的能力的同时,也提供了低延时分布式查询和有状态流式处理的能力。它还提供了高级的API,比如Pig。

Apache Storm 的工作流

​ 一个可以运行的Storm簇应该有一个雨云和至少一个监督者,此外还有一个重要的节点是Apache ZooKeeper,它用于雨云和监管者之间的协作。

​ 现在我们来仔细看一下Apache Storm的工作流

  1. 最开始,雨云会等待”Storm 拓扑”提交给它。
  2. 当有一个拓扑提交给雨云之后,雨云会处理这个拓扑、汇总所有将要执行的任务以及给出任务执行的顺序。
  3. 之后,雨云会将任务平均分配给所有可用的监督者。
  4. 每经过一个指定的时间间隔,所有的监督者都会向雨云发送一个”心跳”来证明它们运转正常。
    1. 如果有一个监督者挂了,没有向雨云发送”心跳”,那么雨云会将任务分配给另一个监督者。
    2. 如果雨云自己挂了,监督者们继续执行已经指定的任务,不受任何影响。
      1. 当所有的任务都完成之后,监督者们会等待新任务到来。
      2. 与此同时,雨云会自动被服务监控工具重新启动。
      3. 重新启动的雨云从它停止的地方继续。
    3. 事实上雨云和监督者都可以自动重启并且从原来的状态继续,因此Storm保证所有的任务至少被处理过一次。
  5. 当所有的拓扑都处理完毕,雨云会等待新拓扑,监督者会等待新任务。
  • 默认来说,Storm簇有两种模式:
  1. 本地模式Local Mode: 这个模式用于开发、测试和纠错,因为它是查看所有拓扑组件协同工作最简单的方法。在这个模式下,我们可以调整参数来查看我们的拓扑是如何运行在不同设定的Storm环境中的。在本地模式中,Storm会跑在本地机器上的一个Java虚拟机中。
  2. 生产模式Production Mode: 在这个模式下,我们将我们的拓扑提交给一个正在运行的Storm簇。这个Storm簇一般跑在不同的计算机上。正如前文所说,一个运行中的Storm簇会永远运行直到将它关闭。

安装 Apache Storm

  1. 安装Java
  2. 安装ZooKeeper框架
  3. 安装Apache Storm框架

安装Java

  1. sudo apt install python3-software-properties
  2. sudo add-apt-repository ppa:webupd8team/java
  3. sudo apt update
  4. sudo apt install oracle-java8-installer会同时自动安装oracle-java8-set-default
  5. java -version验证安装

安装ZooKeeper框架

  1. 从http://zookeeper.apache.org/releases.html下载最新版的ZooKeeper

  2. 解压缩

  3. 新建一个名为data的目录

  4. 编辑conf文件夹下的zoo_sample.cfg

    tickTime=2000
    dataDir=/path/to/zookeeper/data
    clientPort=2181

  5. 启动ZooKeeper服务器bin/zkServer.sh start

安装Apache Storm框架

  1. 从http://storm.apache.org/downloads.html下载1.1.0版本的Storm

  2. 解压缩

  3. 新建名为data的目录

  4. 编辑conf/storm.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > storm.zookeeper.servers:
    > - "localhost"
    > storm.local.dir: "/home/wang/Storm/apache-storm-1.1.0/data"
    > nimbus.host: "localhost"
    > supervisor.slots.ports:
    > - 6700
    > - 6701
    > - 6702
    > - 6703
    > nimbus.seeds: ["localhost"]
    >
  5. 启动nimbus、supervisor和ui

  6. localhost:8080查看Storm ui

Share 

 Previous post: 使用Docker和Cloud9搭建Web端IDE Next post: 概率论总结第五章 

© 2018 SEU Linux Club

Theme Typography by Makito

Proudly published with Hexo