storm Trident

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Em_dark/article/details/84303368

Trident topology.

Trident 在storm上提供了高层抽象,抽象掉了事务处理和状态管理的细节.
Trident topology
trident 引入了"数据批次概念" batch每个batch会分配一个唯一的事务标识符,spout基于决定batch的组成方式,分为三种非事务性(non-transational),事务性(transational),非透明性(opaque).
非事务性可能出现重复,两个不同的batch可能有相同的tuple,内容可能变化
非透明性,保证数据是不重复的,但是不保证内容是不变的
事务性保证不重复,每个batch总是包含相同的tuple

Trident spout

spout 并没有正的发射tuple,而是把工作分解给了batchcoordinator和emitter方法,emitter负责发送tuple,batchcoordinator负责管理批次和元数据,

Trident 操作 filter和funcition

通过stream对象的方法来调用
通常,应用运算需要声明一个输入域集合和一个输出域集合,也就是funcition域上.
filter 过滤器 继承BaseFilter ,过滤掉不需要的tuple,写在iskeep()方法中,返回true的将会被发送到下游进行操作.在数据流上使用each(inputFields,filter)方法将过滤器应用到数据流的每个tuple中

function
function和storm的bolt 类似,读取tuple并且发送新的tuple,有个区别是trident function只能添加数据
继承自baseFunction,function声明的字段数量必须和他发射出值得字段数一直,如果不一致就会抛出IndexOutOfBoundsException 异常.

filter不能改变tuple,当我们既想用过滤又想添加字段时必须使用function.

Trident 聚合 Combiner和Reducer

aggregator(聚合器)允许topology组合tuple,不同的是它会替换tuple的字段和值,有三种聚合器,combinerAggregator,ReducerAggregator,和Aggregator,
combinerAggregator:将一个集合的tuple组合到一个单独的字段中,Storm对每个tuple调用init()方法,然后重复调用combine()方法指导一个分片的数据处理完成, 传递给combine()方法的两个参数是局部聚合的结果,以及调用了init()返回的值.如果分片是空的storm会发送zero()方法执行的返回
ReducerAggregator:用init()方法来获取原始值,然后分片中的每个tuple调用reduce()方法,直到分片数据处理完成,第一个参数是局部的聚合结果,这个方法的实现需要将第二个参数tuple合并到局部聚会结果中返回
Aggregator:最通用的聚合操作. 有T init(Object batchId,TridentCollector collector)
void aggregate(T val,TridentTuple tuple,TridentCollector collector)
void complete(T val,TridentCollector collector)
Aggregator接口的aggregate()方法和function接口的execute()方法类似,但是多了个value参数,这个就可以处理tuple的时候积累值,还有一些默认可以直接使用的如new Count()

Trident 状态 state

我们已经给每个aggregator的分组数据进行了技术,现在想将信息进行持久化存储,以便分析,在trident中,持久化操作从状态管理开始.trident对状态有底层的操作原语.
trident使用一个工厂类来生成state实例,工厂类返回一个state对象,storm用它来持久化储存信息,有三种状态
非事务性
重复事务性 :最后一批提交的数据的标志符存在数据中,当且仅当一批数据标识符的序号大于当前标识符时,才进行更新操作,如果小于或者等于当前标志符,将会忽略更新操作.
不透明事务性:通过存储当前状态和前一次状态来允许批次的数据组成发生变化,
storm 提供了map的实现来屏蔽复杂性,NonTransactionalMap,TransacitonalMap,OpaqueMap等,

没有更多推荐了,返回首页