分享

流式计算在容错方面的考虑

nettman 发表于 2014-6-9 15:52:07 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 1 15073
本帖最后由 nettman 于 2014-6-9 15:54 编辑

问题导读:
1.流式计算,在容错方面有几种方法?
2.什么是世袭?
3.为什么要状态持久化?
4.xor在storm是如何应用的那?






流式计算,在容错方面手段有几种:

1、  流数据重放(stream replay)

流数据在处理过程中,可能会出现错误,这时需要支持数据的重放,比如从出现错误的点重新执行一遍等等,因此对于这些流数据需要在系统中保存一段时间,以便于从某个点开始重新进行传输;当然数据是否处理成功,更多的是取决于数据的处理者;典型的一个做法由数据的处理者决定从哪里开始处理数据。

在一些大吞吐量的消息传输的场景中,比如kafka,用的就是这种容错方式;数据往broker写,并可以从某个点批量读取数据;读取的数据在broker中保存一段时间,超过时间限制自动清理。

2、  世袭(lineage tracking)

所谓世袭,起始就是流处理的跟踪。

典型的有storm的容错校验机制,通过checksumack机制跟踪一个message是否被成功处理结束,这种机制保证消息至少被处理一次,这样在处理出错时,可以进行重新执行。这种方式不能保证消息只被处理一次,storm对于一次只有一次的语义采用的事务的机制。

大数据处理Spark也通过世袭的方式进行了容错,在数据处理过程中,RDD的一个分区失效,可以通过记录转换日志的方式,根据初始RDD和转换日志沿着世袭链一步步的重新构建RDD数据;当然如果世袭链条太长,那么可以采用对RDD checkpoint,从checkpoint点进行恢复。

3、  状态持久化

Storm checksums不能保证消息只交付一次;消息在处理过程中,每个节点没有保存计算的状态,这样在节点失效时,状态就会丢失,需要进行持久化。

Storm通过事务机制解决这些问题,事件分为一个组,每个组带一个事务ID,事务之间保持顺序,在处理之前,确保该ID没有处理过(事务ID持久化),如果被处理过,则忽略次消息。比如storm Trident的应用,Trident是在storm上做实时计算的高层抽象。它可以无缝的吻合高通量(每秒数百万消息),并且是低延迟分布式查询的处理有状态数据流,Trident通过事务机制保证一致性和恰好一次的语义。





加微信w3aboutyun,可拉入技术爱好者群

已有(1)人评论

跳转到指定楼层
nettman 发表于 2014-6-9 15:53:58
补充一些内容:
1、先看一下数学中的异或
    异或xor是一个数学运算符。它应用于逻辑运算。异或符号为“^”。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0异或0=0,1异或0=1,0异或1=1,1异或1=0(同为0,异为1),
既然相同的对象XOR操作,结果是0,那么有这样一个公式,
A xor B…xor B xor A = 0,其中每一个操作数出现且仅出现两次。
2、storm可靠性的机制
    storm中有一个系统级别的组件是acker,acker追踪从spout发射出的流ID(msgId)在每一个task中生成的tuple是否完成。spout或者bolt在处理完tuple后,都会告诉acker我已经处理完了该源tuple(如tupleId=1),如果emit一个tuple的话,同时会告诉acker我发射了一个tuple(如tupleId=2),如果在大量的高并发的消息的情况下,传统的在内存中跟踪执行情况的方式,内存的开销会非常大,甚至内存溢出。acker巧妙的利用了xor的机制,只需要维护一个msgId的标记位即可,处理方法是acker在初始的时候,对每个msgId初始化一个校验值ack-val(为0),在处理完tuple和emit tuple的时候,会先对这两个个值做xor操作,生成的中间值再和acker中的当前校验值ack-val做xor生成新的ack-val值,当所有的tuple都处理完成都得到确认,那么最后的ack-val自然就为0了(因为每一个tuple,从emit到ack都是经过两次xor操作,所以最后的结果为0可以由上面的那个公式可以验证出来)。
   见下图:
    1358579128_1281.jpg


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条