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

HDFS 写入和读取流程


HDFS 写入流程细化

1. 主线流程速记口诀

“先找主脑定文件,分配块副找节点;流水传块多副本,写完通知主脑存。”


2. 详细流程拆解

1. 客户端请求上传(Create 文件)

关键方法:

  • org.apache.hadoop.fs.FileSystem#create
  • org.apache.hadoop.hdfs.DistributedFileSystem#create
  • RPC 调用:ClientProtocol#create

内部逻辑:

  • 客户端调用 FileSystem#create(path),通过 RPC 向 NameNode 发起“我要新建文件”请求。

源码片段:

// FileSystem.java
FSDataOutputStream out = fs.create(new Path("/user/hadoop/test.txt"));
// DistributedFileSystem.java
public FSDataOutputStream create(Path f, ...) {return dfs.create(getPathName(f), ...);
}
// DFSClient.java
public OutputStream create(String src, ...) {namenode.create(src, ...); // RPC 请求
}

口诀注释:
主脑即 NameNode,先发“新建”请求。


2. NameNode 检查与元数据创建

关键方法:

  • org.apache.hadoop.hdfs.server.namenode.FSNamesystem#startFile
  • FSDirectory#addFile

内部逻辑:

  • NameNode 检查目录和权限,文件是否已存在。
  • 创建文件元数据,登记文件名、父目录、权限等。

源码片段:

// FSNamesystem.java
public void startFile(...) {// 检查目录、权限// 创建 INodeFile// 记录日志
}

口诀注释:
主脑查目录权限,登记新文件元数据。


3. Block 分配与 DataNode 列表下发

关键方法:

  • org.apache.hadoop.hdfs.server.namenode.FSNamesystem#allocateBlock
  • BlockManager#chooseTarget4NewBlock

内部逻辑:

  • NameNode 根据副本策略,选择 DataNode 并分配块。
  • 返回块 ID 和 DataNode 列表给客户端。

源码片段:

// FSNamesystem.java
LocatedBlock locatedBlock = allocateBlock(...);// BlockManager.java
chooseTarget4NewBlock(...)

口诀注释:
分配块副本,选定存放节点。


4. 客户端流水线写数据块

关键方法:

  • org.apache.hadoop.hdfs.DFSOutputStream#writeChunk
  • DataStreamer#run

内部逻辑:

  • 客户端建立与第一个 DataNode 的连接,DataNode 之间串联成流水线。
  • 数据块被切分成 packet,按顺序流向各 DataNode。
  • 每个 DataNode 写磁盘并返回 ACK。

源码片段:

// DFSOutputStream.java
writeChunk(...); // 写入数据
// DataStreamer.java
run(); // 负责数据传输和 ACK 处理

口诀注释:
流水线传块,副本级联写入。


5. 块写入完成与确认

关键方法:

  • DataNode#blockReceivedAndDeleted
  • NameNode#complete

内部逻辑:

  • 所有块写入完毕后,客户端通知 NameNode。
  • NameNode 更新文件状态为“已完成”,持久化元数据。

源码片段:

// DFSClient.java
namenode.complete(src, clientName, ...);
// FSNamesystem.java
completeFile(...); // 完成文件写入

口诀注释:
写完通知主脑,文件状态完成。


6. 写入流程图(Mermaid)

Client NameNode DataNode1 DataNode2 DataNode3 create() 分配Block和DataNode列表 写数据块 副本转发 副本转发 ACK complete() Client NameNode DataNode1 DataNode2 DataNode3

HDFS 读取流程细化

1. 主线流程速记口诀

“先问主脑要位置,选好节点取数据;分块并发快下载,组装文件得全局。”


2. 详细流程拆解

1. 客户端请求读取

关键方法:

  • org.apache.hadoop.fs.FileSystem#open
  • RPC:ClientProtocol#getBlockLocations

内部逻辑:

  • 客户端调用 open(path),通过 RPC 向 NameNode 请求块和 DataNode 的位置信息。

源码片段:

