Storm应用系列之——Spout、Bolt API
来源:互联网 发布:网络棋牌游戏输钱自杀 编辑:程序博客网 时间:2024/06/11 02:36
前言:
昨天有朋友聊天说,我写的前面三篇太简单了,没有太多深入的东西。好吧,这说明我的目的达到了。我写这个系列的原因就是为了面向应用,进一步细化为两点:
1. 以例子说话,由简入深,一步步了解如何在Storm上开发应用,不会读起来吃力;
2. 对于一些原理性的东西,不去过于深究,只要记住Storm是这样实现的,开发的时候加以利用或规避。
在明白了这些基础的东西以后,如果对于原理性的东西Storm是如何实现的感兴趣,可以再去看源代码也不迟。毕竟这部分对开发应用的帮助并不直接。我认为,不必每个用Storm的人都必须了解Storm底层是如何实现的,当然,我会尝试在适当的位置插入相关原理性解释的链接,有兴趣可以直接去看看。就此原因,我把标题改成“Storm应用系列”。
注:转帖请注明,原帖地址:
http://blog.csdn.net/xeseo/article/details/17750379
Component
Spout
在前面基本例子中,我们实现了一个RandomSpout,来看看其类图
- Spout的最顶层抽象是ISpout接口。
open方法是初始化动作。允许你在该spout初始化时做一些动作,传入了上下文,方便取上下文的一些数据。
close方法在该spout关闭前执行,但是并不能得到保证其一定被执行。spout是作为task运行在worker内,在cluster模式下,supervisor会直接kill -9 woker的进程,这样它就无法执行了。而在本地模式下,只要不是kill -9, 如果是发送停止命令,是可以保证close的执行的。
activate和deactivate :一个spout可以被暂时激活和关闭,这两个方法分别在对应的时刻被调用。
nextTuple 用来发射数据。
ack(Object)
传入的Object其实是一个id,唯一表示一个tuple。该方法是这个id所对应的tuple被成功处理后执行。
fail(Object)
同ack,只不过是tuple处理失败时执行。
我们的RandomSpout 由于继承了BaseRichSpout,所以不用实现close、activate、deactivate、ack、fail和getComponentConfiguration方法,只关心最基本核心的部分。
结论:
通常情况下(Shell和事务型的除外),实现一个Spout,可以直接实现接口IRichSpout,如果不想写多余的代码,可以直接继承BaseRichSpout。
Bolt
- IBolt继承了java.io.Serializable,我们在nimbus上提交了topology以后,创建出来的bolt会序列化后发送到具体执行的worker上去。worker在执行该Bolt时,会先调用prepare方法传入当前执行的上下文
- execute接受一个tuple进行处理,并用prepare方法传入的OutputCollector的ack方法(表示成功)或fail(表示失败)来反馈处理结果
- cleanup 同ISpout的close方法,在关闭前调用。同样不保证其一定执行。
public class ExclaimRichBolt extends BaseRichBolt {private OutputCollector collector;@Overridepublic void prepare(Map stormConf, TopologyContext context,OutputCollector collector) {this.collector = collector;}@Overridepublic void execute(Tuple tuple) {this.collector.emit(tuple, new Values(tuple.getString(0)+"!"));this.collector.ack(tuple);}@Overridepublic void declareOutputFields(OutputFieldsDeclarer declarer) {declarer.declare(new Fields("after_excl"));}}修改topology
//builder.setBolt("exclaim", new ExclaimBasicBolt(), 2).shuffleGrouping("spout");builder.setBolt("exclaim", new ExclaimRichBolt(), 2).shuffleGrouping("spout");运行下,结果一致。
- Storm应用系列之——Spout、Bolt API
- Storm应用系列之——Spout、Bolt API
- Storm——spout,bolt
- Storm之Spout、Bolt、Topology组件
- Storm bolt/spout生命周期
- Storm拓扑,组件之spout、bolt,并行策略
- Storm中Spout和Bolt的生命周期
- Storm的Spout和Bolt中的方法
- (大数据之storm)strom中worker、task、spout/bolt、executor、component的关系
- 流处理旅程——storm之spout介绍
- storm中supervisor, task, worker, spout, bolt之间的关系
- storm spout,bolt超时处理和fail处理
- Storm 基础 -- spout与bolt设置多重grouping
- Storm使用非java语言构建Bolt,Spout
- Kafka+Storm+HBase项目Demo(5)--topology,spout,bolt使用
- Storm系列(十五)架构分析之Executor-Spout
- Storm系列(十六)架构分析之Executor-Bolt
- Storm中的process,thread,task和spout对象实例,bolt对象实例
- Mapr使用数据(四)——MAPR指标和工作绩效
- 二叉树非递归遍历(前序、中序、后序)
- Mapr使用数据(五)——Maven资源库和工件MAPR
- Mapr与Cascading工作
- sizeof 点点滴滴
- Storm应用系列之——Spout、Bolt API
- 写给2014年的自己
- js实现同名checkbox的全选/全取消和反选
- 人体内脏分布图:人体五脏六腑位置图详细介绍
- sqlite数据库存入的时候出现 unrecognized token: ""错误
- fgdgdsgert
- Freeradius : 执行 radiusd -X Failed
- Stacking Autoencoders vs DBN
- Mapr与Cascading工作(一)——升级Cascading