理论

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

Storm由此应运而生,提供了可扩展的,可靠的,易于使用,而且是编程语言无关的实时大数据处理框架。

使用

Components of a storm cluster

Storm集群类似于Hadoop集群,storm运行与topo之上。

Storm集群中存在两类节点:master节点和worker节点。master运行在一个守护进程上,该守护进程称为Nimbus,负责集群中的代码分发,任务分配以及错误处理。

每个worker节点运行在守护进程Supervisor上,Supervisor根据Nimbus的命令,负责worker的启停。

每个worker都运行一个topo的子集,一个topo是由分布于多台主机间的多个worker组成的。

另外,Nimbus和Supervisor是由zookeeper来协调的,Nimbus和Supervisor是无状态的,所有的状态都被zookeeper保存在本地硬盘上,因此对Nimbus和Supervisor的操作是非常安全的,在强行终止进程后,状态也能够快速从zookeeper中恢复。

Topology

Topology是一个计算拓扑,拓扑中的每个节点都包含着计算逻辑,而且节点中的连接代表了数据的流向。

启动命令:

storm jar all-my-code.jar backtype.storm.MyTopology arg1 arg2

all-my-code.jar中通过main()实现了topo,storm命令连接Nimbus并上传jar。

Stream

Stream是Storm的核心抽象,由无限的tuple组成,storm提供将stream转换为另外的stream的能力。

能力的提供是由spout和bolt来实现的。Spout和bolt都有接口可以实现自己的业务逻辑。

spout是stream的入口,spout可以从不同的数据源读入数据。

bolt消费stream,并且做处理,可能在处理后会输出新的stream,通过多个bolt的连接,可以实现复杂的处理流程。

spout和bolt的网络构成了topo,是storm的最高层次的抽象。

topo中的所有节点都是并行运行的,在topo中,我们可以指定并行度,storm将会根据并行度生成线程并在整个集群内运行。

topo使用运行,不会停止,除非人为干预。最为重要的是,storm保证数据不丢失,包括消息,任务等。

Data Model

storm使用tuple作为其数据模型,tuple是一组值的集合,tuple中的值域可以是任意类型,包括java中的基本类型或者其他自定义类型(需要实现serializer)。

集群中的每个节点都需要声明它要输出的tuple的值域。如下这个bolt就声明了“double”和“triple”这两个域。

public class DoubleAndTripleBolt extends BaseRichBolt {

    private OutputCollectorBase _collector;

    @Override

    public void prepare(Map conf, TopologyContext context, OutputCollectorBase collector) {

        _collector = collector;

    }

    @Override

    public void execute(Tuple input) {

        int val = input.getInteger(0);       

        _collector.emit(input, new Values(val*2, val*3));

        _collector.ack(input);

    }

    @Override

    public void declareOutputFields(OutputFieldsDeclarer declarer) {

        declarer.declare(new Fields("double", "triple"));

}   

}

declareOutputFields声明了两个输出域“double”和“triple”。该bolt后续的bolt将会根据这个输入解析bolt。

A simple topology

setSpout/setBolt

TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("words", new TestWordSpout(), 10); //设置spout的ID及并行度
builder.setBolt("exclaim1", new ExclamationBolt(), 3)
.shuffleGrouping("words"); //设置bolt的id及并行度,且在spout后
builder.setBolt("exclaim2", new ExclamationBolt(), 2)
.shuffleGrouping("exclaim1");

使用上面的语句就构造了一个topo,该topo有一个spout和两个bolt。

构成的topo为:

parallelism

并行度是节点上的概念,表示在整个集群执行该节点的逻辑应当启动几个线程。

shuffleGroup方法表示消息在节点中的分发是随机的,也会有其他的分发方式,需要另文解释。

另外,可以采用链式调用来指定多个输入。

builder.setBolt("exclaim2", new ExclamationBolt(), 5)
.shuffleGrouping("words")
.shuffleGrouping("exclaim1");

如果Bolt如此定义,则整个topo将会修改为:

由此可见bolt节点可以存在多个输入。

nextTuple

public void nextTuple() {
Utils.sleep(100);
final String[] words = new String[] {"nathan", "mike", "jackson", "golda", "bertels"};
final Random rand = new Random();
final String word = words[rand.nextInt(words.length)];
_collector.emit(new Values(word));
}

如上面的方法所示,实现了该方法的节点将会随机的发送word。

Bolt实现的方法类ExclamationBolt会读取输入,并在文字末尾加入“!!!”。实现如下:

public static class ExclamationBolt implements IRichBolt {
OutputCollector _collector; public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
_collector = collector;
} public void execute(Tuple tuple) {
_collector.emit(tuple, new Values(tuple.getString(0) + "!!!"));
_collector.ack(tuple);
} public void cleanup() {
} public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word"));
} public Map getComponentConfiguration() {
return null;
}
}

Prepare

prepare方法想bolt节点中设置了OutputCollector,通过OutputCollector发射tuples。可以在任何时候调用outputcollector.emit()方法发射tuple。

prepare方法仅起到初始化作用。

Execute

execute方法时bolt的主要逻辑,可以通过调用方法Tuple#getSourceComponent来获取tuple的来源。

方法ACK用于向上一个节点反馈执行情况。

Cleanup

清理方法,不可靠调用,通常用于本地调试

declareOutputFields

用于声明输出域

getComponentConfigurateion

允许用户设置节点的一些配置参数,属于高级特性

Example

