Storm入门教程

1. Storm基础

Storm

Storm主要特点

Storm基本概念

Topologies

Streams

Spouts

Bolts

Stream groupings

Reliability

Tasks

Workers

Storm调度器

Storm配置

Guaranteeing Message Processing(消息处理保障机制)

Daemon Fault Tolerance(守护线程容错机制)

理解Storm拓扑的并行

Tutorial

Local模式

在生产环境中运行Topologies



Storm基本概念

Storm中的基本概念包括Topologies、Streams、Spouts、Bolts、Stream groupings、Reliability、Tasks、Workers。

Topologies

Storm中的一个topology代表一个实时应用程序的逻辑处理。Storm的Topology类似与MapReduce的Job。关键的差异是MapReduce的Job最后是要结束的,而Topology是持续运行的,除非你手动停掉。一个Topology就是一个用StreamGroupings连接的Spouts和Bolts的图表。

相关知识:

TopologyBuilder:在Java中使用这个类来构建Topologies;

在一个生产的集群上运行Topologies

本地模式:这里介绍如何在本地模式中开发和测试Topologies。

Streams

Stream是Storm中的主要抽象,一个Stream是一个无边界的数据单元序列,这些数据单元以并行的分布式的方式来创建和处理。在Stream的元组内,以命名域的模式来定义Stream。默认情况下,元组可以包含integer、long、short、byte、string、double、float、boolean,以及byte array等类型的数据。还可以定义自己的序列器,以便在元组中能够自然的使用自定义类型。

在声明的时候,每个Steam都要设定一个id。因为单一Stream的Spout和Bolt是非常常见的,所以OutputFieldsDeclarer有方便的方法来声明单一Stream而不需指定id,这种情况中,相应的Stream会被设定一个默认的id:”default”。

相关知识:

Tuple:Stream是由tuple构成的。

OutputFieldsDeclarer:用于声明Stream和它们的模式。

Serialization:有关Storm的动态tuple类型和自定义序列化的声明。

Spouts

在Topology中,Spout是流数据源。通常Spout会从外部资源中读取数据单元,并把这些数据单元放到Topology中(如Kestre队列或Twitter的API),Spout既可以是可靠的也是不可靠的。如果Storm处理失败,可靠的Spout会重复发送数据单元,而不可靠的Spout会丢弃已经发送过的数据单元。

Spout能够发送多个Stream。使用OutputFieldsDeclarer接口的declareStream方法就可以完成多个Stream的声明,并且把对应的Stream指定给发送数据单元时所使用的SpoutOutputCollector类的emit方法

Spout上的主要方法是nextTuple。它既可以把新的Tuple发送到Topology中,如果没有新的Tuple,直接返回 。对于任意的Spout的实现,nextTuple的非阻塞性是至关重要的,因此Storm会在同一个线程上调用所有的spout方法。

在Spout上的其他主要方法是ack和fail。当Storm检测到Spout的发送处理成功或失败时会调用这两个方法,ack和fail方法只对可靠Spout有效。

相关知识:

IRichSpout:Spout必须实现这个接口

消息处理的保障

Bolts

Topology中的所有处理都要在Bolt中完成。Bolt能够完成从过滤、聚合、连接、连接据库等任何处理。

Bolt能够完成简单的流处理,复杂的流的转换经常需要多个步骤和多个Bolt。例如,把一个twitter的流转换为一个趋势图片的流至少需要两个步骤:1.一个Bolt用来滚动统计每个图片的计数;2.一个或多个Bolt输出topN图片(可使用3个Bolt来做这个处理更具可扩展性)。

Bolt也能够发送多个Stream。使用OutputFieldsDeclarer接口的declareStream方法就可以完成多个Stream的声明,并且把对应的Stream指定给发送数据单元时所使用的SpoutOutputCollector类的emit方法

声明一个Bolt的输入流时,就要订阅另一个组件所指定的流。如果要订阅另一个组件的所有的流,就必须单独的订阅每个流。InputDeclarer有非常友好的语法用于订阅在默认的流id上声明的流。declarer.shuffleGrouping(“1”)订阅了组件”1”上的默认流,它等同于declarer.shuffleGrouping(“1”,DEFAULT_STREAM_ID)。

Bolt中的主要方法是execute方法,它需要一个新的Tuple(数据单元)作为输入。Bolt使用OutputCollector对象来发送新的Tuple,对于每个要处理的Tuple,Bolt都要调用OutputCollector上的ack方法,以便Storm知道Tuple处理完成的时机(这样最终可以判断它安全的应答了初始发送的Tuple)。对于处理输入Tuple的大多数场合,会基于这个输入的Tuple发送0或多个Tuple,然后再处理输入的Tuple,Storm提供了一个自动应答的IBasicBolt接口。

