本文接上一篇:【HDFS】--RPC--delete 继续讲解delete操作的逻辑,上一篇文章最后讲到了把block添加到了invalidateBlocks队列中等待周期线程来生成删除指令下发到datanode节点进行真正的删除操作。本篇就来看看周期性线程从队列中取块删除的逻辑。
分享一波大数据&Java的学习视频和书籍### Java与大数据资源分享links.jianshu.com
待删除的数据块最后被put到了这个map中:
那我们下面看看谁消费了这个map。通过调用关系查找。
最后找到了RedundancyMonitor#run方法。这个方法每隔dfs.namenode.redundancy.interval.seconds*1000
秒运行一次,默认是3*1000秒
通过不断追踪,到了InvalidateBlocks#invalidateWork方法。
此方法最后把待删除数据块添加到了DatanodeDescriptor的invalidateBlocks成员变量中。(删除块的任务最终被添加到了DatanodeDescriptor#invalidateBlocks这个成员变量中。)
那我们看看最后哪个线程从invalidateBlocks中去取block做真正的删除操作。
于是我们找到了getInvalidateBlocks方法,在DatanodeDescriptor#getInvalidateBlocks中会返回此datanode待删除的数据块数组。
看看谁调用了这个方法,于是又找到了DatanodeManager#handleHeartbeat方法。在这个方法中,获得了Datanode要删除的block数组,然后构造数据块删除指令,在datanode心跳汇报时,下发Command返回给Datanode, Datanode收到此删除指令后,会把相应的数据块进行删除。至此整个删除过程已经分析结束。