文档章节

Hadoop中DataNode的启动过程详解

彭苏云
 彭苏云
发布于 2015/01/29 10:08
字数 723
阅读 169
收藏 0
点赞 0
评论 0

本文的目的在于详细记录2.4.1版本下hadoop的DataNode的启动过程,作此记录,也为以后回过头看DataNode留下方便。本文的思路是结合DataNode的代码,来分析他的启动过程。

说明,限于篇幅,对文章中引用的代码都只留了关键部分。

DataNode同NameNode都一样,是一个java进程,所以从main方法开始,看代码:

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

  public static void secureMain(String args[], SecureResources resources) {
  	DataNode datanode = createDataNode(args, null, resources);
  }

  public static DataNode createDataNode(String args[], Configuration conf,
      SecureResources resources) throws IOException {
    DataNode dn = instantiateDataNode(args, conf, resources);
    if (dn != null) {
      dn.runDatanodeDaemon();
    }
    return dn;
  }

  public static DataNode instantiateDataNode(String args [], Configuration conf,
      SecureResources resources) throws IOException {
    return makeInstance(dataLocations, conf, resources);
  }

  static DataNode makeInstance(Collection<StorageLocation> dataDirs,
      Configuration conf, SecureResources resources) throws IOException {
    return new DataNode(conf, locations, resources);
  }

  DataNode(final Configuration conf,
           final List<StorageLocation> dataDirs,
           final SecureResources resources) throws IOException {
     startDataNode(conf, dataDirs, resources);
  }

  public void runDatanodeDaemon() throws IOException {
    blockPoolManager.startAll();

    // start dataXceiveServer
    dataXceiverServer.start();
    if (localDataXceiverServer != null) {
      localDataXceiverServer.start();
    }
    ipcServer.start();
    startPlugins(conf);
  }
}



上面的代码跟踪不难,但是最终需要注意两个方法:startDataNode和runDatanodeDaemon方法,前面一个用于初始化DataNode,后面一个启动DataNode的后台线程,这些线程是会伴随DataNode进程一直跑着的。接着,让我们重点研究下方法startDataNode,看代码:


void startDataNode(Configuration conf, 
                     List<StorageLocation> dataDirs,
                    // DatanodeProtocol namenode,
                     SecureResources resources
                     ) throws IOException {
    storage = new DataStorage();
    
    // global DN settings
    registerMXBean();
    initDataXceiver(conf);
    startInfoServer(conf);
    pauseMonitor = new JvmPauseMonitor(conf);
    pauseMonitor.start();

    initIpcServer(conf);
    blockPoolManager = new BlockPoolManager(this);
    blockPoolManager.refreshNamenodes(conf);
  }


registerMXBean这个方法可以忽略,用来注册MBean信息;initDataXceiver这个方法应该来说还是比较重要,实例化的dataXceiverServer用来接受客户端或者其他datanode的数据接收或者发送请求;startInfoServer方法用来启动datanode的web服务器;pauseMonitor用来监控jvm是否有停顿;initIpcServer方法比较重要,用来启动datanode上的rpc服务,主要包括两个服务:ClientDatanodeProtocolPB和InterDatanodeProtocolPB。

然后属于DataNode的重点来了,blockPoolManager对象的实例化,注意一点,2.4.1 这个版本的hadoop已经支持了hadoop Federation的特性,而blockPooolManager就是支撑这个特性来的。现在让我们来看看他里面的东西。还是先上代码吧。

class BlockPoolManager {
  BlockPoolManager(DataNode dn) {
    this.dn = dn;
  }

  void refreshNamenodes(Configuration conf)
      throws IOException {
    synchronized (refreshNamenodesLock) {
      doRefreshNamenodes(newAddressMap);
    }
  }

  private void doRefreshNamenodes(
      Map<String, Map<String, InetSocketAddress>> addrMap) throws IOException {
 synchronized (this) {
		startAll();
	}
  }

  synchronized void startAll() throws IOException {
	for (BPOfferService bpos : offerServices) {
          bpos.start();
     }
  }
}

class BPOfferService {
  void start() {
    for (BPServiceActor actor : bpServices) {
      actor.start();
    }
  }
}

class BPServiceActor implements Runnable {
  void start() {
    if ((bpThread != null) && (bpThread.isAlive())) {
      //Thread is started already
      return;
    }
    bpThread = new Thread(this, formatThreadName());
    bpThread.setDaemon(true); // needed for JUnit testing
    bpThread.start();
  }

