Storm框架基础(一)

* Storm框架基础(一)

Storm简述

如果你了解过SparkStreaming,那么Storm就可以类比着入门,在此我们可以先做一个简单的比较:

 在SparkStreaming中:

我们曾尝试过每秒钟的实时数据处理,或者使用Window若干时间范围内的数据统一处理结果。亦或统计所有时间范围内的数据结果。

在Storm中:

我们可以根据进来的每一条数据进行实时处理,也就是说,Storm处理数据的速度,要小于1秒,也就是毫秒级别的。

如果你疑问,1秒处理1次数据,和进来1条数据处理1次有什么差别,稍作思考答案应该是显而易见的,因为1秒中就可以产生不计其数的数据。

Storm角色

主节点:Nimbus

从节点:Supervisor

Storm基本概念

Nimbus:主节点

Supervisor:从节点

Worker:任务工作进程,类似于YARN的ApplicationMaster,可以存在多个,不同的任务有不同的Worker

Executor:Worker进程在执行任务时,会启动多个Executor现成

Topology:task任务的拓扑结构,是一个DAG有向无环图

Spout:抽取数据并将数据进行分发的阶段

Bolt:将分发的数据进行具体操作的阶段

Storm集群配置

zookeeper在这里起到同步主/从节点状态信息的作用,后续会详解,所以Storm是依赖zookeeper的

Storm的安装部署

OK,闲话不多说,我们直接开始部署Storm,部署完成后,我们再根据运行的任务,来解析一下Storm任务运行的流程和调度过程以及其中的简单原理。

本次安装需要依赖Java以及Python环境,如果当前虚拟机没有,请自行安装,安装后检测,如图:

注意Python是2版本系列

官网网站:storm.apache.org

Storm下载传送门:

链接:http://pan.baidu.com/s/1pLwj4dt 密码:resv

Step1、解压

$ tar -zxf apache-storm-0.9.6.tar.gz -C  /opt/modules/

Step2、修改配置文件

尖叫提示:Notepad++编辑配置文件可能会导致yaml文件格式错乱,请留意,建议使用sublime或者vi编辑

storm_env.ini

storm.yaml

配置帮助页面:http://storm.apache.org/releases/0.9.6/Setting-up-a-Storm-cluster.html

配置完成后将安装包scp到其他机器节点。

Step3、启动三台节点的zookeeper集群

$ /opt/modules/cdh/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start

Step4、启动Nimbus和UI进程

$ nohup bin/storm nimbus > /dev/null 2>&1 &

$ nohup bin/storm ui > /dev/null 2>&1 &

检查:

$ jps

启动后需要稍等片刻,才能config_value从这个配置进程切换到对应进程

$ ps -ef | grep daemon.nimbus

$ ps -ef | grep ui.core

如图:

Step5、所有节点启动Supervisor和logviewer进程

$ nohup bin/storm supervisor > /dev/null 2>&1 &

$ nohup bin/storm logviewer > /dev/null 2>&1 &

检查第一台节点(第二,第三台节点请自行检查):

$ jps

$ ps -ef | grep daemon.supervisor

$ ps -ef | grep daemon.logviewer

尖叫提示:

默认情况下,nohup执行的日志在当前目录下的nohup.out中,但此刻我们将日志重定向到了/dev/null设备中(即空设备)意思就是丢弃不要了。

Step6、登录z01:8081查看storm集群启动情况,如下图所示

Step7、运行个官方案例,测试一下吧

$ bin/storm jar examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount

任务提交后,可以在此查看:

打开该任务,可以看到有一个DAG图:

后续涉及到代码编写的时候自然会明白该图在说什么

Storm集群运行机制

主节点Nimbus

管理所有从节点supervisor,当主节点nimbus启动后会定时向zookeeper集群发送自己的当前状态信息,同时也可以获取所有从节点Supervisor的状态信息

从节点Supervisor

定时向zookeeper集群汇报自己的状态信息,同时接受主节点Nimbus派发过来的任务。

Zookeeper的作用

Storm的所有节点的状态信息都保存在zookeeper当中,如果有某个节点挂掉了,只需要启动一个新的节点来替代即可,新的节点启动后,会自动从zookeeper中读取之前的状态信息,然后恢复到该状态下。同时也不必担心task任务意外终止,因为可以通过zookeeper来恢复该任务,也就是重启挂掉的task。nimbus和supervisor之间的状态同步全部依赖zookeeper来实现,看如下一张图,该图是zookeepr中storm的目录结构:

$ /opt/modules/cdh/zookeeper-3.4.5-cdh5.3.6/bin/zkCli.sh -server z01:2181

[zk: z01:2181(CONNECTED) 0] ls /

[hbase, hadoop-ha, admin, zookeeper, consumers, config, rmstore, storm, yarn-leader-election, brokers, controller_epoch]

[zk: z01:2181(CONNECTED) 1] ls /storm

[workerbeats, storms, supervisors, errors, assignments]

/workerbeats:存储worker工作进程的运行状态信息

/storms:存储的Topology的基本配置信息

/supervisors:存储supervisor节点的状态信息

/errors:存储Topology任务运行过程中出现的异常信息

/assignments:存储的是Topology任务的分配信息

Storm代码实现WordCount

Step1、打开IDEA工具构建一个Maven工程,此步骤前文已经进行了多次练习,不再赘述

Step2、指定仓库地址,如果默认则无需改动

Step3、设置项目名称及工作路径,Finish即可

Step4、完事之后呢,打开pom.xml进行如下配置

这个过程可能会有点慢,因为要从联网下载各种依赖包

Step5、第四步全部搞定之后,如果下载了assembly插件,则需要添加如下配置,如果你不适用assembly则不需要Step5,你可以仿照前文Spark章节的打包过程进行。

src.xml的内容是:

Step6、我们就来根据这张图来编写代码

这张图说明的是,storm的topology任务大概分为两个阶段,第一个阶段是spout阶段,主要负责数据的抽取,第二个阶段是bolt阶段,主要负责数据的处理,既然我们是要实现WordCount,所以Bolt数据处理阶段又分为两个过程,分别是单词的切分过程split和单词的汇总过程count,这两个过程都是bolt阶段。好,那么我们需要构建4个类,分别为:

WordCountTopology.Java

SentenceSpout.java

SplitBolt.java

CountBolt.java

如图:

(尖叫提示:Storm中的Spout和Bolt类必须是可序列化的,IDEA工具如何生成serialVersionUID请查看该文章:IDEA工具生成serialVersionUID

Step7、SentenceSpout.java实现细节

Step8、SplitBolt.java实现细节

Step9、CountBolt实现细节

Step10、WordCountTopology实现细节

Step11、激动人心的测试,Run起来之后,可以看到不停的有类似这样的结果输出

Step12、打包提交到集群测试

打包时记得provided这个属性注释打开。

或者你使用IDEA自带的打包工具(请参考SparkCore(二)Spark打包部分内容)

总之你就是要弄个jar包出来,一切了然之后,我们先kill掉之前运行的wordcount,然后运行我们自己打出来的jar包。

$ bin/storm jar storm_syllabus.jar com.z.WordCountTopology ZWordCount

UI界面查看:

注意,如果提交任务后,jps查看不到worker进程,也许是worker进程运行在其他节点,请依次查看。

so easy,right?

* 总结

学习完Spark后再学习Storm会简单很多,可以类比着来学习,其分布式运算的思想大多都有交集之处,慢慢体会。下一节我们继续探讨Storm框架。



个人微博:http://weibo.com/seal13

QQ大数据技术交流群(广告勿入):476966007


作者:Z尽际链接:https://www.jianshu.com/p/7e5fc624861b來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/wzlbigdata/p/8277759.html

时间: 2024-11-09 19:57:10

Storm框架基础(一)的相关文章

Flume框架基础

* Flume框架基础 框架简介: ** Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集.聚集.移动的服务,Flume只能在Unix环境下运行. ** Flume基于流式架构,容错性强,也很灵活简单,主要用于在线实时的引用分析. 宏观认知: ** Flume.Kafka用来实时进行数据收集,Spark.Storm用来实时处理数据,impala用来实时查询. Flume架构图: 如果所示,Flume架构只有一个Agent角色节点,该角色节点由Source.Channel.Sink

Kafka框架基础

* Kafka框架基础 官网:kafka.apache.org 框架简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交日志服务. 相关概念 ** 生产者 提供数据源生产的地方,对于同一个topic,生产者只能有一个,这样可以确保同一个topic数据来自同一个业务数据,支持多并发 ** 消费者 消费数据的客户端,对于同一个topic,可以有多个消费者

框架基础:关于ajax设计方案(三)---集成ajax上传技术

之前发布了ajax的通用解决方案,核心的ajax发布请求,以及集成了轮询.这次去外国网站逛逛,然后发现了ajax level2的上传文件,所以就有了把ajax的上传文件集成进去的想法,ajax方案的level2的改进就不介绍了,不清楚的可到前几篇博客去看看.我们直接切入主题. 概念介绍: 1. js的FormData:js中在新的版本中已经支持了FormData对象,可以初始化一个空的form,或者初始化已经存在的form,浏览器测试代码. 2. 浏览器的支持:浏览器已支持input=file的

框架基础:ajax设计方案(三)---集成ajax上传技术

之前发布了ajax的通用解决方案,核心的ajax发布请求,以及集成了轮询.这次去外国网站逛逛,然后发现了ajax level2的上传文件,所以就有了把ajax的上传文件集成进去的想法,ajax方案的level2的改进就不介绍了,不清楚的可到前几篇博客去看看.我们直接切入主题. 概念介绍: 1. js的FormData:js中在新的版本中已经支持了FormData对象,可以初始化一个空的form,或者初始化已经存在的form,浏览器测试代码. 2. 浏览器的支持:浏览器已支持input=file的

框架基础:ajax设计方案(一)---集成核心请求

框架基础:ajax设计方案(一)---集成核心请求 框架基础:ajax设计方案(一)---集成核心请求 报告,我要说话!xp被历史淘汰了,IE6 say goodbye了,太TM开心了,从此不要兼容IE6了,哈哈哈哈哈哈 报告,我要说话!IE这sb为啥不早点被杀掉呢,找工作听说要兼容IE,立马软了,唉唉唉唉唉唉 报告,我要说话!Jquery太丰富了,老子只用了几个功能,妈的,太不划算了,啊啊啊啊啊啊 ...... 好了,言归正传.对于想到整理ajax设计方案,原因如下: 从资源合理利用的角度以及

(C/C++)基于SharpUI控件库的插件式框架开发--第三篇框架基础服务库

一个框架基础的东西,一般也是操作的最基础的类,比如char.int.bool等,有时出现内存泄露的问题导致错误的抛出,但是C++开发有的时候就算是抛出异常,那也是靠经验来积累才能非常快速准确的找出错误所在,这就需要在框架中需要添加日志管理的接口,日志管理的好处就是开发者自身在找异常时提供参考,另一个就是如果用户操作时出现问题,也可将日志反馈,帮助快速解决问题:总之了为了更好的扩展完善我的框架,我详细列一下这个基础服务库(XPCore)包含内容: 虽说sharpui控件库内封闭好string类,但

Hibernate框架基础

Hibernate框架基础 Hibernate框架 ORM概念 O, Object 对象 R, Realtion 关系 (关系型数据库: MySQL, Oracle-) M,Mapping 映射 ORM, 对象关系映射! ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象? 想做到上面2点,必须要有映射! 总结: Hibernate与ORM的关系? Hibernate是ORM的实现! Hibernate HelloWorld案例 搭建一个H

深入浅出ExtJS(第三版) Ext框架基础

1 1.准备工作 2 >.深入浅出Ext JS(第3版) 3 >.随书代码(图灵社区) 4 >.ExtJS 4.1.1a 5 6 第2章 Ext框架基础 7 2.1 面向对象的基础架构 8 2.1.1 创建类 9 >.定义一个类: 10 Ext.define('demo.Demo',{ 11 name:'Lingo', 12 hello:function () { 13 return 'Hello'+this.name; 14 } 15 }); 16 //第一个参数是字符串类型的类

(转)Hibernate框架基础——一对多关联关系映射

http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即集合元素是普通类型).现在从本文开始我们就要介绍实体类型的集合(即集合元素是另一个实体)了. 一对多关联关系映射 我们还是以一个活生生的例子来详解一对多关联关系映射吧!就以部门和员工的关系为例. 单向关联:仅仅建立从Employee到Department的多对一关联,即仅仅在Employee类中定义