OutputCollector是线程安全的在任何时候都可以调用。

相关知识:

IRichBolt:这是Bolt的通用接口。

IBasicBolt:这是一个用于定义执行过滤或简单功能的Bolt的简单接口。

OutputCollector:Bolt使用这个类的一个实例把Tuple发送给输出流。

消息处理的保障.

Stream groupings

Topology定义的一部分就是要给每个Bolt指定要接收的输入流。数据流的分组定义了数据流应该如何分配到在Bolt的任务中。

在Storm中有8种内置的数据流分组,也可以通过实现CustomStreamGrouping接口来实现自定义流。

1. Shuffle groupings:这是一种把Tuple随机分配给Bolt任务的方法,这种方法保证每个Bolt获得相同数量的tuple。

2. Fields groupings:通过分组中的特定域来分割数据流。例如,如果对应的数据流时通过”user-id”来分组的,那么带有相同”user-id”的Tuple总会被分配到相同的任务中,而带有不同”user-id”的Tuple可以分配到不同的任务中。

3. Partial Key groupings:跟Fields groupings一样,通过分组中的特定域来分割数据流,但是在输入的数据发生正态偏离的时候,它会在两个下游的Bolt之间来进行负载均衡,从而能够比较好的利用资源。它的工作方式和优势请阅读“这里

4. All groupings:把对应的数据流分配给所有相关的Bolt的任务。谨慎用本方法。

5. Global groupings:整个流会被路由到一个单一的Bolt任务中,具体而言,它会被路由到id最小的任务中。

6. None groupings:指定这种分组就不用关心对应的数据流是如何分组的。当前,这种分组方式等同于Shuffle分组。不过最终Storm会把这种分组的数据流推到下游的Bolt来执行,这类似于订阅Bolt或Spout的线程。

7. Direct groupings:这是一种特殊类型的分组,这种分组意味着Tuple的生产者决定了接收这个Tuple的消费者任务。只能够在声明了定向流的数据流上声明定向分组。定向流必须使用emitDirect方法之一来发送。Bolt通过使用TopologyContext或OutputCollector中的emit方法(它会返回发送Tuple的任务id)的输出轨迹来获取消费者的任务id。

8. Local or shuffle groupings:如果在相同的工作进程中目标Bolt有多个任务,那么Tuple只会被分组到这些任务中,否则跟普通的随机分组一样。

相关知识:

TopologyBuilder:这个类用于定义Topology

InputDeclarer:调用TopologyBuilder类的setBolt()方法时会返回这个对象,并通过这个对象来声明Bolt的输入流和输入流的分组方式。

Reliability

Storm保证每个Spout的元组被Topology完全的处理。这种保证机制是通过每个Spout的元组所触发的元组树的轨迹并判断元组树被成功执行完成的时机来实现的。每个Topology都会关联一个”超时消息”,如果Storm在超时前不能检测到Spout的元组已经执行完成,那么就会断定该元组执行失败,随后会重复执行它。

要利用Storm的可靠性能力,必须告诉Storm何时在创建元组树内创建新的边和何时处理完一个元组。可用OutputCollector对象来发送tuples。在emit方法中完成定位,并且完成一个元组处理要使用ack方法。

更详细的信息请看“消息处理的保障”。

Tasks

每个Spout或Bolt的执行都可以作为很多跨集群的任务。每个任务对应一个执行的线程,并且Stream的分组定义了如何把数据元组从一组任务集发送到另一组任务集。在TopologyBuilder的setSpout和setBolt方法中给每个Spout和Bolt设置并行度。

Workers

Topology的执行会跨越一个或多个工作者进程。每个工作者进程就是一个物理JVM,并且要执行对应Topology的所有任务的一个子集。例如,如果组合的Topology的并行数是300,并且给这个Topology分配了50个workers,那么每个worker要执行6个任务(在worker内部以thread方式工作)。Strom会尝试把所有任务均匀的分配给每个worker。

相关知识:

Config.TOPOLOGY_WORKERS:这个配置用于设置分配给正在执行的Topology的worker的数量。

