• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Hadoop源码五

武飞扬头像
qq_1031904067
帮助3

2021SC@SDUSC

1.DataXceiver

OP_READ_METADATA :读数据块元文件
OP_REPLACE_BLOCK :替换一个数据块
OP_COPY_BLOCK :拷贝一个数据块
OP_BLOCK_CHECKSUM :读数据块检验码
替换一个数据块是系统平衡操作的一部分,用于接收一个数据块。它和普通的数据块写的差别是,它只发生在两个节点上,一个写,一个读,而不需要建立数据链。
  1.  
    1. blockReceiver = new BlockReceiver(block, proxyReply,
  2.  
    2. proxySock.getRemoteSocketAddress().toString(),
  3.  
    3. proxySock.getLocalSocketAddress().toString(),
  4.  
    4. false, "", null, datanode); //OP_REPLACE_BLOCK
  5.  
    5. blockReceiver = new BlockReceiver(block, in,
  6.  
    6. s.getRemoteSocketAddress().toString(),
  7.  
    7. s.getLocalSocketAddress().toString(),
  8.  
    8. isRecovery, client, srcDataNode, datanode);
写数据块収起请求方也提供数据,替换数据块请求方不提供数据,而是提供了一个数据源(proxySource 参数),由 replaceBlock 収起一个拷贝数据块的请求,建立数据源。
isRecovery=false,client=””, srcDataNode=null 即完成拷贝数据库操作。
在创建 BlockReceiver 对象前,需要使用拷贝数据块的请求建立到数据源的 socket 连接并收送拷贝数据块请求。然后通过 BlockReceiver.receiveBlock 接收数据。任务成功后将结果通知 notifyNamenodeReceivedBlock。
2.DataBlockScanner
DataBlockScanner 拥有它单独的线程,能定时地从目前 DataNode 管理的数据块文件进行校验。其实最重要的方法就是verifyBlock,其代码如下:
  1.  
    blockSender = newBlockSender(block, 0, -1, false, false, true, datanode);
  2.  
     
  3.  
    DataOutputStream out = newDataOutputStream(newIOUtils.NullOutputStream());
  4.  
     
  5.  
    blockSender.sendBlock(out, null, throttler);
校验利用了BlockSexder。在BlockSender 中,收送数据的同时,会对数据进行校验。 verifyBlock 需要读一个Block到一个空输出设备( NullOutputStream ),如果有异常,那么校验失败,如果正常,校验成功
 
DataBlockScanner其他的辅助方法用于对 DataBlockScanner 管理的数据块文件信息进行增加 /删 除,排序操作。同时,校验的信息还会保持在Storage 上。
3.FSDirectory
FSDirectory只有很少的成员变量:
  1.  
    final FSNamesystem namesystem;
  2.  
    final INodeDirectoryWithQuota rootDir;
  3.  
    FSImage fsImage;
  4.  
    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(补充一)
  1.  
    public class DataNode extends Configured
  2.  
     
  3.  
    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
系列文章
更多 icon
同类精品
更多 icon
继续加载