当前位置: 首页 > article >正文

HDFS源码(二)

DataNode启动源码创建HttpServer初始化DataNode Rpc服务获取NameNode Rpc代理Datanode向NameNode注册DataNode与NameNode周期心跳及block块汇报数据上传源码创建文件系统及初始化DFSClient连接NN创建目录启动DataStreamer线程向dataQueue队列中写入packet设置副本写入策略源码protected Node chooseTargetInOrder(int numOfReplicas, Node writer, final SetNode excludedNodes, final long blocksize, final int maxNodesPerRack, final ListDatanodeStorageInfo results, final boolean avoidStaleNodes, final boolean newBlock, EnumMapStorageType, Integer storageTypes) throws NotEnoughReplicasException { // 计算结果列表的大小默认初始 results 为0result集合表示副本所在的节点 final int numOfResults results.size(); // 如果结果列表为空 if (numOfResults 0) { // 选择本地节点作为第一个副本存储位置并向result中加入节点 DatanodeStorageInfo storageInfo chooseLocalStorage(writer, excludedNodes, blocksize, maxNodesPerRack, results, avoidStaleNodes, storageTypes, true); //writer第一个副本要写出的DataNode节点 writer (storageInfo ! null) ? storageInfo.getDatanodeDescriptor() : null; //减去一个副本后如果为0则返回writer,否则不返回继续 if (--numOfReplicas 0) { return writer; } } //第一个副本所在DN节点 final DatanodeDescriptor dn0 results.get(0).getDatanodeDescriptor(); if (numOfResults 1) { //选择远程机架存放第二个副本 chooseRemoteRack(1, dn0, excludedNodes, blocksize, maxNodesPerRack, results, avoidStaleNodes, storageTypes); if (--numOfReplicas 0) { //writer第一个副本要写出的DataNode节点 return writer; } } if (numOfResults 2) { //第二个副本所在DN节点 final DatanodeDescriptor dn1 results.get(1).getDatanodeDescriptor(); if (clusterMap.isOnSameRack(dn0, dn1)) {//如果dn0与dn1是同一机架第三个副本选择不同机架 chooseRemoteRack(1, dn0, excludedNodes, blocksize, maxNodesPerRack, results, avoidStaleNodes, storageTypes); } else if (newBlock){//如果是新块选择与dn1 第二个副本所在节点相同的机架上放第三个副本 chooseLocalRack(dn1, excludedNodes, blocksize, maxNodesPerRack, results, avoidStaleNodes, storageTypes); } else {//随机选择一台节点存储第3个副本 chooseLocalRack(writer, excludedNodes, blocksize, maxNodesPerRack, results, avoidStaleNodes, storageTypes); } if (--numOfReplicas 0) { //writer第一个副本要写出的DataNode节点 return writer; } } //大于3个副本随机选择节点存放副本 chooseRandom(numOfReplicas, NodeBase.ROOT, excludedNodes, blocksize, maxNodesPerRack, results, avoidStaleNodes, storageTypes); //writer第一个副本要写出的DataNode节点 return writer; }“chooseTargetInOrder”方法代码逻辑为block 副本找到存储节点的策略然后返回block所在的第一个节点首先第一个block存储在本机第二个block存储在远程机架第三个副本存储时先判断是否第一个副本和第二个副本是否在同一机架如果在同一机架那么第三个副本选择不同机架进行存储否则选择与第二个副本相同机架的随机节点进行存储。最终该方法返回存储第一个副本的DataNode节点。客户端与DataNode建立socket通信向Datanode中写入数据数据读取源码数据 从HDFS中读取数据代码如下public class ReadDataFromHDFS { public static void main(String[] args) throws IOException, InterruptedException { Configuration conf new Configuration(); //创建FileSystem对象 FileSystem fs FileSystem.get(URI.create(hdfs://node1:8020/),conf,root); //创建HDFS文件路径 Path path new Path(/test.txt); FSDataInputStream in fs.open(path); //读取HDFS中数据 BufferedReader br new BufferedReader(new InputStreamReader(in)); String newLine ; while((newLine br.readLine()) ! null) { System.out.println(newLine); } //关闭流对象 br.close(); in.close(); } }HDFS中数据读取源码相对简单客户端从HDFS中获取文件数据时首先会向NameNode获取文件相关的block信息然后连接各个Datanode以流方式读取数据即可。连接NameNode获取block信息“namenode.getBlockLocations(src, start, length)”最终调用到NameNodeRpcServer.getBlockLocations(...)方法。回到DFSClient.open()方法中最终通过执行“return openInternal(locatedBlocks, src, verifyChecksum);”返回DFSInputStream对象。客户端通过socket连接DataNodeDataNode返回block数据流最终通过readBuffer(...)从DataNode中获取文件数据。

相关文章:

HDFS源码(二)

DataNode启动源码 创建HttpServer 初始化DataNode Rpc服务 获取NameNode Rpc代理 Datanode向NameNode注册 DataNode与NameNode周期心跳及block块汇报 数据上传源码 创建文件系统及初始化DFSClient 连接NN创建目录 启动DataStreamer线程 向dataQueue队列中写入packet 设置副本写…...

苍穹外卖 项目记录 第四天

第四天任务 完成套餐管理模块所有业务功能,包括:新增套餐套餐分页查询删除套餐修改套餐起售停售套餐每个功能的实现都要按照一般开发流程:需求分析和设计(结合产品原型,接口设计,数据库设计) -> 代码实现 -> 功能测试(成功后提交代码)套…...

XT2055 双灯显示微型线性电池充电管理芯片

■ 产品概述 XT2055 是一款完善的单节锂电池恒流/恒压线性充电管理芯片。较薄的尺寸和较小的封装使它适用于便携式产品的应用,XT2055 也适用于 USB 的供电电路。得益于内部的MOSFET 结构,在应用上不需要外部电阻和阻塞二极管。在高能量运行和外围温度较高…...

多说话人场景下的设备定向语音检测技术解析

1. 多说话人场景下的设备定向语音检测技术解析在智能语音交互系统中,准确识别用户何时在对设备说话(设备定向语音)而非与他人交谈,是提升用户体验的关键技术挑战。这项技术被称为设备定向语音检测(Device-Directed Spe…...

第1篇:认识Go——我的第一个程序 Go中文编程

第1篇:认识Go——我的第一个程序**作者:**中文编程倡导者—— 李金雨 联系方式: wbtm2718qq.com目标:让你成功运行第一个Go程序,建立学习信心! 预计时间:2课时(90分钟) 难…...

中国移联AI元宇宙产业委调研阿尔特汽车科技园 构建高精尖产业的“技术-场景-商业”融合生态

(央链知播 北京讯) 5月7日,中国移动通信联合会人工智能与元宇宙产业工作委员会(简称“中国移联AI与元宇宙产业委”)、中国移动通信联合会数字文化与智慧教育分会、中国通信工业协会区块链专业委员会等机构秘书长何超带…...

Butlerclaw:OpenClaw AI Agent的图形化桌面管理工具

1. 项目概述如果你和我一样,对AI Agent的潜力感到兴奋,但又对OpenClaw这类框架复杂的安装、配置和日常管理感到头疼,那么Butlerclaw的出现,绝对是一个值得庆祝的消息。简单来说,Butlerclaw是一个为OpenClaw量身打造的“…...

基于微信小程序的家政服务预约系统(30291)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

英雄联盟游戏效率工具League Akari:智能自动化与数据分析完整指南

英雄联盟游戏效率工具League Akari:智能自动化与数据分析完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为BP阶段手速…...

软考(系统架构师)-论分布式缓存架构设计及其应用

摘要 随着企业协同办公系统用户规模与并发请求量持续增长,作为核心支撑的用户中心系统面临高并发查询、数据库压力过载、通讯录同步缓慢、服务 CPU 与内存频繁告警等性能瓶颈。本人在项目中担任系统架构师,负责用户中心分布式多级缓存架构的选型、设计、…...

Android本地AI语音助手Cliff:开源、离线与可定制的边缘计算实践

1. 项目概述:Cliff,一个运行在Android上的本地化AI语音助手最近在GitHub上看到一个挺有意思的项目,叫“Cliff-Android-Voice-Assistant”。光看名字,你大概能猜到它是一个给安卓设备用的语音助手。但和Siri、小爱同学、Google Ass…...

终极指南:快速掌握碧蓝航线Live2D资源提取技术

终极指南:快速掌握碧蓝航线Live2D资源提取技术 【免费下载链接】AzurLaneLive2DExtract OBSOLETE - see readme / 碧蓝航线Live2D提取 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneLive2DExtract 在数字内容创作和游戏开发领域,Live2D动…...

大语言模型越狱攻防全景:从对抗攻击到安全防御实践

1. 项目概述与核心价值如果你正在研究或部署大语言模型,那么“越狱”这个词你一定不陌生。它指的是通过各种技术手段,诱导或迫使一个经过安全对齐的模型,输出其原本被禁止生成的内容,比如有害信息、隐私数据或违反其使用政策的回答…...

二十七、RZN2L CherryUSB移植与性能对比

一、目的/概述1、cherryusb还没有人支持瑞萨芯片,我们尝试在RZN2L CR52上移植CherryUSB协议栈2、在rzn2l芯片上实现USB CDC ACM 功能(实现cherryusb hal)3、对比CherryUSB与瑞萨原厂USB例程的性能差异4、验证全速(12Mbps)和高速(4…...

为什么你需要m4s-converter:让B站缓存视频重获自由的秘密武器

为什么你需要m4s-converter:让B站缓存视频重获自由的秘密武器 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的…...

告别硬件!用OneNET官方simulate-device工具5分钟搞定MQTT设备云端调试

5分钟实现云端MQTT调试:OneNET模拟设备实战指南 物联网开发中最令人头疼的环节莫过于硬件与云端的联调——硬件没到位时开发停滞,硬件到手后又要面对各种通信问题。OneNET的simulate-device工具彻底改变了这种被动局面,它让开发者能在零硬件依…...

别再手动下载了!用Chocolatey在Windows上一键安装Zookeeper 3.8.0

告别繁琐配置:用Chocolatey在Windows上极速部署Zookeeper 每次在Windows环境下部署Zookeeper,你是否还在重复下载压缩包、配置环境变量、修改配置文件的传统流程?对于追求效率的开发者而言,这种手动操作不仅耗时耗力,还…...

AI支付架构选型:Card Rails与Agent Rails的深度对比与实践指南

1. 项目概述:AI支付架构的十字路口最近在设计和落地几个AI驱动的支付系统时,我反复被一个核心的架构选择所困扰:是采用“Card Rails”还是“Agent Rails”?这不仅仅是技术选型,更是两种截然不同的产品哲学和风险控制思…...

3步解锁百度网盘满速下载:告别限速困扰的完整方案

3步解锁百度网盘满速下载:告别限速困扰的完整方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的非会员下载速度而烦恼吗?面对100KB/…...

CM-GAI:融合最优传输与连续介质力学的物理约束生成模型

1. 项目概述:当连续介质力学遇见最优传输在工程与材料科学的深水区,我们常常面临一个令人头疼的“数据荒”问题:极端条件下的物理场数据,比如材料在接近熔点的应力-应变行为,或者结构在超高冲击速度下的瞬态变形&#…...

GPU硬件操作强度与LLM推理效率优化实践

1. 硬件操作强度(HOI)与LLM推理效率的深度解析在GPU加速的大型语言模型推理场景中,我们常常遇到一个看似矛盾的现象:计算单元利用率不足的同时,显存带宽却成为瓶颈。这种现象的根源在于硬件操作强度(Hardwa…...

ARMv8 A64指令集SIMD与浮点运算优化指南

1. A64指令集SIMD与浮点运算架构解析在ARMv8架构中,A64指令集的SIMD(单指令多数据流)和浮点运算单元构成了高性能计算的核心引擎。这套指令集的设计体现了现代处理器架构中数据级并行(DLP)的精髓——通过单条指令同时处…...

从恒流源到差动放大:铂电阻测温电路的优化路径与实践

1. 铂电阻测温基础与设计挑战 铂电阻作为工业测温的中坚力量,其核心优势在于稳定的物理特性。PT100在0℃时标称电阻为100Ω,温度系数为0.385Ω/℃。这个看似简单的参数背后,却隐藏着电路设计的三大矛盾:灵敏度与噪声的博弈、线性度…...

Gemini Deep Research调用失败?5类报错代码详解+官方未公开的API绕过方案(限时技术内参)

更多请点击: https://intelliparadigm.com 第一章:Gemini Deep Research功能怎么用 Gemini Deep Research 是 Google 推出的面向专业研究者的增强型推理能力模块,专为长上下文分析、跨文档信息整合与假设验证设计。启用该功能需通过 Gemini …...

Ubuntu 20.04虚拟机重启后断网?别慌,用Netplan配置静态IP一劳永逸(附避坑指南)

Ubuntu 20.04虚拟机网络配置终极指南:Netplan静态IP与持久化方案 当你兴奋地启动Ubuntu 20.04虚拟机准备大展身手时,突然发现网络连接消失了——这不是个别现象。许多开发者在本地虚拟化环境或云平台中都遭遇过类似困扰。本文将彻底解决这个"幽灵断…...

ChatSVA:多智能体框架革新硬件验证中的SVA生成

1. ChatSVA:硬件验证领域的SVA生成革命在集成电路设计领域,功能验证已成为制约开发效率的最大瓶颈。据统计,现代芯片开发周期中超过50%的时间消耗在功能验证环节,而SystemVerilog断言(SVA)作为形式化验证和…...

Midjourney Chlorophyll印相实战手册(含独家--sref权重调优表与叶脉纹理增强公式)

更多请点击: https://intelliparadigm.com 第一章:Midjourney Chlorophyll印相的技术起源与美学范式 Chlorophyll印相并非传统暗房工艺的简单复刻,而是Midjourney V6模型在跨模态语义理解基础上,对植物色素光学响应机制进行算法化…...

CC2530项目实战:用OLED屏做个简易温湿度显示器(基于DHT11传感器)

CC2530实战:基于DHT11的OLED温湿度监测系统开发指南 在嵌入式开发领域,将传感器数据可视化是物联网项目的核心技能之一。CC2530作为一款经典的51内核单片机,搭配0.96寸OLED屏幕和DHT11温湿度传感器,可以构建一个低成本但功能完整的…...

拒绝“见光死”:为什么真正的全域店群RPA必须内置原生指纹浏览器内核?

大家好,我是林焱,一名专注电商底层业务逻辑与企业级 RPA 自动化架构定制的独立开发者。 在 CSDN 的技术交流群里,我经常会遇到一些开发者抛出这样的疑问:“林大,我用 Python 写了一套并发脚本,去管理公司旗…...

AI工作流框架实战:从脚本到自动化流程的架构设计与应用

1. 项目概述:当AI遇上工作流最近在折腾自动化工具链,发现一个挺有意思的项目叫ai-flow。这名字听起来就挺直白,AI 工作流。简单来说,它就是一个用代码来编排和自动化AI任务(比如调用大语言模型、处理数据、执行特定操…...