一. DataNode类图
二. DateNode属性说明
- DatanodeProtocol namenode:RPC代理类。RPC.getProxy(nameNodeAddress)得到远程NameNode代理类。后续的versionRequest(),register(),sendHeartbeat(),blockReceived(),blockReport()都是namenode的行为。
- org.apache.hadoop.ipc.Server ipcServer:RPC Server。conf里配置ipcAddr=0.0.0.0:50020,ipcServer = RPC.getServer(this, ipcAddr.getHostName()...),此DataNode作为RPC Server提供远程服务,提供接口ClientDatanodeProtocol和InterDatanodeProtocol中定义的服务。
- HttpServer infoServer:a Jetty embedded server to answer http requests。
- DataStorage storage:参考http://zy19982004.iteye.com/admin/blogs/1878758。
- DatanodeRegistration dnRegistration:DatanodeRegistration class conatins all information the Namenode needs to identify and verify a Datanode when it contacts the Namenode.后续的sendHeartbeat(),blockReceived(),blockReport()方法第一个参数就是DatanodeRegistration 。
- FSDatasetInterface data:FSDataset的接口,管理着DataNode的所有block。参考http://zy19982004.iteye.com/admin/blogs/1880303。
- DataBlockScanner blockScanner:定时对数据块文件进行校验。
- DataXceiverServer dataXceiverServer:参考http://zy19982004.iteye.com/admin/blogs/1881117。
- LinkedList<Block> receivedBlockList:成功创建的新block。
- LinkedList<String> delHints:可以删掉该数据块的节点。DataXceiver.replaceBlock()和writeBlock成功后会调用DataNode.notifyNamenodeReceivedBlock()方法给这两个List add value.
protected void notifyNamenodeReceivedBlock(Block block, String delHint) { synchronized (receivedBlockList) { synchronized (delHints) { receivedBlockList.add(block); delHints.add(delHint); receivedBlockList.notifyAll(); } } }
三. 代码顺序阅读
- main()函数入口。
public static void main(String args[]) { secureMain(args, null); }
- secureMain():初始化DataNode;加入线程里。
public static void secureMain(String [] args, SecureResources resources) { DataNode datanode = createDataNode(args, null, resources); if (datanode != null) datanode.join(); }
- createDataNode():初始化DataNode;启动该线程。
public static DataNode createDataNode(String args[], Configuration conf, SecureResources resources) throws IOException { DataNode dn = instantiateDataNode(args, conf, resources); runDatanodeDaemon(dn); return dn; }
- instantiateDataNode():读取dataDirs;调用makeInstance()。makeInstance():check dataDirs;new DateNode。new DataNode():调用startDataNode()。
public static DataNode instantiateDataNode(String args[], Configuration conf, SecureResources resources) throws IOException { String[] dataDirs = conf.getStrings(DATA_DIR_KEY); return makeInstance(dataDirs, conf, resources); } public static DataNode makeInstance(String[] dataDirs, Configuration conf, SecureResources resources) throws IOException { DiskChecker.checkDir(localFS, new Path(dir), dataDirPermission); return new DataNode(conf, dirs, resources); } DataNode(final Configuration conf, final AbstractList<File> dataDirs, SecureResources resources) throws IOException { startDataNode(conf, dataDirs, resources); }
- startDataNode():1.根据conf对象初始化各个ip port;2.初始化DataStorage;3.初始化DatanodeRegistration;4.初始化DatanodeProtocol;5.handshake() get version and id info from the name-node,实际调用namenode.versionRequest();6.DataStorage.recoverTransitionRead(...)检查文件系统的状态并做恢复;7.初始化FSDatasetInterface;8.初始化DataBlockScanner;9.创建serverSocket,据此初始化DataXceiverServer;10.HttpServer,配置参数然后启动;11.初始化ipcServer;
- 接3,runDatanodeDaemon():注册DataNode;启动DataNode线程。
public static void runDatanodeDaemon(DataNode dn) throws IOException { if (dn != null) { dn.register(); dn.dataNodeThread = new Thread(dn, dnThreadName); dn.dataNodeThread.setDaemon(true); // needed for JUnit testing dn.dataNodeThread.start(); } } private void register() throws IOException { dnRegistration = namenode.register(dnRegistration); }
- 进入run():启动DataXceiverServer线程;启动ipcServer;startDistributedUpgradeIfNeeded() Start distributed upgrade if it should be initiated by the data-node;offerService()开始工作。
public void run() { LOG.info(dnRegistration + "In DataNode.run, data = " + data); dataXceiverServer.start(); ipcServer.start(); while (shouldRun) { startDistributedUpgradeIfNeeded(); offerService(); }
- offerService():1.定期heartBeatInterval调用namenode.sendHeartbeat()发送DataNode信息的心跳,并执行带回的DatanodeCommand;2.一直调用namenode.blockReceived()向Namenode报告最近接收到的数据块、要删除的多余块副本;3.定期调用namenode.blockReport()发送block report 告诉NameNode此DataNode上的block信息,并执行带回的DatanodeCommand。4.启动blockScannerThread线程。
public void offerService() throws Exception { while (shouldRun) { try { long startTime = now(); if (startTime - lastHeartbeat > heartBeatInterval) { lastHeartbeat = startTime; 1.DatanodeCommand[] cmds = namenode.sendHeartbeat(dnRegistration, data.getCapacity(), data.getDfsUsed(), data.getRemaining(), xmitsInProgress.get(), getXceiverCount()); processCommand(cmds); } 2.namenode.blockReceived(dnRegistration, blockArray, delHintArray); blockReceived成功后删除receivedBlockListhe delHints里的数据 if (startTime - lastBlockReport > blockReportInterval) { 3.DatanodeCommand cmd = namenode.blockReport(dnRegistration, BlockListAsLongs.convertToArrayLongs(bReport)); processCommand(cmd); } blockScannerThread = new Daemon(blockScanner); blockScannerThread.start(); } // while (shouldRun) } // offerService }
相关推荐
rip宣告网段选择版本
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码,本资源中的源码都是经过本地编译过可运行的,评审分达到98分,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、期末大作业和课程设计使用需求,如果有需要的话可以放心下载使用。 基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码基于BP神经网络的电力负荷预测-基于BP神经网络的短期电力负荷预测源码基于BP神经网络的电力负荷预测-基
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
渗透测试报告模板,供大家参考如何写报告
I型NPC三电平逆变器 仿真 有三相逆变器参数设计,SVPWM,直流均压控制,双闭环控制说明文档(可加好友另算) SVPWM调制 中点电位平衡控制,LCL型滤波器 直流电压1200V,交流侧输出线电压有效值800V,波形标准,谐波含量低。 采用直流均压控制,中点电位平衡控制,直流侧支撑电容两端电压偏移在0.3V之内,性能优越。 参数均可自行调整,适用于所有参数条件下,可用于进一步开发
燕山大学EDA综合实训实验报告
qt 一个基于qt实现钩子屏蔽系统按键、任务管理器、任务栏实例. 一个基于qt实现钩子屏蔽系统按键、任务管理器、任务栏实例.
headers-more-nginx-module-v0.34.tar.gz 下载 headers-more-nginx-module是Nginx的第三方模块,它提供了一些额外的功能,用于设置HTTP
牢大防火墙_牢大防火墙.apk
半桥 全桥LLC仿真,谐振变器的四种基本控制方式。 主要有 频率控制PFM PWM控制 移相控制PSM 混合控制PFM+PSM 运行环境有plecs matlab simulink
基于51单片机的密码锁设计proteus
Yakit 是一个基于 Yak 语言开发的集成化安全能力平台,旨在为网络安全从业者提供一个易于使用的工具。它通过图形化用户界面(GUI)来操控 Yak 引擎的能力,使得用户无需编写代码即可利用 Yak 的强大安全功能
里面是本人大学中所完成的 PPT
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
Artwork Collect网站源代码压缩包
包含项目论文和毕业答辩PPT,详情请看博客:https://blog.csdn.net/2401_87429224/article/details/144995193 论文主要包括以下内容: 1、中英文摘要; 2、目录; 3、绪论,包括背景、意义、开发工具、国内外现状等; 4、系统分析,包括可行性分析、设计原则、需求分析、业务流程分析等; 5、系统设计,包括功能设计、数据库设计等; 6、系统实现,包括各模块实现; 7、软件测试,包括测试环境、测试条件、运行情况等。
在Android平台上开发一款天气预报应用是一项常见的任务,它涉及到多个技术层面,包括用户界面设计、数据获取、数据解析以及实时更新等。以下是对这个"较简单的天气预报APP"可能涉及的关键知识点的详细解释: 1. **Android Studio**:作为Android应用开发的主要集成开发环境(IDE),Android Studio提供了丰富的工具来帮助开发者编写、调试和发布应用。它内置了Gradle构建系统,使得项目管理和依赖管理更加方便。 2. **布局设计**:UI设计是天气应用的重要部分,通常会使用XML布局文件来定义各个屏幕的组件和布局。例如,可能包含一个用于显示城市名的TextView,一个用于展示当前温度的ImageView,以及用于显示未来几天预报的RecyclerView。 3. **数据获取**:天气信息通常来自于网络API,如OpenWeatherMap或AccuWeather等。开发者需要编写HTTP请求代码,使用像OkHttp或者Retrofit这样的网络库来获。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
一款简单实用的TCP/IP串口透传工具
基于python+opencv实现的柚子缺陷识别检测源码 (高分项目).zip,个人大三大作业设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 基于python+opencv实现的柚子缺陷识别检测源码 (高分项目).zip基于python+opencv实现的柚子缺陷识别检测源码 (高分项目).zip基于python+opencv实现的柚子缺陷识别检测源码 (高分项目).zip基于python+opencv实现的柚子缺陷识别检测源码 (高分项目).zip基于python+opencv实现的柚子缺陷识别检测源码 (高分项目).zip基于python+opencv实现的柚子缺陷识别检测源码 (高分项目).zip基于python+opencv实现的柚子缺陷识别检测源码 (高分项目).zip基于python+opencv实现的柚子缺陷识别检测源码 (高分项目).zip基于python+opencv实现的柚子缺陷识别检测源码 (高分项目).zip