`
wsql
  • 浏览: 11811346 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

HDFS1.0源代码解析—DataNode启动(一)

 
阅读更多

DataNode的启动实在DataNode.java中进行的,具体启动流程如下:

在secureMain中调用createDataNode方法,该方法

利用instantiateDataNode创建DataNode 对象,通过runDatanodeDaemon

进行DataNode注册,创建线程,设置守护线程,启动线程。

以上就是DataNode主线程启动的过程。

其中,创建创建DataNode 对象的过程如下:

在函数instantiateDataNode中, 调用makeInstance函数

在makeInstance函数中,创建dfs.data.dir指定的文件路径,确保至少有一个路径可以被创建,然后调用DataNode的构造函数。具体如下:

DataNode构造函数中调用startDataNode根据具体配置文件的信息进行具体的初始化过程。 startDataNode具体执行流程如下:

InetSocketAddress nameNodeAddr = NameNode.getServiceAddress(conf, true);

获取配置文件中fs.default.name指定的IP和端口。

这段代码判断是否是伪分布模式。之后会根据data中存储的文件和数据的特点判断是否需要进行恢复、升级、回滚的操作,如果没有按正常流程启动。

调用DataStorage类中的recoverTransitionRead进行检查,具体代码如下:

具体执行是在Storage.java中的analyzeStorage,通过检查返回当前所处的状态,在switch分支中不能处理的分支交与doRecover方法实现。处理完之后会根据StartupOption进行响应的处理,具体由doTransition(getStorageDir(idx), nsInfo, startOpt);方法执行,该方法的详细解释在另外一篇博客http://blog.csdn.net/zhangchunminggucas/article/details/7556050,最后执行this.writeAll(); 将元信息写入磁盘。

当前DataNode可能处于一下状态:

analyzeStorage函数是Storage.java中比较重要的一个函数,主要的实现流程是:首先,根据数据目录是否存在和StartupOption选项判断状态是数据不存在还是没有进行初始化。然后根据下面的状态判断DataNode处于的状态,将获得的状态信息返回给recoverTransitionRead进行处理。


























  


  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics