storm trident 事務和 spout和state有關
阿新 • • 發佈:2018-05-27
batch 寫到 eval BE prev storm 數據 基類 是否
首先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!
storm trident 事務和 spout和state有關