现象描述:线上任务出现失败,日志中显示查找计算用的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。
如果频繁这种情况发生,则会丢失数据。
触发条件:文件