博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】DataNode源码演绎 第一回
阅读量:6281 次
发布时间:2019-06-22

本文共 3951 字,大约阅读时间需要 13 分钟。

  hot3.png

楔子

前几天,笔者解决DataNode节点宕机过程中,在初期并不知道是因为Centos网卡驱动不兼容造成的系统死机。故将Nodedata源码翻出来全部看了一遍。有些心得,略写一二,各位看官见笑了。

第一回 混沌未分天地乱,茫茫渺渺无人见。  

笔者以源码跟踪的方式阐述了DataNode运行过程,如有偏颇之处实在是因为笔者水平太低,请看官留下真知灼见,作为日后相见约守。笔者为了阐述清晰只截取了部分相关代码,完整的代码请各位参考源码。

main函数是一个程序的入口,也是出口,所有的一切,从这里开始,也从这里结束。

public class      DataNode        extends    Configured        implements InterDatanodeProtocol,                   ClientDatanodeProtocol,                   FSConstants,                   Runnable,                   DataNodeMXBean {  public static void main(String args[])  {   secureMain(args, null); } }

在代码中,如果调用方法的所属类不属于DataNode,笔者会明确的标识出来,否则调用的方法都是在类DataNode中声明和定义的。 

public static void secureMain(String [] args, SecureResources resources) {  DataNode datanode = createDataNode(args, null, resources);  if (datanode != null)        datanode.join();         System.exit(0);          }

在静态方法secureMain中,DataNode变量对象datanode被创建。话分两头,我们先看datanode.join()方法,它做的就是静静的等待,等待线程终止,等待一切终止。

 
void join() {  dataNodeThread.join();}

话在说回来,继续看createDataNode方法中发生的事情。

DataNode createDataNode(String args[],Configuration conf,...) {    DataNode dn = instantiateDataNode(args, conf, resources);    runDatanodeDaemon(dn);      return dn;                                          }

createDataNode方法中会实例化一个Datanode对象出来,事实上实例化一个对象还需要很多的步骤和准备,这些事件将在instantiateDataNode()方法中演绎。

public static DataNode instantiateDataNode(String             args[],                                             Configuration      conf,                                              SecureResources    resources) throws IOException {    DefaultMetricsSystem.initialize("DataNode");    return makeInstance(dataDirs, conf, resources);}
public static DataNode makeInstance(String[]        dataDirs, 		                   Configuration   conf,                                      SecureResources resources)  throws IOException  {    UserGroupInformation.setConfiguration(conf);    LocalFileSystem localFS        = FileSystem.getLocal(conf);    ArrayList
dirs = new ArrayList
(); return new DataNode(conf, dirs, resources); return null; }

在makeInstance()函数中,真正的new( )出一个DataNode类型的对象,并且立刻开始初始化DataNode类的成员变量和调用DataNode类的构造函数。其中在DataNode中比较重要的成员变量有以下几个:

public FSDatasetInterface data = null;

在datanode类中成员变量data实际上是FSDataset类型,FSDataset类型用来提供数据存储功能,FSDataset实现了FSDatasetInterface接口 , 对于Block的所有操作都要经过data成员变量管理在这个datanode上存储的block。 

private DataStorage storage = null;

 Datanode节点利用DataStorage类型的storage对象对自己的所有存储路径进行统一管理。DataStorage主要在Datanode节点启动时扮演重要的角色。

public Server ipcServer;

DataNode启动的时候,会创建一个ipcServer这个ipcServerHadoopipc框架的Server实例,主要是在DataNodeDataNode之间recover block时使用,recover block会在两个地方发生,一个是namenode返回的recover命令 ,  一个是DFSClient写数据时遇到DataNode错误时触发。

在成员变量初始化完成之后调用DataNode的构造函数

DataNode(final Configuration conf,final  AbstractList
dataDirs,SecureResources resources) { startDataNode(conf, dataDirs,resources); }

在构造函数中,调用startDataNode方法 

void startDataNode(Configuration            conf,                       AbstractList
dataDirs, SecureResources resources ) { storage = new DataStorage(); this.threadGroup = new ThreadGrou("dataXceiverServer"); this.dataXceiverServer = new Daemon(threadGroup, new DataXceiverServer(ss, conf, this)); this.threadGroup.setDaemon(true); storage.recoverTransitionRead(nsInfo, dataDirs, startOpt); this.dnRegistration.setStorageInfo(storage); this.data = new FSDataset(storage, conf); this.infoServer.start(); blockScanner = new DataBlockScanner(this, (FSDataset)data, conf); }

在startDataNode方法中还storage、data、dataXceiverServer、DataBlockScanner都有各自的任务。下次继续说。

转载于:https://my.oschina.net/JJREN/blog/78947

你可能感兴趣的文章
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>
javascript 中出现missing ) after argument list的错误
查看>>
使用Swagger2构建强大的RESTful API文档(2)(二十三)
查看>>
Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
查看>>
(转)第三方支付参与者
查看>>
程序员修炼之道读后感2
查看>>
DWR实现服务器向客户端推送消息
查看>>
js中forEach的用法
查看>>
Docker之功能汇总
查看>>