栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Hadoop源码分析(五)

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中的作用。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/487315.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号