这篇文章主要讲解了“Hadoop的Datanode是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hadoop的Datanode是什么”吧!
类图如下:
publipublic class Datanode extends Configured
implements InterDatanodeProtocol, ClientDatanodeProtocol, FSConsta nts, Runnable
上面给出了Datanode 的继承关系,我们发现,Datanode 实现了两个通信接口,其中ClientDatanodeProtocol 是用于和Client
交互的,InterDatanodeProtocol,就是我们前面提到的Datanode 间的通信接口。ipcserver(类图的左下方)是Datanode 的
一个成员变量,它启动了一个IPC 服务,这样,Datanode 就能提供ClientDatanodeProtocol 和InterDatanodeProtocol 的能
力了。
我们从main 函数开始吧。这个函数很简单,调用了createDatanode 的方法,然后就等着Datanode 的线程结束。createDatanode
首先调用instantiateDatanode 初始化Datanode,然后执行runDatanodeDaemon。runDatanodeDaemon 会向NameNode 注册,如
果成功,才启动Datanode 线程,Datanode 就开始干活了。
初始化Datanode 的方法instantiateDatanode 会读取Datanode 需要的配置文件,同时读取配置的storage 目录(可能有多个,
看storage 的讨论部分),然后把这两参数送到makeInstance 中,makeInstance 会先检查目录(存在,是目录,可读,可写),
然后调用:
new Datanode(conf, dirs);
接下来控制流就到了构造函数上。构造函数调用startDatanode,完成和Datanode 相关的初始化工作(注意,Datanode 工作线
程不在这个函数里启动)。首先是初始化一堆的配置参数,什么NameNode 地址,socket 参数等等。然后,向NameNode 请求配
置信息(DatanodeProtocol.versionRequest),并检查返回的NamespaceInfo 和本地的版本是否一致。
正常情况的下一步是检查文件系统的状态并做必要的恢复,初始化FSDataset(到这个时候,上面图中storage 和data 成员变
量已经初始化)。
然后,找一个端口并创建dataxceiverServer(run 方法里启动),创建DataBlockScanner(根据需要在offerService 中启动,
只启动一次),创建Datanode 上的HttpServer,启动ipcserver。这样就结束了Datanode 相关的初始化工作。
在启动Datanode 工作线程前,Datanode 需要向NameNode 注册。注册信息在初始化的时候已经构造完毕,包括dataxceiverServer
端口,ipcserver 端口,文件布局版本号等重要信息。注册成功后就可以启动Datanode 线程。
Datanode 的run 方法,循环里有两种选择,升级(暂时不讨论)/正常工作。我们来看正常工作的offerService 方法。offerService
也是个循环,在循环里,offerService 会定时向NameNode 发送心跳,报告系统中Block 状态的变化,报告Datanode 现在管理
的Block 状态。发送心跳和Block 状态报告时,NameNode 会返回一些命令,Datanode 将执行这些命令。
心跳的处理比较简单,以heartBeatInterval 间隔发送。
Block 状态变化报告,会利用保存在receivedBlockList 和delHints 两个列表中的信息。receivedBlockList 表明在这个
Datanode 成功创建的新的数据块,而delHints,是可以删除该数据块的节点。如在dataxceiver 的replaceBlock 中,有调用:
datanode.notifyNamenodeReceivedBlock(block, sourceID)
这表明,Datanode 已经从sourceID 上接收了一个Block,sourceID 上对应的Block 可以删除了(这个场景出现在当系统需要
做负载均衡时,Block 在Datanode 之间拷贝)。
Block 状态变化报告通过NameNode.blockReceived 来报告。
Block 状态报告也比较简单,以blockReportInterval 间隔发送。
心跳和Block 状态报告可以返回命令,这也是NameNode 先Datanode 发起请求的唯一方法。我们来看一下都有那些命令:
DNA_TRANSFER:拷贝数据块到其他Datanode
DNA_INVALIDATE:删除数据块(简单方法)
DNA_SHUTDOWN:关闭Datanode(简单方法)
DNA_REGISTER:Datanode 重新注册(简单方法)
DNA_FINALIZE :提交升级(简单方法)
DNA_RECOVERBLOCK:恢复数据块
拷贝数据块到其他Datanode 由transferBlocks 方法执行。注意,返回的命令可以包含多个数据块,每一个数据块可以包含多
个目标地址。transferBlocks 方法将为每一个Block 启动一个DataTransfer 线程,用于传输数据。
DataTransfer 是一个Datanode 的内部类,它利用OP_WRITE_BLOCK 写数据块操作,发送数据到多个目标上面。
感谢各位的阅读,以上就是“Hadoop的Datanode是什么”的内容了,经过本文的学习后,相信大家对Hadoop的Datanode是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程之家,小编将为大家推送更多相关知识点的文章,欢迎关注!