Hadoop源码五
2021SC@SDUSC
1.DataXceiver
OP_READ_METADATA :读数据块元文件
OP_REPLACE_BLOCK :替换一个数据块
OP_COPY_BLOCK :拷贝一个数据块
OP_BLOCK_CHECKSUM :读数据块检验码
替换一个数据块是系统平衡操作的一部分,用于接收一个数据块。它和普通的数据块写的差别是,它只发生在两个节点上,一个写,一个读,而不需要建立数据链。
-
1. blockReceiver = new BlockReceiver(block, proxyReply,
-
2. proxySock.getRemoteSocketAddress().toString(),
-
3. proxySock.getLocalSocketAddress().toString(),
-
4. false, "", null, datanode); //OP_REPLACE_BLOCK
-
5. blockReceiver = new BlockReceiver(block, in,
-
6. s.getRemoteSocketAddress().toString(),
-
7. s.getLocalSocketAddress().toString(),
-
8. isRecovery, client, srcDataNode, datanode);
写数据块収起请求方也提供数据,替换数据块请求方不提供数据,而是提供了一个数据源(proxySource 参数),由 replaceBlock 収起一个拷贝数据块的请求,建立数据源。
isRecovery=false,client=””, srcDataNode=null 即完成拷贝数据库操作。
在创建 BlockReceiver 对象前,需要使用拷贝数据块的请求建立到数据源的 socket 连接并收送拷贝数据块请求。然后通过 BlockReceiver.receiveBlock 接收数据。任务成功后将结果通知 notifyNamenodeReceivedBlock。
2.DataBlockScanner
DataBlockScanner 拥有它单独的线程,能定时地从目前 DataNode 管理的数据块文件进行校验。其实最重要的方法就是verifyBlock,其代码如下:
-
blockSender = newBlockSender(block, 0, -1, false, false, true, datanode);
-
-
DataOutputStream out = newDataOutputStream(newIOUtils.NullOutputStream());
-
-
blockSender.sendBlock(out, null, throttler);
校验利用了BlockSexder。在BlockSender 中,收送数据的同时,会对数据进行校验。 verifyBlock 需要读一个Block到一个空输出设备( NullOutputStream ),如果有异常,那么校验失败,如果正常,校验成功
DataBlockScanner其他的辅助方法用于对 DataBlockScanner 管理的数据块文件信息进行增加 /删 除,排序操作。同时,校验的信息还会保持在Storage 上。
3.FSDirectory
FSDirectory只有很少的成员变量:
-
final FSNamesystem namesystem;
-
final INodeDirectoryWithQuota rootDir;
-
FSImage fsImage;
-
boolean ready = false;
其中,namesystem,fsImage 是指向 FSNamesystem 对象和 FSImage 对象的引用,rootDir 是文件系统的根,ready 初值为 false,当系统成功加载 FSImage 以后,ready 会变成 true,FSDirectory 的使用者就可以调用其它 FSDirectory 功能了。
FSDirectory中的loadFSImage 用于加载目彔树结构,它会去调用 FSImage 的方法,完成持久化信息的导入以后,它会把成员变量 ready设 置为 true。系统调用 loadFSImage 是FSNamesystem.java 的 initialize 方法,那是系统初始化重要的一步。
addFile 用于创建文件或追加数据时创建 INodeFileUnderConstruction;
addFile 首先会试图在系统中创建到文件的路径,如果文件为/home/hadoop/Hadoop.tar,addFile 会调用 mkdirs保证文件路徂存在,然后创建 INodeFileUnderConstruction 节点,并把该节点加到目录树中,如果成功,就写操作日志。
addBlock 和 removeBlock 对应,用于添加/删除数据块信息,同时它们还需要更新 FSNamesystem.java 中对应的信息。
unprotectedRenameTo 和 renameTo 实现了 UNIX 的 mv 命令,主要的功能都在 unprotectedRenameTo 中完成,复杂的地方在于对各种各样情况的讨论。
4.DataNode(补充一)
-
public class DataNode extends Configured
-
-
implements InterDatanodeProtocol, ClientDatanodeProtocol, FSConstants, 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 目录,然后把返两参数送到 makeInstance 中,makeInstance 会先检查目录,然后调用:
new DataNode(conf, dirs);
构造函数调用 startDataNode,完成和 DataNode 相关的初始化工作。下一步是检查文件系统的状态并做必要的恢复,并初始化 FSDataset。
在本次代码分析中,我学习到了FSDirectory里的代码构造以及DataXceiver和DataBlockScanner 在Hadoop中的作用。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfhbajb
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13