您的位置:首页 > 运维架构

Hadoop HDFS bug备忘:DN的删除队列与block report的协调引起的数据丢失

2013-12-16 17:38 309 查看
现象描述:线上任务出现失败,日志中显示查找计算用的block失败。

现象分析:NN记录了block的所在的DN,但是DN上却没有了这个block;通常,删除过程是先删除NN\DN上的数据,然后再删除磁盘上的数据。

肯定是某种条件,使得NN恢复了block信息,而DN上的确删除了block。经过分析发现,是两个线程的协调,引入这个问题。

问题原因:NN下发删除block命令到DN,DN先删除自己cache中的block,然后将要删除的block扔到删除队列中异步删除(a1,a2)。

                  而DN会每隔一定时间,report自己的block信息给NN(b1,b2),以保持数据同步。如果这时候队列中的没有删除干净,则仍然会收集过来。

                  扫描到的block会对DN的cache查缺补漏,同时使用DN cache的block信息给NN,NN发现了多于副本数的block,会随机删除block。

                  如果频繁这种情况发生,则会丢失数据。



触发条件:文件删除不会引起上面的问题,因为文件不存在了,相应的block就不存在了,汇报上来仍然会被NN删除。单独对block 的操作引起这个问题(如balance)。

bug修改:对于report线程,扫描结果直接汇报给NN(存储在单独的MAP中),那么下次扫描时,真正丢失的block就会被复制回来

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Hadoop hdfs