| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Hadoop源码分析(五) -> 正文阅读 |
|
[大数据]Hadoop源码分析(五) |
2021SC@SDUSC 1.DataXceiver
OP_READ_METADATA
:读数据块元文件
OP_REPLACE_BLOCK
:替换一个数据块
OP_COPY_BLOCK
:拷贝一个数据块
OP_BLOCK_CHECKSUM
:读数据块检验码
替换一个数据块是系统平衡操作的一部分,用于接收一个数据块。它和普通的数据块写的差别是,它只发生在两个节点上,一个写,一个读,而不需要建立数据链。
写数据块収起请求方也提供数据,替换数据块请求方不提供数据,而是提供了一个数据源(proxySource 参数),由 replaceBlock 収起一个拷贝数据块的请求,建立数据源。
isRecovery=false,client=””, srcDataNode=null 即完成拷贝数据库操作。
在创建 BlockReceiver 对象前,需要使用拷贝数据块的请求建立到数据源的 socket 连接并收送拷贝数据块请求。然后通过 BlockReceiver.receiveBlock 接收数据。任务成功后将结果通知 notifyNamenodeReceivedBlock。
2.DataBlockScanner
DataBlockScanner
拥有它单独的线程,能定时地从目前
DataNode
管理的数据块文件进行校验。其实最重要的方法就是verifyBlock,其代码如下:
校验利用了BlockSexder。在BlockSender
中,收送数据的同时,会对数据进行校验。
verifyBlock
需要读一个Block到一个空输出设备(
NullOutputStream
),如果有异常,那么校验失败,如果正常,校验成功
?
DataBlockScanner其他的辅助方法用于对
DataBlockScanner
管理的数据块文件信息进行增加
/删
除,排序操作。同时,校验的信息还会保持在Storage
上。
3.FSDirectory
FSDirectory只有很少的成员变量:
其中,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(补充一)
在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 会先检查目录,然后调用:
构造函数调用 startDataNode,完成和 DataNode 相关的初始化工作。下一步是检查文件系统的状态并做必要的恢复,并初始化 FSDataset。
在本次代码分析中,我学习到了FSDirectory里的代码构造以及DataXceiver和DataBlockScanner
在Hadoop中的作用。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:42:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |