搜索
搜 索
本版
文章
帖子
用户
图文精华
hadoop-2.6.0+zookeeper-3.4.6+hbase-1.0.0+hive-1.1.0完全分布 ...
首页
Portal
专题
BBS
面试
办公|编程助手
更多
登录
注册
用户组:游客
主题
帖子
云币
我的帖子
我的收藏
我的好友
我的勋章
设置
退出
导读
淘贴
博客
群组
社区VIP
APP下载
今日排行
本周排行
本周热帖
本月排行
本月热帖
会员排行
About云-梭伦科技
»
专题
›
技术学习(版主发帖区)
›
大数据学习
›
Storm
›
流式计算在容错方面的考虑
0
1
2
分享
流式计算在容错方面的考虑
nettman
发表于 2014-6-9 15:52:07
[显示全部楼层]
只看大图
阅读模式
关闭右栏
1
15145
本帖最后由 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可以由上面的那个公式可以验证出来)。
见下图:
回复
使用道具
举报
显身卡
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
发表新帖
nettman
超级版主
关注
2910
主题
3203
帖子
478
粉丝
TA的主题
避坑大厂基础架构
4 天前
Flink CDC:新一代实时数据集成框架
4 天前
蚂蚁面试就是不一样
4 天前
招聘1万人
2024-11-21
为何大厂开发者纷纷抛弃小仓,转向大仓monorepo?
2024-11-21
24小时热文
kafka面试题精选
Nebula Flink Connector 在实时 ETL 的实践
Apache Doris 用户案例集
国家电网公司主数据管理系统技术规范
企业的主数据建设方法论与实践
关闭
推荐
/2
中文版ChatGPT
1.无需魔法 2.提高编程效率 3.提高文档能力
查看 »
新手帮助
新手帮助:注册遇到问题,领取资源,加入铁粉群,不会使用搜索,如何获取积分等
查看 »
意见
反馈