storm从入门到放弃(一),storm介绍
背景:目前就职于国内最大的IT咨询公司,恰巧又是毕业季,所在部门招了20多个应届毕业生,本人要跟部门新人进行为期一个月的大数据入职培训,特此将整理的文档分享出来。
原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/7274361.html
微信:intsmaze
避免微信回复重复咨询问题,技术咨询请博客留言。
Storm是一个开源的分布式实时计算系统,可以简单、可靠的处理大量的数据流。Storm支持水平扩展,具有高容错性,保证每个消息都会得到处理。
Storm核心组件
Worker:运行具体处理组件逻辑的进程。Worker运行的任务类型只有两种,一种是Spout任务,一种是Bolt任务。
Task:worker中每一个spout/bolt的线程称为一个task. 在storm0.8之后,task不再与物理线程对应,不同spout/bolt的task可能会共享一个物理线程,该线程称为executor。
Storm编程模型
public class RandomSentenceSpout extends BaseRichSpout {public void nextTuple() {collector.emit(new Values("+ - * % /"));Utils.sleep(50000);}...... } public class SplitSentenceBolt extends BaseBasicBolt {public void execute(Tuple input, BasicOutputCollector collector) {String sentence = (String)input.getValueByField("intsmaze");System.out.println(Thread.currentThread().getId()+" "+sentence); }...... } public class TwoBolt extends BaseBasicBolt { public void execute(Tuple input, BasicOutputCollector collector) {String sentence = (String)input.getValueByField("intsmaze");System.out.println(Thread.currentThread().getId()+" "+sentence);}...... } public class WordCountTopologyMain {public static void main(String[] args) throws Exception {TopologyBuilder builder = new TopologyBuilder();builder.setSpout("spout1", new RandomSentenceSpout(),1);builder.setBolt("two", new TwoBolt(),1).shuffleGrouping("spout1");builder.setBolt("split1", new SplitSentenceBolt(),2).shuffleGrouping("spout1");Config conf = new Config();conf.setDebug(false);conf.setMaxTaskParallelism(3);LocalCluster cluster = new LocalCluster();cluster.submitTopology("word-count", conf, builder.createTopology());}} }
可以发现spout每隔一段时间间隔发一份数据,这份数据会被两个bolt同时接收,而不是说这次A bolt接收下次B bolt接收。 同一个bolt业务逻辑如果设置了并行度,他们才会根据分组策略依次接收上游发来的消息。
----------------84 + - * % / 这个是tow bolt接收 ----------------78 + - * % / 这个是split1 bolt 中78线程接收的 ----------------80 + - * % / 这个是split1 bolt中线程80接收的。 ----------------84 + - * % / ----------------78 + - * % / ----------------84 + - * % /
Fields Grouping:按字段分组,比如按userid来分组,具有同样userid的tuple会被分到相同的Bolts里的一个task,而不同的userid则会被分配到不同的bolts里的task。
All Grouping:广播发送,对于每一个tuple,所有的bolts都会收到。
Global Grouping:全局分组, 这个tuple被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。
Non Grouping:不分组,这stream grouping个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。
Direct Grouping: 直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的task的id (OutputCollector.emit方法也会返回task的id)。
Local or shuffle grouping:如果目标bolt有一个或者多个task在同一个工作进程中,tuple将会被随机发生给这些tasks。否则,和普通的Shuffle Grouping行为一致。
conf.setNumWorkers(4) 表示设置了4个worker来执行整个topology的所有组件 builder.setBolt("boltA-intsmaze",new BoltA(), 4) ---->指明 boltA组件的线程数excutors总共有4个 builder.setBolt("boltB-intsmaze",new BoltB(), 4) ---->指明 boltB组件的线程数excutors总共有4个 builder.setSpout("randomSpout-intsmaze",new RandomSpout(), 2) ---->指明randomSpout组件的线程数excutors总共有2个 -----意味着整个topology中执行所有组件的总线程数为4+4+2=10个 ----worker数量是4个,有可能会出现这样的负载情况,worker-1有2个线程,worker-2有2个线程,worker-3有3个线程,worker-4有3个线程 如果指定某个组件的具体task并发实例数 builder.setSpout("randomspout-intsmaze", new RandomWordSpout(), 4).setNumTasks(8); ----意味着对于这个组件的执行线程excutor来说,一个excutor将执行8/4=2个task,默认情况一个线程执行一个task.
storm从入门到放弃(一),storm介绍相关推荐
- Storm编程入门API系列之Storm的可靠性的ACK消息确认机制
概念,见博客 Storm概念学习系列之storm的可靠性 什么业务场景需要storm可靠性的ACK确认机制? 答:想要保住数据不丢,或者保住数据总是被处理.即若没被处理的,得让我们知道. publi ...
- JavaScript从入门到放弃-JavaScript历史介绍
JavaScript历史 要了解JavaScript,我们首先要回顾一下JavaScript的诞生. 在上个世纪的1995年,当时的网景公司正凭借其Navigator浏览器成为Web时代开启时最著名的 ...
- Scala从入门到入土(从入门到放弃)
Scala从入门到入土(从入门到放弃) 1 Scala介绍 Scala是一门 综合了 面向对象的 函数式编程的 基于JVm的 语言 特点: 1 语法简洁 2 开发速度快 , 运行速度快 3 兼容 Ja ...
- Storm入门(一)原理介绍
问题导读: 1.hadoop有master与slave,Storm与之对应的节点是什么? 2.Storm控制节点上面运行一个后台程序被称之为什么? 3.Supervisor的作用是什么? 4.Topo ...
- Storm学习入门视频教程
Storm流计算从入门到精通之技术篇(高并发策略.批处理事务.Trident精解.运维监控.企业场景) 课程讲师:Cloudy 课程分类:大数据 适合人群:初级 课时数量:28课时 用到技术:Stor ...
- apache Storm之一-入门学习
准备工作 这个教程使用storm-starter项目里面的例子.我推荐你们下载这个项目的代码并且跟着教程一起做.先读一下:配置storm开发环境和新建一个strom项目这两篇文章把你的机器设置好. 一 ...
- 深聊性能测试,从入门到放弃之: Windows系统性能监控(三)任务管理器介绍及使用。
任务管理器 1.引言 2.任务管理器 2.1 打开方式 2.2 介绍 2.2.1 定义 2.2.2 进程 2.2.3 性能 2.2.4 应用历史记录 2.2.5 启动 2.2.6 用户 2.2.7 详 ...
- 深聊性能测试,从入门到放弃之: Windows系统性能监控(一) 性能监视器介绍及使用。
性能监视器介绍及使用 1.引言 2.性能监视器 2.1 打开方式 2.2 基本介绍 2.3 计数器介绍 2.3.1 处理器性能计数器 2.3.2 内存性能计数器 2.3.3 网络性能计数器 2.4 创 ...
- 深聊性能测试,从入门到放弃之: Windows系统性能监控(二) 资源监控器介绍及使用。
资源监控器介绍及使用 1.引言 2.资源监视器 2.1 打开方式 2.2 基本介绍 2.3 使用 3.总结 1.引言 小屌丝:鱼哥,我看了你这篇<Windows系统性能监控(一) 性能监视器介绍 ...
最新文章
- LeetCode简单题之至少是其他数字两倍的最大数
- QT 防止FTP 上传软件在断连处 Crash
- C++,Java,Python,Fortran到底哪个更快?
- 【转】Compile、Make和Build的区别
- Hystrix之Dashboard的常见问题
- 看了新闻,思科研发中心 没有成都的。。。
- linux中自动化日志分析,Shell项目案例7-应用日志分析
- Mac JDK 卸载方法
- 为什么Java有瞬态字段?
- 穿越机用途和机架尺寸
- 基于微信公众号的图书借阅管理系统设计与实现
- java ehcache使用_EhCache使用详细介绍
- HBuilder X 无法启动微信开发者工具问题解决方法
- c 递归实现谢宾斯基三角形
- matlab中syms与sym有什么区别
- 小酌Django4——博客文章展示
- 思考未来--马云说:30年后的世界不属于互联网公司
- java编程必用软件(有下载路径)
- 数字大小写转换(包括金额)
- 破解仓储难题?看WMS如何解决
热门文章
- python分别统计男女人数_python实现爬虫统计学校BBS男女比例(一)
- Windows服务器SYSTEM权限Webshell无法添加3389账户情况突破总结
- java aop面向切面编程
- C# — 通过点击回车执行任务
- redhat6.4 添加yum本地源和安装virtualbox增强组件
- 对于C#里面的this与base
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 发布新模板-画情画心
- 创建或打开解决方案时提示“DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86“错误的解决方案
- hadoop过程中遇到的错误与解决方法