// FileSystem.java
FSDataInputStream in = fs.open(new Path("/user/hadoop/test.txt"));
// DFSClient.java
public LocatedBlocks getBlockLocations(String src, ...) {return namenode.getBlockLocations(src, ...); // RPC
}

口诀注释:
主脑给出块位置,客户端拿到 DataNode 列表。


2. NameNode 返回块元数据

关键方法:

  • org.apache.hadoop.hdfs.server.namenode.FSNamesystem#getBlockLocations

内部逻辑:

  • NameNode 查询文件块分布,返回每个块的 DataNode 列表。

源码片段:

// FSNamesystem.java
getBlockLocations(...);

口诀注释:
主脑查块分布,返回节点清单。


3. 客户端读取数据块

关键方法:

  • org.apache.hadoop.hdfs.DFSInputStream#read
  • BlockReaderFactory#newBlockReader

内部逻辑:

  • 客户端从 DataNode 读取数据块,可并发多线程读取不同块。
  • 自动选择健康的 DataNode,若失败自动切换。

源码片段:

// DFSInputStream.java
BlockReader reader = new BlockReaderFactory(...).build();
reader.read(...);

口诀注释:
并发取块,健康优先,故障切换。


4. 数据组装

关键方法:

  • FSDataInputStream#read
  • 由客户端按块顺序拼接还原文件

内部逻辑:

  • 客户端按文件逻辑顺序拼接所有块数据,得到完整文件。

源码片段:

// FSDataInputStream.java
int n = in.read(buffer);

口诀注释:
拼接数据块,文件得全局。


5. 读取流程图(Mermaid)

Client NameNode DataNode1 getBlockLocations() 返回块和DataNode列表 读取数据块 组装完整文件 Client NameNode DataNode1

总结口诀速记

  • 写入口诀
    “先找主脑定文件,分配块副找节点;流水传块多副本,写完通知主脑存。”
  • 读取口诀
    “先问主脑要位置,选好节点取数据;分块并发快下载,组装文件得全局。”

如需某个流程的源码更详细解析或更深入的注释,可以告诉我要哪个部分!

相关文章:

HDFS 写入和读取流程

HDFS 写入流程细化 1. 主线流程速记口诀 “先找主脑定文件,分配块副找节点;流水传块多副本,写完通知主脑存。” 2. 详细流程拆解 1. 客户端请求上传(Create 文件) 关键方法: org.apache.hadoop.fs.File…...

建筑工程施工进度智能编排系统 (SCS-BIM)

建筑工程施工进度智能编排 (SCS-BIM) 源码可见于:https://github.com/Asionm/SCS-BIM 项目简介 本项目是一个面向建筑工程的施工进度智能编制平台,用户只需上传一份标准 IFC 建筑信息模型文件,系统将自动完成以下任务: 解析模…...

Laravel模型状态:深入理解Eloquent的隐秘力量

Laravel的Eloquent ORM(对象关系映射)提供了强大且灵活的功能来处理数据库操作。深入理解Eloquent模型状态对于优化应用程序性能和维护代码的简洁性至关重要。本文将详细探讨Laravel Eloquent的模型状态及其隐秘力量。 一、Eloquent模型的基本概念 Elo…...

Spring Cloud Eureka:微服务架构中的服务注册与发现核心组件

前言 在微服务架构日益流行的今天,服务注册与发现机制成为了构建弹性、可扩展分布式系统的关键。作为Spring Cloud生态中的核心组件,Eureka为微服务架构提供了高效的服务注册与发现解决方案。本文将深入探讨Eureka的设计原理、核心机制以及在实际项目中…...

matlab实现求解兰伯特问题

求解兰伯特问题的matlab代码,非常好用 solve_lambertLYP.m , 1899 StumpffC.m , 136 StumpffdF.m , 294 StumpffF.m , 151 StumpffS.m , 167 Stumpffy.m , 96 text2.m , 104...

iOS 集成网易云信的音视频呼叫组件

云信官方文档在这 前提是集成了云信IM,并且已经IM登录成功,如果没有集成IM的看这里:iOS 集成网易云信IM-CSDN博客 1、CocoPods集成 #云信 pod NIMSDK_LITE, 10.8.0pod NERtcSDK, 5.6.50#rtc基础SDK pod NEChatUIKit#呼叫组件API组件 pod NE…...

