storm 基础知识

Apache Storm 是一个开源的分布式、实时、可扩展、容错的计算系统。Apache Storm Storm可以很容易做到可靠地处理无限的数据流,像Hadoop批量处理大数据一样。Storm处理速度很快,每个节点每秒钟可以处理超过百万的数据组。
Apache Storm应用的场景例如:实时分析、在线机器学习、连续计算、分布式RPC、ETL 等。

水源源不断的从水龙头流出来,可以流到到不同的池子,然后最后汇合到一个池子 ,形象的描述了Storm可以处理无限的数据流,经过每个节点,可以对数据进行过滤、计算等操作,然后在发送到下一个节点进行处理。

二、Storm架构

Apache Storm分布式集群主要节点由控制节点(Nimbus节点)和工作节点(Supervisor节点),控制节点可以一个,工作节点多个组成的,而Zookeeper主要负责Nimbus节点和Supervisor节点之间的协调工作。

Nimbus节点负责资源分配和任务分配,通过Zookeeper监控Supervisor状态,Supervisor节点定期接受Nimbus节点分配任务,并会从Nimbus下载代码,并启动对应的worker进程并监控worker 状态,每一worker是一个独立的JVM进程,Worker中运行Spout/Bolt线程Task任务,Storm使用zookeeper来协调整个集群,状态信息(Nimbus分发的任务、Supervisor、worker的心跳等)都保存在Zookeeper上。

三、分布式实时计算应用结构

Apache Storm 是一个开源的分布式、实时计算应用,实时计算应用它是由Topologys、Streams、Spouts、Bolts、Stream groupings等元素组成的。

1、Topologys(拓扑)
Storm的Topologies是一个分布式实时计算应用,它通过Stream groupings把spouts和Bolts串联起来组成了流数据处理结构,Topologies在集群中一直运行,直到kill(storm kill topology-name [-w wait-time-secs]) 拓扑时扑才会结束运行。
运行一个拓扑只要把代码打包成一个jar,然后在storm集群环境下,执行命令
storm jar topology-jar-path class........
拓扑运行模式:本地模式和分布式模式。
本地模式:
[html] view plain copy
LocalCluster cluster = new LocalCluster();
Topology("word-count", conf, builder.createTopology());

分布式模式:
[html] view plain copy
conf.setNumWorkers(2);
Topology(args[0], conf, builder.createTopology());


2、Streams(数据流)
Streams是storm最核心的抽象概念,一个Stream是一个没有边界的tuple序列,Streams是由Tuple(元组)组成的,Tuple支持的类型有Integer、 Long、 Short、Byte、String、Double、Float、Boolean、Byte arrays。Tuple也支持可序列化的对象。

Tuple是数据流中的一个基本处理单元,包含了多个Field和对应的值,可以理解为key-value的map,因为Bolt中通过declareOutputFields事先定义好往下传的字段名称,所以在构造Tuple时,只要传入对应的value(value List)。
1)declareOutputFields事先定义好往下传的字段名称
[java] view plain copy
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
//定义了传到下一个bolt的字段描述
declarer.declare(new Fields("field"));
}

2)然后通过emit要填充value
[java] view plain copy
collector.emit(new Values(value))


说明:
1)数据流都有默认的id(streamId=default)

[java] view plain copy
public List<Integer> emit(List<Object> tuple) {
return emit(Utils.DEFAULT_STREAM_ID, tuple);
}
---源代码
2)我们可以自己定义数据流Id,declareOutputFields事先定义好往下传的字段名称时,可以声明对应的数据流ID: declarer.declareStream("streamId", new Fields("field"))

3、Spouts(数据源)

Spout是拓扑的数据流的源头,Spout不断的从外部读取数据(数据库、kafka等外部资源),并发送到拓扑中进行实时的处理。
Spout是主动模式,Spout继承BaseRichSpout或者IRichSpout类不断的调用nextTuple()函数,然后通过emit发送数据流。
参数说明:
Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS:一个Tuple元组全部完成的最大等待时间,默认是30秒;
Config.TOPOLOGY_MAX_SPOUT_PENDING:设置一次等候单个spout任务的元组最大的数量,(等候意味着这元组没有被acked或失败),设置这个值可以防止队列溢出

4、Bolts(数据流处理组件)
Bolt接收Spout或者上游的Bolt发来的Tuple(数据流),然后对数据流进行处理(数据的过滤、统计等等的操作)。
Bolt是被动模式,Bolt继承BaseBasicBolt类或者IRichBolt 接口等来实现,当 Bolt接收Spout或者上游的Bolt发来的Tuple(数据流)时调用execute 方法,并对数据流进行处理完,OutputCollector的emit 发送数据流,execute 方法在Bolt中负责接收数据流和发送数据流。

5、Stream groupings(数据流分组)
Storm是通过Stream groupings把spouts和Bolts串联起来组成了流数据处理结构 。
Storm对Stream groupings定义了8种数据流分组方式:
1)Shuffle grouping(随机分组):对Tuple(数据流)随机的分发到下一个bolt的Tasks(任务),每个任务同等机会获取Tupe,保证了集群的负载均衡。
2)Fields grouping(字段分组):对指定的字段对数据流进行分组,相同的字段对应的数据流都会交给同个bolt中Task来处理,不同的字段的数据流会分发到不同的Task来处理。
3)Partial Key grouping(部分字段分组):按字段进行分组,这种跟Fields grouping很相似,但这种方式会考虑下游 Bolt 数据处理的均衡性问题,会提供更好的资源利用,可以参考官方的解释。
4)All grouping(完全分组): Tuple(数据流)会被同时的发送到下一个bolt中的所有Task(任务)。
5)Global grouping(全局分组):Tuple(数据流)会被发送到 Bolt 的同一个Id 最小的Task(任务)。
6)None grouping(无分组):使用这种方式说明你不关心数据流如何分组。目前这种方式的结果与随机分组完全等效,不过未来可能会考虑通过非分组方式来让 Bolt 和它所订阅的 Spout 或 Bolt 在同一个线程中执行。
7)Direct grouping(直接分组):通过OutputCollector emitDirect 方法指定下一个bolt的具体Task来处理。
8)Local or shuffle grouping(本地或随机分组):如果目标 Bolt 有一个或更多的任务在相同的Worker进程中,Tuple就发送给这些Task,否则Tuple会被随机分发(跟Shuffle grouping一样)。

6、Reliability(可靠性)
Storm 为了保证spout发送的tuple能够成功的处理,通过 tuple 树跟踪每个Tuple是否被成功的处理。Storm有配置一个Tuple元组全部完成的最大等待时间,如果超过这个时间,就默认这个Tuple失败,重新发送Tuple。通过这种机制保证了Tuple的可靠性。可以参考官方文档对数据处理说明
Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS:一个Tuple元组全部完成的最大等待时间,默认是30秒。

7、Tasks(任务)
Task是对应一个spoout或者bolt实例,在Storm集群中每个spoout或者bolt对应多个Task来执行,spoout或者bolt设置多个并行度(setSpout/setBolt),就有对应的多个个Task,spoout的nextTuple()/bolt 的execute() 会被执行。

8、Workers(工作进程)
拓扑运行在一个或者多个worker上,每一worker是一个独立的JVM进程,进程里面包含一个或者多个executor(线程),一个线程会处理一个或者多个Task(任务)。
Config.TOPOLOGY_WORKERS设置worker数量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值