Storm简介
Apache Storm是Twitter开源的一个类似于Hadoop的实时数据处理框架,它原来是由BackType开发,后BackType被Twitter收购,将Storm作为Twitter的实时数据分析系统。
Storm能实现高频数据和大规模数据的实时处理。
官网资料显示storm的一个节点1秒钟能够处理100万个100字节的消息(IntelE5645@2.4Ghz的CPU,24GB的内存)。
官网 http://storm.apache.org
Storm和Hadoop的比较
数据来源
HADOOP处理的是HDFS上TB级别的数据(历史数据),STORM是处理的是实时新增的某一笔数据(实时数据);
处理过程
HADOOP是分MAP阶段到REDUCE阶段,STORM是由用户定义处理流程,流程中可以包含多个步骤,每个步骤可以是数据源(SPOUT)或处理逻辑(BOLT);
是否结束
HADOOP最后是要结束的,STORM是没有结束状态,到最后一步时,就停在那,直到有新数据进入时再从头开始;
处理速度
HADOOP是以处理HDFS上TB级别数据为目的,处理速度慢,STORM是只要处理新增的某一笔数据即可,可以做到很快;
适用场景
HADOOP是在要处理批量数据时用的,不讲究时效性,STORM是要处理某一新增数据时用的,要讲时效性。
但凡离线处理,一般都是操作T+1 ----->依赖磁盘IO、网络IO
但凡实时流处理,都是处理一笔数据---->内存计算
Storm的设计思想
Storm是对流Stream的抽象,流是一个不间断的无界的连续tuple,注意Storm在建模事件流时,把流中的事件抽象为tuple即元组。
Storm将流中元素抽象为Tuple,一个tuple就是一个值列表——value list,list中的每个value都有一个name,并且该value可以是基本类型,字符类型,字节数组等,当然也可以是其他可序列化的类型。
Storm认为每个stream都有一个stream源,也就是原始元组的源头,所以它将这个源头称为Spout。
有了源头即spout也就是有了stream,那么该如何处理stream内的tuple呢。将流的状态转换称为Bolt,bolt可以消费任意数量的输入流,只要将流方向导向该bolt,同时它也可以发送新的流给其他bolt使用,这样一来,只要打开特定的spout(管口)再将spout中流出的tuple导向特定的bolt,又bolt对导入的流做处理后再导向其他bolt或者目的地。
以上处理过程统称为Topology即拓扑。拓扑是storm中最高层次的一个抽象概念,它可以被提交到storm集群执行,一个拓扑就是一个流转换图,图中每个节点是一个spout或者bolt,图中的边表示bolt订阅了哪些流,当spout或者bolt发送元组到流时,它就发送元组到每个订阅了该流的bolt(这就意味着不需要我们手工拉管道,只要预先订阅,spout就会将流发到适当bolt上)。
拓扑的每个节点都要说明它所发射出的元组的字段的name,其他节点只需要订阅该name就可以接收处理。
开发Topology注意事项:
spout和bolt的ID不能以__开头,这些是系统保留的
同一个topology中spout和bolt不能使用相同的ID
集群中topology的名称不能重复
相关名词解释:
Topology用于封装一个实时计算应用程序的逻辑,类似于Hadoop的MapReduce Job
Stream 消息流,是一个没有边界的tuple序列,这些tuples会被以一种分布式的方式并行地创建和处理
Spouts 消息源,是消息生产者,他会从一个外部源读取数据并向topology里面面发出消息:tuple
Bolts 消息处理者,所有的消息处理逻辑被封装在bolts里面,处理输入的数据流并产生新的输出数据流,可执行过滤,聚合,查询数据库等操作
Task 每一个Spout和Bolt会被当作很多task在整个集群里面执行,每一个task对应到一个线程.
Stream groupings 消息分发策略,定义一个Topology的其中一步是定义每个tuple接受什么样的流作为输入,stream grouping就是用来定义一个stream应该如何分配给Bolts们.
安装配置Storm集群:
下载地址:https://storm.apache.org/downloads.html
在/opt目录下面进行安装
安装并zookeeper集群(要保证集群各个节点的时间保持一致)
master
slave01
slave02
解压重命名apache-storm-1.0.2.tar.gz
opt]# tar -zxf soft/apache-storm-1.0.2.tar.gz
opt]# mv apache-storm-1.0.2 storm
将storm添加进入环境变量
修改文件conf/storm-env.sh
export JAVA_HOME=/opt/jdk
export STORM_CONF_DIR="/opt/storm/conf"
修改文件conf/storm.yaml
① storm.zookeeper.servers
storm.zookeeper.servers:
- "master"
- "slave01"
- "slave02"
如果不是默认的2181端口,可以配置storm.zookeeper.port
② storm.local.dir-->临时文件
storm.local.dir: "/opt/storm/tmp"
③ nimbus.seeds-->storm的HA配置
nimbus.seeds: ["master","slave01"]
④ supervisor.slots.ports
Supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
注意:
》 使用两个空格作为一级缩进是yaml的约定,不能使用制表符(Tab)来代替
》 以“:”为结束符的字符串,代表了一个键名,“:”后面则是键值。“:”和键值之间必须有至少一个空格。
》 列表的元素前面的“-”必不可少,并且要跟随至少一个空格。也可以使用- [value1, value2, value3] 表示列表
启动:
在master和slave01的/opt/storm执行以下命令:
nohup bin/storm nimbus >/dev/null 2>&1 &
在slave01和slave02的/opt/storm执行以下命令:
nohup bin/storm supervisor >/dev/null 2>&1 &
在storm集群中的任何一台机器启动UI--->hostname
nohup bin/storm ui >/dev/null 2>&1 &
通过浏览器来查看storm集群的运行状态:http://hostname:8080
日志的监控:
一般都是supervisor节点开启日志logviewer
nohup bin/storm logviewer >/dev/null 2>&1 &
=================================================================================================
在集群中运行storm程序
将storm程序打成一个jar在storm集群中运行,命令格式如下:
storm]# bin/storm jar path_to_jar class_name [parameters]
eg.
storm]# bin/storm jar /opt/jars/storm/storm-sum.jar com.uplooking.bigdata.storm.cluster.RemoteSumTopology adfasdfszd
杀死一个storm程序
两种方式
一:在stormUI中kill掉
二:使用命令bin/storm kill topologyName
eg.
storm]# bin/storm kill RemoteSumTopology