IBolt IRichBolt IBasicBolt IBatchBolt 区分

本文介绍了Apache Storm中Bolt接口的不同类型及其实现方式,包括IBolt、IRichBolt、IBasicBolt和IBatchBolt等。重点讨论了这些接口如何帮助开发者简化消息处理流程,特别强调了IBasicBolt接口如何通过BasicBoltExecutor减轻开发者的负担。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

:IBolt :定义了Bolt的功能集合,主要有
void prepare(Map stormConf,TopologyContext context,OutputCollector collector);
void execut(e Tuple input);
void cleanup();
三个方法


二:IRichBolt需要实现IBolt和IComponent接口
public interface IRichBolt extends IBolt, IComponent {
}

三:IBasicBolt: 接口定义与IBolt基本一致,具体的实现要求也与IBolt相同,
区别在于以下两点:
1:他的收集器用的是BasicOutputCollector,并且该参数放在execute的方法中二不是perpare中
2:他实现了IComponent 接口
源码:
public interface IBasicBolt extends IComponent {
void prepare(Map stormConf, TopologyContext context);
/**
* Process the input tuple and optionally emit new tuples based on the input tuple.
*
* All acking is managed for you. Throw a FailedException if you want to fail the tuple.
*/
void execute(Tuple input, BasicOutputCollector collector);
void cleanup();
}
为什么会有这个接口,作用是提供一种更简单的Bolt编写方式,基于IBasicBolt编写的好处是storm框架帮你处理发出消息的Ack,Fail和Anchor操作,这是由执行器BasicBoltExecutor
实现的。
BasicBoltExecutor 已经帮你实现了IRichBolt
源码:
public class BasicBoltExecutor implements IRichBolt {
public static final Logger LOG = LoggerFactory.getLogger(BasicBoltExecutor.class);
private IBasicBolt _bolt;
private transient BasicOutputCollector _collector;
public BasicBoltExecutor(IBasicBolt bolt) {
_bolt = bolt;
}

public void declareOutputFields(OutputFieldsDeclarer declarer) {
_bolt.declareOutputFields(declarer);
}

public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
_bolt.prepare(stormConf, context);
_collector = new BasicOutputCollector(collector);
}

public void execute(Tuple input) {
_collector.setContext(input);
try {
_bolt.execute(input, _collector);
_collector.getOutputter().ack(input);
} catch(FailedException e) {
if(e instanceof ReportedFailedException) {
_collector.reportError(e);
}
_collector.getOutputter().fail(input);
}
}

public void cleanup() {
_bolt.cleanup();
}

public Map<String, Object> getComponentConfiguration() {
return _bolt.getComponentConfiguration();
}
}


四 :IBatchBolt

IBatchBolt主要用于storm中的批处理,目前storm主要用该接口来实现消息的可靠传输,storm的事务Topology以及Trident主要是基于IBatchBolt的,相比以上三个,它多了一个finishBatch 方法,它在一个批处理结束时候被调用。此外,IBatchBolt还除去了cleanup方法。


public class BatchBoltExecutor implements IRichBolt, FinishedCallback, TimeoutCallback {
public static final Logger LOG = LoggerFactory.getLogger(BatchBoltExecutor.class);

byte[] _boltSer;
Map<Object, IBatchBolt> _openTransactions;
Map _conf;
TopologyContext _context;
BatchOutputCollectorImpl _collector;
public BatchBoltExecutor(IBatchBolt bolt) {
_boltSer = Utils.javaSerialize(bolt);
}
@Override
public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
_conf = conf;
_context = context;
_collector = new BatchOutputCollectorImpl(collector);
_openTransactions = new HashMap<>();
}

@Override
public void execute(Tuple input) {
Object id = input.getValue(0);
IBatchBolt bolt = getBatchBolt(id);
try {
bolt.execute(input);
_collector.ack(input);
} catch(FailedException e) {
LOG.error("Failed to process tuple in batch", e);
_collector.fail(input);
}
}

@Override
public void cleanup() {
}

@Override
public void finishedId(Object id) {
IBatchBolt bolt = getBatchBolt(id);
_openTransactions.remove(id);
bolt.finishBatch();
}

@Override
public void timeoutId(Object attempt) {
_openTransactions.remove(attempt);
}

@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
newTransactionalBolt().declareOutputFields(declarer);
}
@Override
public Map<String, Object> getComponentConfiguration() {
return newTransactionalBolt().getComponentConfiguration();
}
private IBatchBolt getBatchBolt(Object id) {
IBatchBolt bolt = _openTransactions.get(id);
if(bolt==null) {
bolt = newTransactionalBolt();
bolt.prepare(_conf, _context, _collector, id);
_openTransactions.put(id, bolt);
}
return bolt;
}
private IBatchBolt newTransactionalBolt() {
return Utils.javaDeserialize(_boltSer, IBatchBolt.class);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值