首先spout有三种:这些关系到相同的batchid里面是否包含相同的tuple
事务性:相同
模糊事务性:如果取不到原来的,则拿新的
无事务:不一定
所以只有事务性才能做到一个tuple唯一一次处理
模糊事务性 才能做到 最多处理一次
而无事务,则可能处理多次
————————
而在State这里,
它会提供两个方法基类方法:
beginCommit(Long txid)
commit(Long txid)
来完成事务性操作
如果真正要完成事务型操作,需要写txid或者preval到数据库里,才能真正实现数据的事务
这需要实现上面两个方法,storm已经提供了实现了这两个方法的State,这样写到数据库里,会有额外信息,比如MemcacheState
但是很多State在这两个方法的实现里都是空,所以也就是并没有做相关的数据,只是简单的数据持久化
但是要做到一条数据最多只被处理一次,那么只需要控制spout就可以了,State不需要做什么
对State可以有query,update方法,来将数据通过State方法,持久化!!
persist的时候,需要调用getStateFactory操作回去StateFactory,然后要有一个updater方法,里面调用State的update方法,来实现数据的持久化
查询的过程,是StateFactory+query方法,这个query方法调用State的query方法
State里的update和query,最好是批量的,这样可以减少和数据库的交互次数!!
可以研究一下Hbase的State!
原文地址:https://www.cnblogs.com/brainstorm/p/9094890.html
时间: 2024-09-30 03:31:15