  public void run() {
while (true) {
	connectToNNAndHandshake();
     	break;
}

    while (shouldRun()) {
      offerService();   
    }
  }

  private void offerService() throws Exception {
while (shouldRun()) {
	HeartbeatResponse resp = sendHeartBeat();

	List<DatanodeCommand> cmds = blockReport();
}
  }
}


顺着代码往下走,整个思路都会比较清晰了,BPServiceActor这个类做了具体的事情,包括datanode跟namenode的握手,发送心跳和报告块信息,执行namenode发回来的命名。

详细的过程就不啰嗦了。

到这里DataNode的启动过程就搞了一个段落。

 

© 著作权归作者所有

共有 人打赏支持
彭苏云
粉丝 41
博文 202
码字总数 54255
作品 0
广州
高级程序员
分布式计算框架Hadoop原理

  本文来自于csdn,这篇文章讲解了分布式计算框架的核心内容、架构图详解,运用流程等   hadoop是Apache软件基金会所开发的并行计算框架与分布式文件系统。最核心的模块包括Hadoop Comm...

深度学习 ⋅ 01/06 ⋅ 0

分布式计算框架Hadoop原理

  编辑推荐:   本文来自于csdn,这篇文章讲解了分布式计算框架的核心内容、架构图详解,运用流程等   Hadoop是Apache软件基金会所开发的并行计算框架与分布式文件系统。最核心的模块包...

大数据头条 ⋅ 01/05 ⋅ 0

Hadoop环境搭建及相关组件的工作流程介绍

1前言 本篇博客主要是记录Hadoop环境配置包括单机伪分布环境搭建,分布式环境搭建和Hadoop相关组件的工作流程介绍,包括HDFS读写流程,YARN的资源调度流程,MapReduce工作流程。 建议先理解各...

u014732537 ⋅ 05/24 ⋅ 0

hadoop架构详解一

hadoop架构组成 hadoop有两部分组成:分布式文件系统HDFS,统一的资源管理器YARN hdfs架构 Client:切分文件;访问或通过命令行管理HDFS;与NameNode交互,获取文件位置信息;与DataNode交互...

张欢19933 ⋅ 2016/03/29 ⋅ 0

[Hadoop] 完全分布式集群安装过程详解

1. 用Vmware Workstation创建4个虚拟机,每个虚拟机都装上Centos(版本:CentOS-6.3-x86_64),示意图如下: 2. 在所有结点上修改/etc/hosts,使彼此之间都能够用机器名解析IP 192.168.231....

长平狐 ⋅ 2013/06/03 ⋅ 0

[Hadoop] 完全分布式集群安装过程详解

1. 用Vmware Workstation创建4个虚拟机,每个虚拟机都装上Centos(版本:CentOS-6.3-x86_64),示意图如下: 2. 在所有结点上修改/etc/hosts,使彼此之间都能够用机器名解析IP 192.168.231....

长平狐 ⋅ 2013/06/03 ⋅ 0

hadoop配置文件详解、安装及相关操作

一、 Hadoop伪分布配置 1. 在conf/hadoop-env.sh文件中增加:export JAVA_HOME=/home/Java/jdk1.6 2. 在conf/core-site.xml文件中增加如下内容: <!-- fs.default.name - 这是一个描述集群中...

村长大神 ⋅ 2014/04/10 ⋅ 0

hdfs--hadoop--双namenode三datanode

前提:搭建zookeeper集群、java环境、无秘互通注意:文中加粗部分表示需要按实际情况修改的部分> zookeeper可以参考:zookeeper传送门 下载安装包> https://mirrors.tuna.tsinghua.edu.cn/ap...

yr_linux运维 ⋅ 2017/12/27 ⋅ 0

hadoop学习笔记之一

1、 Hadoop能解决哪些问题: 海量数据需要及时分析和处理, 海量数据需要深入分析和挖掘, 数据需要长期保存。 问题: 磁盘IO成为一种瓶颈,而非CPU资源, 网络宽带是一种稀缺资源, 硬件故障...

低调的浮躁 ⋅ 2013/04/01 ⋅ 2

solr集群分布式部署配置

1.安装配置zookeeper 在zookeeper安装目录/conf下 cp zoo_sample.cfg zoo.cfg Vi zoo.cfg dataDir={zookeeper工作目录} clientPort=2181(服务端口) server.1=hadoop.datanode3.com:2888:9......

zmf ⋅ 2014/11/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部