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

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

1、  流数据重放(stream replay)

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

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

2、  世袭(lineage tracking)

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

典型的有storm的容错校验机制,通过checksumack机制跟踪一个message是否被成功处理结束,具体实现可以参考以前的blog(http://blog.csdn.net/yangbutao/article/details/8496181),这种机制保证消息至少被处理一次,这样在处理出错时,可以进行重新执行。这种方式不能保证消息只被处理一次,storm对于一次只有一次的语义采用的事务的机制。

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

3、  状态持久化

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

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

后续章节重点介绍Storm在事务方面的机制以及trident的分析。

你可能感兴趣的:(spark,storm,流式计算)