storm中spout和bolt java api有什么用

小编给大家分享一下storm中spout和bolt java api有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

Component

Storm中,Spout和Bolt都是其Component。所以,Storm定义了一个名叫IComponent的总接口

storm中spout和bolt java api有什么用

图谱如下:

storm中spout和bolt java api有什么用

绿色部分是我们最常用、比较简单的部分。红色部分是与事务相关的,在以后的文章会具体讲解。

BaseComponent 是Storm提供的“偷懒”的类。为什么这么说呢,它及其子类,都或多或少实现了其接口定义的部分方法。这样我们在用的时候,可以直接继承该类,而不是自己每次都写所有的方法。但值得一提的是,BaseXXX这种定义的类,它所实现的方法,都是空的,直接返回null。

Spout

在前面基本例子中,我们实现了一个RandomSpout,来看看其类图

storm中spout和bolt java api有什么用

  • Spout的最顶层抽象是ISpout接口。

storm中spout和bolt java api有什么用

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

 ExclaimBasicBolt的类图: 

storm中spout和bolt java api有什么用

这里可以看到一个奇怪的问题:
为什么IBasicBolt并没有继承IBolt?
我们带着问题往下看。

IBolt定义了三个方法:

storm中spout和bolt java api有什么用

IBolt继承了java.io.Serializable,我们在nimbus上提交了topology以后,创建出来的bolt会序列化后发送到具体执行的worker上去。worker在执行该Bolt时,会先调用prepare方法传入当前执行的上下文
execute接受一个tuple进行处理,并用prepare方法传入的OutputCollector的ack方法(表示成功)或fail(表示失败)来反馈处理结果
cleanup 同ISpout的close方法,在关闭前调用。同样不保证其一定执行。
红色部分是Bolt实现时一定要注意的地方。而Storm提供了IBasicBolt接口,其目的就是实现该接口的Bolt不用在代码中提供反馈结果了,Storm内部会自动反馈成功。
如果你确实要反馈失败,可以抛出FailedException。

我们来再写一个Bolt继承BaseRichBolt替代ExclaimBasicBolt。代码如下:

public
class
ExclaimRichBolt
extends
BaseRichBolt {
 
    
private
OutputCollector collector;
     
    
@Override
    
public
void
prepare(Map stormConf, TopologyContext context,
            
OutputCollector collector) {
        
this
.collector = collector;
    
}
 
    
@Override
    
public
void
execute(Tuple tuple) {
        
this
.collector.emit(tuple,
new
Values(tuple.getString(
0
)+
"!"
));
        
this
.collector.ack(tuple);
    
}
 
    
@Override
    
public
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"
);

运行下,结果一致。

结论:

通常情况下,实现一个Bolt,可以实现IRichBolt接口或继承BaseRichBolt,如果不想自己处理结果反馈,可以实现IBasicBolt接口或继承BaseBasicBolt,它实际上相当于自动做掉了prepare方法和collector.emit.ack(inputTuple);

看完了这篇文章,相信你对“storm中spout和bolt java api有什么用”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/230384.html

(0)
上一篇 2022年1月15日
下一篇 2022年1月15日

相关推荐

发表回复

登录后才能评论