Apache Storm的容错保证(at-least once)

       今天上午刚把Spark搭建好,并跑了一个Demo,下午主要学一下Storm和Flink的容错机制,并理解一下两个框架的不同之处。晚上可能要学一下两个框架的反压机制。

       首先列出我的参考博客和网站,

http://storm.apache.org/releases/current/Guaranteeing-message-processing.html

https://www.cnblogs.com/Jack47/p/guaranteeing-message-processing-in-storm.html

上面的是官方的文档,下面是一个不错的国内前辈写的。

我这边的问题是,前辈翻译过来的,有一些点看不太懂,对照着官方文档理解了一下,将自己的理解写出来,希望能帮到之后的人。续:真是一点不想看自己写的东西,难看得不行,必须得能写出来一个让人类能看懂的!

首先引入Storm的概念,什么是Storm?为什么要用Storm?Storm有什么优势?逐个来解决这三个问题,同时理解博客的主题,Storm的容错保证是如何实现的?

Storm是一个免费的、开源的分布式实时计算系统。相对于Hadoop对批处理的优势,Storm更适用于无界的数据流计算机和实时计算。

简单地说,Hadoop的分布式的优势在于:大文件、批处理;弱点在于不能做小文件、实时计算或是流计算,而Storm擅长的就是流计算和实时计算。为什么要用Storm?这个几乎是框架的通性。

Storm是一个框架,它帮助程序员更加专注于开发中的任务和逻辑,而不必考虑底层的通信、节点故障、数据丢失等繁琐的问题,最大化地提高程序员的效率。

当然,流处理不只有这一个框架,在流计算的发展中,Storm也正在被逐渐的取代,如Spark的流计算框架和Flink的流计算框架等等。不过Storm也仍然有自己的优点,同时也可以作为之后框架的借鉴之处。这篇博客的重点,是讨论一下Storm的容错保证,Storm能够保证每个消息至少发送一次,并被完整的处理一次(at-least once gurantee)。

这个是Storm的模型图,其中数据源被称作Spout(很形象的名字,水龙头,源源不断的排水),中间的处理节点被称作Bolt,每天连线上传输的数据称作元组。一个元组被完整处理的含义,即该元组从Spout发出,经过途中所有的Bolt节点之后,从该系统中输出,即完整地被处理一次。

 

 

 

 

 

Storm能够保证Spout的每个消息至少被Topology中的Bolts处理一次(at-least once gurantee),原理说出来就一句话:只有在一个元组(Tuple)被处理完成,才可以将它从源头删去;如果处理失败,则重新处理。问题是:Storm的Spout怎么知道,被发送(emit)的消息被处理完成还是失败了?

第一个问题是,怎么区别不同的元组?这样Spout才知道确切的哪一个被处理完成or失败重新处理。只要给每个元组打上一个标签即可,Storm中对这个标签记作"message id",通过这个msg_id就可以确切地知道哪一个元组。

第二个问题是,元组从Spout中发送出去,到达下游的Bolts,Spout如何获得这个元组的处理情况?所以,Bolts要能够发送通知给Spout,但是Bolts的作用是处理元组(Tuple)的,不过如果每过一个Bolt就通知一下Spout,Bolt是没什么问题的,只要维护一个通信线程or进程即可。不过Spout就承受不了了,在大规模的架构中,Bolt可能是以万为计数的,Bolts发送的通知消息会使得Spout奔溃。并且,只需要知道这个元组被处理成功还是失败即可。所以Storm中有一个acker任务专门处理这个问题,acker的任务就是追踪每一个产生的元组的处理情况。当该元组处理成功,将该元组的message id发送给Spout,Spout就知道这个元组已经成功,可以放心的删掉它了。当然如果失败了呢?以及经过一个Bolt之后,一个元组变成多个元组,acker怎么处理这个问题?我会逐步把学习的理解和过程记录下来。

对文中所说的名词不大理解的,可以参考前辈的博客,讲得很清晰。

https://www.cnblogs.com/Jack47/p/storm_intro-1.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值