Strom Trident详解
Trident介绍
Trident是在Storm基础上,一个以实时计算为目标的高度抽象。 它在提供处理大吞吐量数据能力(每秒百万次消息)的同时,也提供了低延时分布式查询和有状态流式处理的能力。 除了提供一套简单易用的流数据处理API之外,它以batch(一组tuples)为单位进行处理,这样一来,可以使得一些处理更简单和高效,Trident 还提供了一些专门的原语,从而在基于数据库或者其他存储的前提下来应付有状态的递增式处理。Trident也提供一致性(consistent)、有且仅有一次(exactly-once)等语义,这使得我们在使用trident toplogy时变得容易。
exactly-once
Trident的exactly-once原理,将整个topolopy划分为两个阶段(precossing阶段,committer阶段)。precossing阶段是并行的,commiter阶段保证强有序。
spout事务api
precossing会发送一个事务性spout,
@Override
public Coordinator getCoordinator(Map map, TopologyContext topologyContext) {
//实例化一个Coordinator
}
@Override
public Emitter getEmitter(Map map, TopologyContext topologyContext) {
//实例化一个Emitter
return null;
}
ITransactionalSpout中有两个内部类,Emitter(去发送实际的tuple),Coordinator(发送一个事务Tuple,此Tuple为beginPoint,BatchNum),ITransactionalSpout方法也只是提供Emitter和Coordinator的获取,
Emitter api
public interface Emitter<X> {
//将真正的tuple封装一个batch发送给下游
void emitBatch(TransactionAttempt var1, X var2, BatchOutputCollector var3);
void cleanupBefore(BigInteger var1);
void close();
}
public interface Coordinator {
//将offset和batchNum封装到一个bean中发送个下游
X initializeTransaction(BigInteger var1, X var2);
boolean isReady();
void close();
}
Blot api
IBatchBlot
public interface IBatchBolt<T> extends Serializable, IComponent {
void prepare(Map var1, TopologyContext var2, BatchOutputCollector var3, T var4);
void execute(Tuple var1);
//execute做逻辑操作
void finishBatch();
//在此方法中做事务id比较,判断是否要更新偏移量
}