千家信息网

Hadoop中DataNode的启动过程介绍

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"Hadoop中DataNode的启动过程介绍",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Hadoop中DataNode的启动过程
千家信息网最后更新 2026年11月01日Hadoop中DataNode的启动过程介绍

这篇文章主要讲解了"Hadoop中DataNode的启动过程介绍",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Hadoop中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 dataDirs,      Configuration conf, SecureResources resources) throws IOException {    return new DataNode(conf, locations, resources);  }  DataNode(final Configuration conf,           final List 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 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> 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 cmds = blockReport();}  }}


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

详细的过程就不啰嗦了。

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

感谢各位的阅读,以上就是"Hadoop中DataNode的启动过程介绍"的内容了,经过本文的学习后,相信大家对Hadoop中DataNode的启动过程介绍这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

方法 过程 代码 学习 服务 重要 两个 信息 内容 实例 就是 思路 特性 线程 还是 进程 重点 研究 上代 东西 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 博彦科技互联网金融 科技互联网项目 网络科技有限互联网 致聘互联网科技 壕鑫互联网络科技 互联网科技视频素材 中国互联网金融科技基金 恒生科技互联网指数分析 互联网科技公司需要的职位 科技与互联网哪个更好 杭州壁岐互联网科技有限公司 速维有品互联网信息科技(苏州)有限公司 互联网科技公司营业执照怎么办理 锡山区互联网智能科技产品供应 产业互联网科技服务公司 互联网风格科技公司名称 互联网硬科技公司 珠海东科互联网科技有限公司 版纳互联网科技选哪家 上海万顺科技互联网有限公司招聘 耶加雪菲 什么是科技互联网 喔噻互联网科技有限公司 科技和互联网公司 科技赋能互联网健康 深圳前海聚择互联网科技有限公司 呼和浩特新华互联网科技学院 上海创道互联网络科技有限公司 杭州融税互联网科技有限公司 广东猫王互联网科技有限公司电话
0