Storm+Kafka+Hbase的wordcount统计

本文介绍了Storm作为实时大数据处理框架的特性,包括其简单的编程模型、高吞吐量和低延迟。文章详细阐述了Storm的架构,包括拓扑、Worker、Executor和Spout/Bolt的原理。此外,还讨论了Storm的安装过程,并给出了一个基于Kafka和Hbase的WordCount程序实例。
摘要由CSDN通过智能技术生成

个人GitHub地址 :https://github.com/LinMingQiang

Storm介绍

Storm是Twitter开源的分布式实时大数据处理框架,最早开源于github,从0.9.1版本之后,归于Apache社区。Strom是一个实时处理的框架,跟sparkstreaming的准实时的有本质的区别,storm对数据的处理是以条为单位,sparkstreaming是以时间为单位。

Storm的特点

编程简单:开发人员只需要关注应用逻辑,而且跟Hadoop类似,Storm提供的编程原语也很简单
高性能,低延迟:可以应用于广告搜索引擎这种要求对广告主的操作进行实时响应的场景。
分布式:可以轻松应对数据量大,单机搞不定的场景
可扩展: 随着业务发展,数据量和计算量越来越大,系统可水平扩展
容错:单个节点挂了不影响应用
消息不丢失:保证消息处理
不过Storm不是一个完整的解决方案。使用Storm时你需要关注以下几点:
如果使用的是自己的消息队列,需要加入消息队列做数据的来源和产出的代码
需要考虑如何做故障处理:如何记录消息队列处理的进度,应对Storm重启,挂掉的场景
需要考虑如何做消息的回退:如果某些消息处理一直失败怎么办?

Strom框架的结构

  • 拓扑(Topologies)
  • work
  • task
  • Spouts(喷嘴)
  • Bolts
拓扑(Topologies)

Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:
1. Worker(进程)
2. Executor(线程)
3. Task
一个Storm拓扑打包了一个实时处理程序的逻辑。一个Storm拓扑跟一个MapReduce的任务(job)是类似的。主要区别是MapReduce任务最终会结束,而拓扑会一直运行(当然直到你杀死它)。一个拓扑是一个通过流分组(stream grouping)把Spout和Bolt连接到一起的拓扑结构。图的每条边代表一个Bolt订阅了其他Spout或者Bolt的输出流。一个拓扑就是一个复杂的多阶段的流计算
这里写图片描述

Work

每个worker进程使用一个但单独的端口来收取消息,这里配置了哪个端口用来使用。
定义5个端口,那么该节点上允许最多运行5个worker进程。
默认情况下,可以在端口6700, 6701, 6702, 6703四个端口最多运行四个worker进程
在$STORM_HOME/conf/storm.yaml 里面配置supervisor.slots.ports:
这里写图片描述
敲黑板重点:
- 一个Worker 进程执行的是一个topology的子集,这里我们必须强调:不会存在一个worker 为多个topology服务,
- 一个worker进程会启动一个或则多个executor 线程来执行一个topology的compotent-》也就是Spout或者bolt
- 一个topology就是由于集群中间的多台物理机上的Worker构成的
代码里面设置work数目:config.setNumWorkers(10)
- 如果worker使用完的话再提交topology就不会执行,因为没有可用的worker,只能处于等待状态,把之前运行的topology停止一个之后这个就会继续执行了,

Excutor

一个executor是一个被Worker进程启动的单独线程,每一个Executor都只会运行一个topology的一个component
- 默认情况:一个spout,或则一个bolt都只会生成一个task,Executor线程里会在每次 循环的时候 顺序的去调用所有的task的实例子
- 默认情况:一个executor对应一个task,可以通过配置文件,或者API来设置
敲黑板:excutor是一个storm程序的真正并行度。虽然task是执行程序的计算单位,但是task都是在excutor里面运行,如果excutor只有2个,你设置task为4。那同时在运行的task也只能有2个
代码设置:builder.setBolt(“AggregateBolt”, new AggregateBolt(), 28)后面的28就是excutor的数量。
如果要设置task数就再加一行.setNumTasks(28)
- excutpr的数量是可以动态增加的。在ui页面上点击Rebalance

Spouts(喷嘴)

Spout(喷嘴,这个名字很形象)是Storm中流的来源。通常Spout从外部数据源,如消息队列中读取元组数据并吐到拓扑里。Spout可以是可靠的(reliable)或者不可靠(unreliable)的。可靠的Spout能够在一个元组被Storm处理失败时重新进行处理,而非可靠的Spout只是吐数据到拓扑里,不关心处理成功还是失败了。

Spout可以一次给多个流吐数据。此时需要通过OutputFieldsDeclarer的declareStream函数来声明多个流并在调用SpoutOutputCollector提供的emit方法时指定元组吐给哪个流。

Spout中最主要的函数是nextTuple,Storm框架会不断调用它去做元组的轮询。如果没有新的元组过来,就直接返回,否则把新元组吐到拓扑里。nextTuple必须是非阻塞的,因为Storm在同一个线程里执行Spout的函数。

Spout中另外两个主要的函数是ack和fail。当Storm检测到一个从Spout吐出的元组在拓扑中成功处理完时调用ack,没有成功处理完时调用fail。只有可靠型的Spout会调用ack和fail函数

Bolts

在拓扑中所有的计算逻辑都是在Bolt中实现的。一个Bolt可以处理任意数量的输入流,产生任意数量新的输出流。Bolt可以做函数处理,过滤,流的合并,聚合,存储到数据库等操作。Bolt就是流水线上的一个处理单元,把数据的计算处理过程合理的拆分到多个Bolt、合理设置Bolt的task数量,能够提高Bolt的处理能力,提升流水线的并发度。

Bolt可以给多个流吐出元组数据。此时需要使用OutputFieldsDeclarer的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值