datanode无法启动_Hadoop DataNode启动和初始化过程

简介

我们先看DataNode的doc文档的介绍,DataNode是一个类,用于存储一组块,用于DFS部署。单个部署可以有一个或多个DataNode。每个DataNode通信定期与单个NameNode进行通信。它还可以与客户端和其他的DataNodes通信。

DataNode存储一系列命名的块。DataNode允许客户端代码读取这些块,或者写新的块数据。DataNode也可以响应于以下指令从其NameNode中删除区块或将区块复制到/从其他的DataNodes。

DataNodes的一生都在无休止的循环中度过,询问NameNode需要做哪些事情。NameNode不能直接连接到DataNode;NameNode只是从DataNode调用的函数中返回值。

DataNodes维护一个开放的 server socket,以便客户端代码  或其他数据节点可以读/写数据。读取/写入数据的主机/端口为汇报给NameNode,然后将该服务器的向客户或其他可能感兴趣的数据节点提供信息。

概括如下:1. 一个集群里面可以有好很多个datanode ,这些datanode就是用来存储数据的。2. datanode启动了以后会周期性的与namenode进行通信(心跳 、 回报块)。3. namenode不能直接操作datanode , 而是通信心跳返回指令的方式去操作datanode。4. datanode启动了以后会开放一个socket发服务(RPC),等待调用。

源码解析

启动datanode,主要是要完成3件事:

1、如何完成存储。

2、如何与namenode进行通信,这个通过IPC 心跳连接实现。此外还有和客户端 其它datanode之间的信息交换。

3、完成和客户端还有其它节点的大规模通信,这个需要直接通过socket 协议实现。

25f1714eac0262054cbce6426324c9e8.png

本方法干两件事:

1、打印datanode启动日志,一些基本信息日志(域名、参数、版本、jdk环境等)

2、创建datanode

3、线程挂起

5d4f717664e65e5e8752c54060fd74a7.png

createDataNode方法主要两件事:1、实例化一个DataNode2、运行datanode的守护线程

0a52a9936f948b7999bda8de6d54f2e9.png

instantiateDataNode方法的作用

1、拿到数据存储路径(dfs.datanode.data.dir)

2、使用三个参数(数据存储路径、配置文件、SecureResources)去实例化Datanode

d6a2e5eb3c532dfcc908c89af6c94343.png

makeInstance方法主要的作用:

1、获取客户端校验类。

2、拿到存储数据目录的权限。3、传入磁盘检测对象进行磁盘检测,并返回可用的目录列表。4、创建datanode对象。

a89a78b53879d89ef1e9c5ccf6b37c53.png

checkStorageLocations方法主要是利用磁盘检测对象进行磁盘目录的检测 , 返回可用磁盘目录列表

1、声明一个集合,用来存储可用目录列表

2、遍历数据目录,注意这里就是串行的方式

3、利用磁盘检测对象进行磁盘目录的检测:校验目录的读写执行权限 ,如果目录不存在,则创建目录并给予700权限

4、检测完毕没有抛出异常,则说明目录可用,加入到可用列表

5、如果出现IO异常,说明此磁盘目录不可用,加入到目录中

6、如果可用目录数量为0,表明所有的目录都不可用

7、最终,返回可用的磁盘目录列表

0536770154deb345a3698e9fb9d1ebe9.png

初始化方法,这个构造方法主要做了这几件事:

1、根据configuration,初始化一些成员变量

2、给出一个配置、一个dataDirs数组和一个Namenode代理,创建DataNode。

3、启动datanode

94489b299eca5c258b07be671593171a.png

startDataNode方法启动datanode,这个方法很重要。

5330030db4bf686bff4f9422cbe1de5c.png

 startDataNode是最关键的方法,非常非常重要

1、实例化管理磁盘目录的DataStorage

2、启动http和RPC

3、datanode向namenode注册和心跳

4、通过心跳汇报块

d6dbc230f63f870b9b1b8f9869dcd46d.png

dfs.datanode.max.locked.memory: DataNode在内存中缓存副本块的最大内存数默认参数是0,表示不缓存副本块到内存;而且本地库还需要支持,如果不支持,也无法使用

73ecf3c00f29771028dac522e80d83be.png

