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. linux 添加用户

    1.下面就开始来说怎么添加新用户 我们以添加一个用户名为jorcen的新用户为例来说明,执行下面的命令: # useradd jorcen 2.那么就新用户就添加完成,但是没有任何信息,新用户添加完成 ...

  2. hibernate中session

    hibernate中的session是一级缓存,可以理解为进程级的缓存.在进程运行期间一直存在. session可以理解为一个可以操作数据库的对象 具体如何操作数据库? session中有方法, 如果 ...

  3. Deep Learning and the Triumph of Empiricism

    Deep Learning and the Triumph of Empiricism By Zachary Chase Lipton, July 2015 Deep learning is now ...

  4. Unity寻路的功能总结

    源地址:http://blog.csdn.net/sgnyyy/article/details/21878163 1. 利用Unity本身自带的NavMesh 这篇文章已经比较详细,可能对于很多需要a ...

  5. 站长、运维必备| 网站可用性监控产品 OneAPM Cloud Test 上线

    白天太忙,到了晚上才发现网站一天都没有访问量? 直到有用户投诉才发现网站完全无法访问? 还要每月付费才能及时了解网站可用情况? 监控频率太低,不能及时发现网站不可用? 第三方服务宕机,导致您的网站不可 ...

  6. ssh远程执行命令并自动退出(已测试通过)

    转自:http://blog.csdn.net/fdipzone/article/details/23000201 ssh命令格式如下: usage: ssh [-1246AaCfgKkMNnqsTt ...

  7. 李洪强iOS开发之使用CycleScrollView实现轮播图

    01 导入头文件,并且定义CycleScrollView属性 02 初始化,设置frame并且添加到collectionView上 03 调用方法并且设置轮播的图片

  8. [itint5]下一个排列

    http://www.itint5.com/oj/#6 首先,试验的时候要拿5个来试,3,4个都太少了.好久没做所以方法也忘了,是先从后往前找到第一个不合顺序的,然后在后面找到比这个大的最小的来交换, ...

  9. SGU 101 修改

    感谢这里. test4确实是个不连通的case,奇怪的是我用check函数跟if (check() == false)来判断这个case,当不连通时就死循环,得到的结果是不一样的,前者得到WA,后者得 ...

  10. Android性能优化典范 - 第2季

    Google发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的缩放,缓 ...