1、storm是一个用于实时流式计算的分布式计算引擎,弥补了Hadoop在实时计算方面的不足(Hadoop在本质上是一个批处理系统)。html
2、storm在实际应用场景中的位置通常以下:java
其中的编号1~5说明以下:python
一、Flume用于收集日志信息;mysql
二、结合数据传输功能能够把收集到的日志信息实时传输到kafka集群,或保存到Hadoop hdfs中保存。git
这里之因此选择kafka集群是由于kafka集群具有缓冲功能,能够防止数据采集速度和数据处理速度不匹配致使数据丢失,这样作能够提升可靠性。github
三、使用storm实时处理数据;算法
四、保存storm处理的结果数据,当数据量不是特别巨大时,可使用MySQL存储;当数据量特别巨大时,能够选择hdfs存储。sql
五、用于实时展现处理结果。数据库
3、storm的抽象运行方式:apache
其中:
spout为数据流的源头;
tuple为流动中的数据承载单元;
Bolt为数据流处理的中间状态。
4、spout和Bolt如何造成程序运行?
storm中运行的程序称为Topology,Topology将spout和bolt组装在一块儿,完成实时计算的任务。具体操做是经过TopologyBuilder的setSpout方法和setBolt方法,例子以下:
5、如何决定数据流的流向:
(1)借助在TopologyBuilder的setSpout方法和setBolt方法的第一个参数中为Spout程序和Bolt程序取的名字,例如上面示例代码中的“spout-name”以及“bolt-name-one”,“bolt-name-two”。
补充:setBolt方法原型:
setSpout方法原型:
(2)setBolt方法返回的BoltDeclarer对象利用fieldGrouping方法并结合(1)中的spout和bolt名字指定数据流的流向。
补充:fieldGrouping方法原型:
6、数据流中的数据承载单元tuple结构是什么
官网文档以下:
The tuple is the main data structure in Storm. A tuple is a named list of values, where each value can be any type. Tuples are dynamically typed -- the types of the fields do not need to be declared. Tuples have helper methods like getInteger and getString to get field values without having to cast the result. Storm needs to know how to serialize all the values in a tuple. By default, Storm knows how to serialize the primitive types, strings, and byte arrays. If you want to use another type, you'll need to implement and register a serializer for that type. See http://github.com/nathanmarz/storm/wiki/Serialization
for more info.
通俗的讲,tuple就是一个值列表,其中的值类型能够是任何类型,默认类型有byte,integer,short,long,float,double,string,byte[]。
tuple数据结构以下:
其中,fieldName是定义在declareOutputFields方法中的Fields对象,fieldValue值是在emit方法中发送的Values对象。
tuple都是经过spout和bolt发射(传送)的。
例如:
spout程序以下:
bolt程序以下:
7、spout如何发射无界的数据流,bolt如何处理接收到的数据tuple
(1)如在上一部分spout的示例代码,其中必含有nextTuple方法,在spout程序生命周期中,nextTuple方法一直运行,因此能够一直获取数据流中的数据并持续像bolt处理程序发射。
(2)如在上一部分bolt的示例代码,其中必含有execute方法,在bolt程序生命周期中,只要其收到tuple数据就会处理,根据须要会把处理后的数据继续发射出去。
8、如何保证全部发射的数据tuple都被正确处理
同一个tuple不论是处理成功仍是失败,都由建立它的Spout发射并维护。
9、storm和Hadoop中各角色对比
10、storm比Hadoop实时是由于Hadoop在把一批数据都处理完毕后才输出处理结果,而storm是处理一点数据就实时输出这些数据的处理结果。
Storm与传统关系型数据库
传统关系型数据库是先存后计算,而storm则是先算后存,甚至不存
传统关系型数据库很难部署实时计算,只能部署定时任务统计分析窗口数据
关系型数据库重视事务,并发控制,相对来讲Storm比较简陋
Storm不Hadoop,Spark等是流行的大数据方案
与Storm关系密切的语言:核心代码用clojure书写,实用程序用python开发,使用java开发拓扑
Storm集群中有两种节点,一种是控制节点(Nimbus节点),另外一种是工做节点(Supervisor节点)。全部Topology任务的 提交必须在Storm客户端节点上进行(须要配置 storm.yaml文件),由Nimbus节点分配给其余Supervisor节点进行处理。 Nimbus节点首先将提交的Topology进行分片,分红一个个的Task,并将Task和Supervisor相关的信息提交到 zookeeper集群上,Supervisor会去zookeeper集群上认领本身的Task,通知本身的Worker进程进行Task的处理。 和一样是计算框架的MapReduce相比,MapReduce集群上运行的是Job,而Storm集群上运行的是Topology。可是Job在运行结束以后会自行结束,Topology却只能被手动的kill掉,不然会一直运行下去 Storm不处理计算结果的保存,这是应用代码须要负责的事情,若是数据不大,你能够简单地保存在内存里,也能够每次都更新数据库,也能够采用NoSQL存储。这部分事情彻底交给用户。 数据存储以后的展示,也是你须要本身处理的,storm UI 只提供对topology的监控和统计。