【原】Storm基本概念的更多相关文章

  1. Storm基础概念与单词统计示例

    Storm基本概念 Storm是一个分布式的.可靠地.容错的数据流处理系统.Storm分布式计算结构称为Topology(拓扑)结构,顾名思义,与拓扑图十分类似.该拓扑图主要由数据流Stream.数据 ...

  2. Storm 01之 Storm基本概念及第一个demo

    2.1 Storm基本概念 在运行一个Storm任务之前,需要了解一些概念: Topologies :[tə'pɑ:lədʒɪ]拓扑结构 Streams Spouts:[spaʊt]喷出; 喷射; 滔 ...

  3. Storm 学习之路(二)—— Storm核心概念详解

    一.Storm核心概念 1.1 Topologies(拓扑) 一个完整的Storm流处理程序被称为Storm topology(拓扑).它是一个是由Spouts 和Bolts通过Stream连接起来的 ...

  4. Storm 系列(二)—— Storm 核心概念详解

    一.Storm核心概念 1.1 Topologies(拓扑) 一个完整的 Storm 流处理程序被称为 Storm topology(拓扑).它是一个是由 Spouts 和 Bolts 通过 Stre ...

  5. 【转帖】Storm基本原理概念及基本使用

    Storm基本原理概念及基本使用 https://www.cnblogs.com/swordfall/p/8821453.html 1. 背景介绍 1.1 离线计算是什么 离线计算:批量获取数据.批量 ...

  6. storm - 基础概念整理

    理论 Hadoop的出现虽然为大数据计算提供了一条捷径,但其仍然存在自身难以克服的缺点:实时性不足.Hadoop的一轮计算的启动需要较长时间,因此其满足不了对实时性有较高要求的场景. Storm由此应 ...

  7. 1 storm基本概念 + storm编程规范及demo编写

    本博文的主要内容有 .Storm的单机模式安装 .Storm的分布式安装(3节点)   .No space left on device .storm工程的eclipse的java编写 http:// ...

  8. Storm基本概念以及Topology的并发度

    Spouts,流的源头 Spout是Storm里面特有的名词,Stream的源头,通常是从外部数据源读取tuples,并emit到topology Spout可以同时emit多个tupic strea ...

  9. Apache Storm 核心概念

    前言: Storm读取实时数据流,并传递给处理单元,最终输出处理后的数据. 下图描述了storm的处理数据的主要结构. 元组(Tuple) :       元组是Storm提供的一个轻量级的数据格式, ...

随机推荐

  1. why you write code so slow.

    今天我们要写一个日历表,用以存储所有的节假日. 虽然这个表设计的并不是很妙.但是将就着继续了. 让小弟把该表数据初始化3-5年的,结果一上午还没有出来,着急了,自己写了一个初始化的工具. 分享出来. ...

  2. Linux学习笔记(7)-系统资源查看

    监控系统资源:vmstat #vmstat [采样时间] [ 采样次数] 如:#vmstat 3 2 每3秒采样一次,总共采样2次 输出信息各字段解释 r 表示运行队列,如果运行队列多大表示CPU很繁 ...

  3. 如何循环遍历document.querySelectorAll()方法返回的结果

    使用JavaScript的forEach方法,我们可以轻松的循环一个数组,但如果你认为document.querySelectorAll()方法返回的应该是个数组,而使用forEach循环它: /* ...

  4. SQL 去除重复、获取最新记录

    应用中常会有需要去除重复的记录,或者获取某些最新记录(如:每个用户可以答题多次,每次答题时间不同,现在要获取所有用户的最新答题记录,即每个用户取最新的一条) 使用group 和max 即可实现上述功能 ...

  5. Log4net Level

    ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); l ...

  6. 团体程序设计天梯赛-练习集L2-002. 链表去重

    L2-002. 链表去重 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个带整数键值的单链表L,本题要求你编写程序,删除 ...

  7. 功能齐全、效率一流的免费开源数据库导入导出工具(c#开发,支持SQL server、SQLite、ACCESS三种数据库),每月借此处理数据5G以上

    软件名:DataPie 功能:支持SQL server.SQLite.ACCESS数据库的导入.导出.存储过程调用,支持EXCEL2007.EXCEL2003.ACCESS2007. CSV文件导入数 ...

  8. Foreman--管理PuppetClient

    一. 环境: 1. server: puppetmaster+activemq+foreman1.3 server1.xxx.com(10.8.1.201) 2. client: fedora 19 ...

  9. Unable to open c

    1. Unable to open c:\Cadence\PSD_14.2\tools\capture\allegro.cfg for reading. Please correct the abov ...

  10. echarts入门,5分钟上手写ECharts的第一个图表

    1.新建一个echarts.html文件,为ECharts准备一个具备大小(宽高)的Dom. <!DOCTYPE html> <head> <meta charset=& ...