DataNode最重要的功能就是管理磁盘上存储的数据块。DataNode将这个管理功能切分为2个部分:
1. DataStorage:管理与组织磁盘存储目录,如current,previous,detach,tmp等,在Data Node数据目录,你可以看到一些current tmp,rbw或者finalized文件夹 2. FsDatasetImpl:管理组织数据块和元数据文件

92047aa43268840d39f64765c8fd9259.png

DataXceiverServer是数据节点DataNode上一个用于接收数据读写请求的后台工作线程,为每个数据读写请求创建一个单独的线程去处理,DataNode#runDatanodeDaemon()中启动,后面再详细分析这个。

1. 创建构造DataXceiverServer需要的TcpPeerServer实例tcpPeerServer,它内部封装了ServerSocket,是DataXceiverServer功能实现的最主要依托;2. 从tcpPeerServer中获取Socket地址InetSocketAddress,赋值给DataNode成员变量streamingAddr3. 然后构造DataXceiverServer实例xserver,传入tcpPeerServer;4. 构造dataXceiverServer守护线程,并将xserver加入之前创建的线程组threadGroup;5. 将线程组里的所有线程设置为设置为守护线程,方便虚拟机退出时自动销毁。

51a6e053482ca571ffc8a017c7167352.png

initIpcServer初始化IpcServer(RPC通信),DataNode#runDatanodeDaemon()中启动。用来启动datanode上的rpc服务,主要包括两个服务:ClientDatanodeProtocolPB和InterDatanodeProtocolPB。

a7a861bf726fde242067faf8f25a8ebd.png

BlockPoolManager抽象了datanode提供的数据块存储服务,每个DataNode上都有一个BlockPoolManager实例

c09bdb58e86ab6d12bb5327970776f38.png

总结

这篇主要是DadaNode的启动和初始化的过程,可以看到还是比较复杂的,这篇文章只是写了一些大概的流程,一些细节还需要慢慢的去了解,每天学习一点点,持续行动,日拱一卒无有尽,功不唐捐终入海。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

挖掘机燃料_2020广东挖掘机工程机械出租公司合作共赢

如今的挖掘机具有比以往更多的内置安全功能,但这并不意味着只有任何人都可以爬上驾驶室并安全操作。1、仔细检查地面区域使用挖掘机时,诸如岩石、建筑材料和树桩之类的物品会损害安全性。在开始操作机器之前,请确保已将其从该区域中清理。此外…

mysql对所有列的数据进行修改6_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)...

添加和删除列使用ADD向表中添加新列,使用DROP删除现有列。DROP col_name是对标准SQL的MySQL扩展。若要在表行的特定位置添加列,请使用FIRST col_name 或者 AFTER col_name。默认情况是添加到最后。如果表只包含一列,则不能删除该列。如果您想…

ant构建项目迁移到gradle_Gradle构建工具

构建工具的作用:依赖管理;测试、打包、发布;机器能干的活,绝不自己动手。主流构建工具:(1)Ant:编译、测试、打包;(2)Maven:依赖管理、发布;(3)Gradle:Groovy&…

mysql导入数据库某张表_MSSQLServer2005 导出导入数据库中某张表的数据

备注:在工作中我们经常会遇到,将数据库中某张数据表中的内容或数据导出来;今天我们就介绍怎样快速有效的进行数据导出,导入。使用的数据库版本为:mssqlserver2005。首先进行登录mssqlserver2005 ,如下图所示…

pyecharts运行了但是没有图_新版pyecharts,Python可视化so easy and powerful !

作者:chenjiandongx一个执迷于写 bug 的程序员pyecharts V1.0.0 版本正式发布啦!Whats New in pyecharts V1pyecharts 经过了半年的沉寂后,终于发布了新版本啦!新版本号将从 v1.0.0 开始,这是一个全新的,向…

python 整除及余数_python除法余数

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 常量常量就是不变的变量,在python中,通常用大写的变量名表示常量,这一点…

flatmap用法_短说:map和flatmap

PS:本文阅读->理解->GET大概2-5分钟.也许你天天见到,但是一直没理解,占用你少量的时间,相信简单的东西,只需要你付出一点点时间.map和flatmap是Java8中stream的用法.>>>>>>map把数组流中的每一个值,使用所提供的函数执行一遍,一…