public static class ExclamationBolt extends BaseRichBolt {
OutputCollector _collector; public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
_collector = collector;
} public void execute(Tuple tuple) {
_collector.emit(tuple, new Values(tuple.getString(0) + "!!!"));
_collector.ack(tuple);
} public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word"));
}
}

Running Topology in local mode

采用本地模式可以进行topo调试,此时,所有的worker将会使用线程进行模拟。

Config conf = new Config();
conf.setDebug(true);
conf.setNumWorkers(2); LocalCluster cluster = new LocalCluster();
cluster.submitTopology("test", conf, builder.createTopology());
Utils.sleep(10000);
cluster.killTopology("test");
cluster.shutdown();

Stream grouping

stream grouping表示怎样在两个component(spout和bolt都是组件)发送tuple。需要记住的是,spouts和blots在整个集群中实际上是并行执行的,如下图:

此时,就需要stream groups来决定tuple是发送到Bolt A还是Bolt B。

STORM中已有有一些成熟的实现,如shuffleGrouping和fieldGrouping。

具体使用,可以参考文档:

http://storm.apache.org/documentation/Concepts.html

Guaranteeing message processing

http://storm.apache.org/documentation/Guaranteeing-message-processing.html

使用该机制保证消息都被正确处理

Transactional topologies

storm - 基础概念整理的更多相关文章

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

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

  2. java基础概念整理综合 及补充(jdk1.8)

    2018 java基础 笔记回顾摘要 一 1,html 与 注释: <!--   -->  注释不能嵌套 代码都得有注释. 2,空格符:   3,css选择的优先级: id选择器 > ...

  3. 【Storm篇】--Storm基础概念

    一.前述 Storm是个实时的.分布式以及具备高容错的计算系统,Storm进程常驻内存 ,Storm数据不经过磁盘,在内存中处理. 二.相关概念 1.异步: 流式处理(异步)客户端提交数据进行结算,并 ...

  4. 光纤与PON基础概念整理

    近期有幸接触到通讯这一领域,此文专门用于整理记录. 首先是光纤与光缆  光纤(OpticalFiber,OF)是用来导光的透明介质纤维,一根有用化的光纤是由多层透明介质构成,一般能够分为三部分:折射率 ...

  5. java基础概念整理(三)

    1.对象的上转型 对象的上转型不能调用和使用子类对象新增的成员和变量,不能调用子类新增的方法. 上转型对象可以访问子类继承或者隐藏的成员变量,也可以调用子类继承或者子类重写的实例方法.因此如果子类重写 ...

  6. [自学]数据库ER图基础概念整理(转)

    ER图分为实体.属性.关系三个核心部分.实体是长方形体现,而属性则是椭圆形,关系为菱形. ER图的实体(entity)即数据模型中的数据对象,例如人.学生.音乐都可以作为一个数据对象,用长方体来表示, ...

  7. storm基础系列之一----storm并发度概念剖析

    前言: 学了几天storm的基础,发现如果有hadoop基础,再理解起概念来,容易的多.不过,涉及到一些独有的东西,如调度,如并发度,还是很麻烦.那么,从这一篇开始,力争清晰的梳理这些知识. 在正式学 ...

  8. 【转载】Apache Storm 官方文档 —— 基础概念

    [转载自https://yq.aliyun.com/articles/87510?t=t1] Storm 系统中包含以下几个基本概念: 拓扑(Topologies) 流(Streams) 数据源(Sp ...

  9. Storm基础

    Storm基本概念 Storm是一个开源的实时计算系统,它提供了一系列的基本元素用于进行计算:Topology.Stream.Spout.Bolt等等. 在Storm中,一个实时应用的计算任务被打包作 ...

随机推荐

  1. 由于Linux操作平台屡次受到黑客的“青睐”,LINUX公司也越来越注重产品的安全问题。

    Guardian Digital公司和安全管理服务提供商(MSSP)Guardent公司推出的新产品将提高开放式源代码和Linux产品的安全性能. Guardian Digital公司将于本月底在纽约 ...

  2. iphone开发第二个程序

    此程序包括UIProgressView,UIButton, UIDatePicker,UIAlert,UILabel,NSTimer // //  HViewController.h //  Btn_ ...

  3. JavaScript 权威指南第6版 - [阅读笔记]

    JavaScript 基础   Page 13 (1)<script> 的属性:async,charset,defer='defer',language已废,src,type   (2)n ...

  4. NotifyIcon制作任务栏托盘菜单

    常用软件飞信.QQ在任务栏中的图标ICO,以及鼠标移动到图标是右键菜单选项 1.首先制作任务栏图标 this.ShowInTaskbar = true; 2.窗体最小化时或者关闭时隐藏到任务栏,有时候 ...

  5. (转载)Cocos2dx-OpenGL ES2.0教程:纹理贴图(6)

    在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ...

  6. Java 数组的三种创建方法

    public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intValue=arr[5]; //S ...

  7. 1034: [ZJOI2008]泡泡堂BNB - BZOJ

    Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵 ...

  8. 1197: [HNOI2006]花仙子的魔法 - BZOJ

    Description Input 包含两个整数,并用一个空格隔开,第一个整数表示实施魔法的次数m,第二个整数表示空间的维数n.其中,1≤m≤100,1≤n≤15. Output 仅包含一个整数,表示 ...

  9. PAT-乙级-1033. 旧键盘打字(20)

    1033. 旧键盘打字(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 旧键盘上坏了几个键,于是在敲一段文 ...

  10. The 5th Zhejiang Provincial Collegiate Programming Contest------ProblemA:Accurately Say "CocaCola"!

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2965 题意:一群人玩过“7”的游戏,有7的数字或者7的倍数就要喊“coca ...