【Elasticsearch】search_after不支持随机到哪一页,只能用于上一页或下一页的场景

search_after 确实不支持随机访问(即直接跳到任意一页),因此在前端需要随机跳转到某一页的场景中,使用 search_after 是不合适的。这种情况下,更适合使用 from 和 size 来实现分页。 为什么 search_after 不支持随机访…...

深度解析 Qt 最顶层类 QObject:继承关系与内存生命周期管理

文章目录 深度解析 Qt 最顶层类 QObject:继承关系与内存生命周期管理QObject 的继承关系QObject 的内存与生命周期管理父子对象树结构构造函数中的父对象参数父对象删除时自动删除子对象的原理举例说明 父子对象关系的好处继承关系与构造函数调用顺序信号槽机制与对…...

pikachu通关教程-XSS

XSS XSS漏洞原理 XSS被称为跨站脚本攻击(Cross Site Scripting),由于和层叠样式表(Cascading Style Sheets,CSS)重名,改为XSS。主要基于JavaScript语言进行恶意攻击,因为js非常灵活…...

k8s fsGroup

fsGroup 是 Kubernetes 中 securityContext 的一个字段,用于为 Pod 中的所有容器设置共享的文件系统组 ID(GID)。当你在 Pod 的 securityContext 中设置了 fsGroup,Kubernetes 会对挂载到 Pod 的 所有 volume(卷&#…...

Spring Boot,注解,@ConfigurationProperties

好的,这是上面关于 ConfigurationProperties 注解和 setter 方法的判断题及其解析的中文版本: 该判断题表述为:“使用ConfigurationProperties 注解注入属性值时,必须为对应的属性提供setter方法。” 这个说法是 正确的。 Config…...

AIGC学习笔记(9)——AI大模型开发工程师

文章目录 AI大模型开发工程师008 LangChain之Chains模块1 Chain模块核心知识2 Chain模块代码实战LLMSequentialTransformationRouter AI大模型开发工程师 008 LangChain之Chains模块 1 Chain模块核心知识 组合常用的模块 LLM:最常见的链式操作类型SequentialChain…...

git管理github上的repository

1. 首先注册github并创建一个仓库,这个很简单,网上教程也很多,就不展开说了 2. 安装git,这个也很简单,不过这里有个问题就是你当前windows的用户名即:C/Users/xxx 这个路径不要有中文,因为git …...

STM32学习之WWDG(原理+实操)

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...

Keil MDK5.37或更高版本不再预装ARM Compiler Version5导致编译错误的解决方法

Keil MDK5.37预装的是最新的ARM Compiler Version6 我们可以先右击查看工程属性 在Target标签下,我们可以看到Compiler Version5就是丢失的 在Target标签下,我们可以看到Compiler Version5就是丢失的 图1 以固件库方式编程,编译之后全是错…...

【iOS(swift)笔记-14】App版本不升级时本地数据库sqlite更新逻辑二

App版本不升级时,又想即时更新本地数据库怎么办? 办法二:从服务器下载最新的sqlite数据替换掉本地的数据(注意是数据不是文件) 稍加调整, // !!!注意!&…...

前端性能优化:提升用户体验的关键策略

引言 在当今快速发展的互联网时代,用户对网页加载速度和交互流畅度的要求越来越高。前端性能优化已成为提升用户体验、降低跳出率、提高转化率的关键因素。本文将深入探讨前端优化的核心策略和实践方法,帮助开发者构建更快、更高效的Web应用。 一、网络…...

Unity-UI组件详解

今天我们来学习Unity的UI的详解,这部分的内容相对较少,对于程序员来说主要的工作是负责将各种格式的图片呈现在显示器上并允许操作这些图片。 本篇帖子的理论依据依然是官方开源的UGUI代码,网址为:GitHub - Unity-Technologies/u…...

基于大模型的短暂性脑缺血发作(TIA)全流程预测与干预系统技术方案

目录 一、系统架构总览二、核心模块详细设计三、系统集成方案四、系统部署拓扑图五、技术验证方案六、健康管理子系统七、安全与合规设计技术指标与性能保障八、HL7 FHIR接口规范九、分层蒸馏方案十、多中心RCT研究设计十一、硬件选型成本优化方案跨模块集成工作流一、系统架构…...

嵌入式学习 D31:系统编程--Framebuf帧缓冲

(1)framebuf帧缓冲 :linux提供的显示设备驱动的接口。 设备路径 : 设备/dev/fb0 * 分辨率:像素点是w * h。 每个像素点色深 RGB:0-255 红绿蓝各3字节(byte)即可描述色深。…...

黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐

简历上展示黑马点评 完整代码地址 项目描述 黑马点评项目是一个springboot开发的前后端分离项目,使用了redis集群、tomcat集群、MySQL集群提高服务性能。类似于大众点评,实现了短信登录、商户查询缓存、优惠卷秒杀、附近的商户、UV统计、用户签到、好…...

Java 大视界 -- Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制(273)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

【数据库】安全性

数据库安全性控制的常用方法:用户标识和鉴定、存取控制、视图、审计、数据加密。 1.用户标识与鉴别 用户标识与鉴别(Identification & Authentication)是系统提供的最外层安全保护措施。 2.存取控制 2.1自主存取控制(简称DAC) (1)同一用户对于不同的数据对…...

【图像处理入门】4. 图像增强技术——对比度与亮度的魔法调节

摘要 图像增强是改善图像视觉效果的核心技术。本文将详解两种基础增强方法:通过直方图均衡化拉伸对比度,以及利用伽马校正调整非线性亮度。结合OpenCV代码实战,学会处理灰度图与彩色图的不同增强策略,理解为何彩色图像需在YUV空间…...

D2-基于本地Ollama模型的多轮问答系统

本程序是一个基于 Gradio 和 Ollama API 构建的支持多轮对话的写作助手。相较于上一版本,本版本新增了对话历史记录、Token 计数、参数调节和清空对话功能,显著提升了用户体验和交互灵活性。 程序通过抽象基类 LLMAgent 实现模块化设计,当前…...

HALCON 深度学习训练 3D 图像的几种方式优缺点

HALCON 深度学习训练 3D 图像的几种方式优缺点 ** 在计算机视觉和工业检测等领域,3D 图像数据的处理和分析变得越来越重要,HALCON 作为一款强大的机器视觉软件,提供了多种深度学习训练 3D 图像的方式。每种方式都有其独特的设计思路和应用场…...

123网盘SDK-npm包已发布

前言 大家好!今天想和大家分享一个我最近开源的项目:123 网盘 SDK。这个项目已经在 GitHub 开源,最近已经发布到 NPM,可以通过 npm i ked3/pan123-sdk 直接安装使用。 项目背景:为什么要开发这个 SDK? 在…...

强制卸载openssl-libs导致系统异常的修复方法

openssl升级比较麻烦,因为很多软件都会依赖它,一旦强制卸载(尤其是openssl-libs.rpm),就可能导致很多命令不可用,即使想用rpm命令重新安装都不行。 所以,除非万不得已,否则不要轻易去卸载openssl-libs。而且…...

乐播视频v4.0.0纯净版体验:高清流畅的视听盛宴

先放软件下载链接:夸克网盘下载 探索乐播视频v4.0.0纯净版:畅享精彩视听之旅 乐播视频v4.0.0纯净版为广大用户带来了优质的视频观看体验,是一款值得关注的视频类软件。 这款软件的资源丰富度令人惊喜,涵盖了电影、电视剧、综艺、动漫等多种…...

Linux 命令全讲解:从基础操作到高级运维的实战指南

Linux 命令全讲解:从基础操作到高级运维的实战指南 前言 Linux 作为开源操作系统的代表,凭借其稳定性、灵活性和强大的定制能力,广泛应用于服务器、云计算、嵌入式设备等领域。对于开发者、运维工程师甚至普通用户而言,熟练掌握…...