git 回退到某个commit_it lesson2 版本回退

回顾上次的知识:1,首先git init 初始化文件的状态,使用git管理文件。2,git add xxx 告诉git把xxx文件添加到仓库3,git commit -m ‘xxxx’告诉git把文件提交到仓库 并对提交的内容作解释(‘xxxx’&#xff…

python数据处理模块pandas_13. Python|模块总结:Pandas(数据处理)|【老W笔记】...

一、基本操作0. 导入模块import pandas as pd1. 新建DataFrame下面的例子中,我们新建一个有3条记录2列属性的表格。3 条记录分别是Tom,Bob,Alice的个人信息,2列属性分别是name和age。新建属性列的语法形如df[XX] List,…

visual studio 设计器不显示_与城共生:南京朝天宫“参与性”城市设计

本课题致力于探索和理解目前中国城市迅速发展的过程中,老旧社区如何与城市共生共进。通过对南京老旧社区的充分调查和研究,选取了朝天宫古玩市场附近的街巷民居和鼓楼工人新村作为设计地块。社会结构的变迁以及城市空间形态的变化都对老旧社区正在进行冲…

mysql error code 1093_MySQL更新时ErrorCode:1093和ErrorCode:1175的解决办法

Error Code: 1093. You canError Code: 1093. You cant specify target table ws_product for update in FROM clause这个是我们在使用update或者delete语句时,在where条件里面加入的子查询导致的。例如如下的update语句:update table set type static …

安装mysql8.019命令符_MySQL 8.0.19安装教程(windows 64位)

话不多说直接开干目录下载完成后解压解压完是这个样子配置初始化的my.ini文件的文件解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目录下添加的my.ini(新建文本文件,将文件类型改为的.ini),写入基本配置:[mysqld]# …

入Java_初入Java的方法

Java的方法类似于其他语言如C中的函数,比如我们第一个Java程序 输出Hello,world!中用到一个方法System.out.printfln();这里的printfln()就是一个方法,System是系统类,out是对象。1.什么是方法?方法是语句…

java method_JAVA Method的解析

java.lang.reflect.MethodMethodpublic final class Method extends Executable数据的层级结构Paste_Image.pngMethod中的方法boolean [equals].将此方法与指定的对象进行比较T extends [Annotation]T [getAnnotation]如果存在注释,则返回指定类型的注释否则返回为n…

java中this_多学习才能多赚钱之:java中this什么用

java中this什么用1、this调用当前属性:其主要作用是当需要给类中的数据进行初始化时,可以通过this来进行赋值,而不用随便定义一个变量来进行赋值,更有利于代码的阅读与理解(推荐教程:java教程)class Book{//定义书的类…

java api 英文_教你查阅Java API 英文文档(JDK 11)

然后找到“Specifications”并点击 API Documentation比如我们在别人的源码里看到了方法[也叫函数]: Scanner input new Scanner(System.in);所以搜索一下右上角 Scanner,对比我们看到的源码里import,发现是java.util包里的,所以…

jedis使用_Redis --Java客户端 Jedis

Redis --Java客户端 Jedis 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 Jedis: 一款java操作redis数据库的工具. 菜鸟教程文档地址 使用…

找出最具竞争力的子序列_力扣300——最长上升子序列

这道题主要涉及动态规划,优化时可以考虑贪心算法和二分查找。原题给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最…

java 动态字符串_Java动态编译执行一串字符串,类似于Javascript里的eval函数

Javascript里的eval函数能动态执行一串js脚本。那Java里怎么做到呢。有两种方法:一种是使用可以执行js脚本的Java类 ScriptEngineManagerpublic static void main(String args[]){ScriptEngineManager manager new ScriptEngineManager();ScriptEngine se manager.getEngineB…

jquery全局变量_jQuery源码一个小细节,却很好地体现了性能优化的思想,很优秀...

写在前面听闻大佬们在写一些框架或者库的时候,到处都隐藏了一些细节,所以阅读他们的源代码,无论从性能优化、还是JS API的学习、亦或是代码风格等方面给到我们很多启发。这两天我翻看了一下jQuery1.x的源代码,看到了这么一段&…