HDFS图解及流对文件的操作

本文介绍了Hadoop分布式文件系统(HDFS),一种专为运行在普通硬件上的分布式文件系统设计的技术。HDFS提供了高容错性和高吞吐量的数据访问方式,特别适合处理大型数据集。文中还详细解析了HDFS的读写过程,并通过代码示例展示了如何从HDFS读取数据及向其写入数据。

HDFSHadoop Distributed File SystemHadoop分布式文件系统

Introduction:The Hadoop Distributed File System (HDFS) is a distributed file system designed to run on commodity hardware. It has many similarities with existing distributed file systems. However, the differences from other distributed file systems are significant. HDFS is highly fault-tolerant and is designed to be deployed on low-cost hardware. HDFS provides high throughput access to application data and is suitable for applications that have large data sets. HDFS relaxes a few POSIX requirements to enable streaming access to file system data. HDFS was originally built as infrastructure for the Apache Nutch web search engine project. HDFS is part of the Apache Hadoop Core project.

大致意思:Hadoop分布式文件系统是一个分布式文件系统,为了运行在普通硬件上而设计的,它和已经存在的分布式文件系统很相似。然而,不同之处是其他的分布式文件系统是重要的(因为是单节点)。Hdfs是高容错和为廉价硬件而设计的。Hfds提供高的吞吐量对于通过应用的数据和大的数据集是最合适的。HDFS放宽了一些POSIX要求,允许对文件系统数据进行流式访问,hdfs是以Apache nutch 网页搜索引擎项目而开发的。Hdfs是Apache Hadoop核心的一部分。

 

1、Hdfs读写过程(图解)

 

 

  1. Hdfs 以流的形式实现读写过程

1)数据的读取

Public void downloadFile(){

//1.针对hdfs获取一个文件的输入流

FSDataInputStream input = fs.open(new Path(“/hadoop修炼笔记”));

//2.针对本地文件获取一个文件的输出流

FileOutputStream output = new FileOutputStream(new File(“e:/”));

//3.利用工具类写入

IOUtils.copyBytes(input,output,4096);

//4.刷新写入流,写到磁盘

Output.flush();

//5.关闭流

Output.close();

Input.close();

}

  1. 数据的写入

Public void uploadFile(){

//1.针对hdfs获取一个文件的输出流

FSDataOutputStream output = fs.create(new Path(“/aaa/”));

//2.针对本地文件获取一个文件的输入流

FileInputStream input = new FileInputStream(“e:/hadoop修炼笔记”);

//3.利用工具类写入

IOUtils.copyBytes(input,output4096);

//4.刷新写入流,写到磁盘

Output.flush();

//5.关闭流

Output.close();

Input.close();

}

<think> 首先,用户的问题是关于HDFS分布式存储的工作程的详细解释。用户提到了“HDFS分布式存储工作程”,结合引用内容,我需要集中在HDFS的读写程上,因为引用中提到了1.5节专门讨论了读写程。 从引用[1]中: - 1.5 HDFS的读写程 - 1.5.1 写的程 - 1.5.1.1 步骤 - 1.5.1.1 架构图 - 1.5.2 读程 - 1.5.2.1 步骤 - 1.5.2.1 架构图 引用[2]、[3]、[4]提供了额外的背景:HDFS是分布式文件系统,用于处理大规模数据,强调高容错、跨平台等特性。引用[3]还提到了HDFS命令,但用户的问题是专注于工作程。 用户指定了“工作程”,所以我需要详细解释读写程的步骤和架构。引用[1]有明确的步骤和架构图描述,但由于文本中没有实际图,我需要用文字描述步骤。 回忆HDFS的基本架构: - NameNode:元数据管理,存储文件系统的命名空间、文件块位置等。 - DataNode:实际存储数据块。 - Secondary NameNode:协助NameNode处理检查点,不是HA中的备用。 在写程和读程中,都有标准步骤。 写程: 1. 客户端联系NameNode请求写入文件。 2. NameNode验证权限并分配数据块位置(DataNodes)。 3. 客户端直接写入到DataNodes管道(pipeline),数据被复制到多个节点。 4. 确认写入成功。 读程: 1. 客户端联系NameNode获取文件块位置。 2. NameNode返回块位置。 3. 客户端直接从DataNodes读取数据。 从引用[1]的具体点: - 1.5.1 写的程:步骤和架构图 - 1.5.2 读程:步骤和架构图 我需要结构化回答: - 先介绍HDFS整体,然后分写程和读程。 - 确保使用中文。 - 遵循系统级指令: - 行内数学表达式用$...$,但在这里可能不涉及数学,所以可能不需要。 - 独立公式用$$...$$,同样可能不适用。 - LaTeX语法正确:如果有公式,但这里主要是文本,所以关注描述。 - 生成相关问题:在末尾添加相关问题。 - 引用末尾添加标识:引用来自[^1]、[^2]等。 - 回答结构清晰:步骤式解释。 用户引用是[1]到[4],所以我应该在回答中引用这些来源。 构建回答大纲: 1. **引言**:简要介绍HDFS及其重要性。 - 引用[2]:HDFS是Hadoop分布式文件系统,用于处理大规模数据。 2. **HDFS架构概述**:快速介绍NameNode、DataNode角色。 - 引用[1]:1.2节节点功能。 3. **写工作程**: - 详细步骤。 - 引用[1]:1.5.1写的程。 4. **读工作程**: - 详细步骤。 - 引用[1]:1.5.2读程。 5. **相关优化和注意事项**:如HA架构的影响。 - 引用[1]:1.8 HA架构。 - 引用[4]:合并时机等。 6. **总结**。 7. **相关问题**:生成相关问题。 生成相关问题: - 基于内容,如HA架构下的读写差异、性能优化等。 确保回答真实可靠:基于标准HDFS知识,匹配引用。 最终回答结构: - 使用标题分段。 - 步骤用列表。 - 引用标识在相关段落末尾。 </think> ### HDFS分布式存储工作程详解 Hadoop分布式文件系统(HDFS)是Apache Hadoop生态系统的核心组件,专注于存储和管理大规模数据集(如PB级数据)。它具有高容错性、高扩展性,并能处理式数据访问(一次写入、多次读取)。HDFS的核心架构包括主节点(NameNode)管理元数据(如文件路径、块位置),和从节点(DataNode)存储实际数据块(默认副本数为3)。下面,我将详细介绍HDFS的工作程,包括写程和读程。内容基于引用资料中的读写程章节(1.5节),并结合HA架构等优化点进行说明。[^1][^2] #### 1. HDFS架构概述 在深入工作程前,先简要回顾HDFS架构: - **NameNode**:作为主节点,负责管理文件系统的元数据(如命名空间、文件块映射),但不直接处理数据。在HA(高可用)架构中,有备用NameNode防止单点故障。[^1] - **DataNode**:作为从节点,存储实际数据块(每个块大小默认128MB),并定期向NameNode报告块状态。数据块通过副本机制(默认3份)实现容错。[^1] - **Secondary NameNode**:协助NameNode处理检查点(合并元数据镜像),但非HA备用节点。[^4] - **客户端**:用户或应用程序通过HDFS客户端接口(如命令行或API)发起读写请求。 HDFS专为大规模数据优化,但不适合低延迟访问或小文件存储(引用[2]指出其局限性)。下面分步详解写程和读程。 #### 2. 写工作程 写程指客户端向HDFS写入新文件或追加数据的过程。核心目标是确保数据可靠存储,通过网络管道(pipeline)机制实现高效复制。标准步骤基于引用[1]的1.5.1节描述: 1. **客户端发起写入请求**: 客户端调用`hdfs dfs -put`或API写入文件时,首先联系NameNode,请求文件创建或追加权限。NameNode验证客户端身份和路径合法性(如文件是否存在),并分配数据块位置(选择一组DataNodes)。[^1] 2. **NameNode分配块位置**: NameNode基于机架感知策略(rack awareness)选择DataNodes:优先选择与客户端同机架的节点,以减少网络延迟。返回给客户端一个有序DataNode列表(如D1, D2, D3),其中D1为管道起点节点。[^1] 3. **建立数据管道(pipeline)并写入数据**: 客户端不通过NameNode,直接与DataNodes通信: - 客户端将数据分成数据包(packet,默认64KB),并行发送到管道(pipeline)。 - 管道顺序:数据首先写入D1,D1接收后写入本地磁盘并转发给D2,D2再转发给D3。每个节点写入后发送确认(ack)消息。 - 数据块复制:每个数据块默认复制3份(可配置),确保容错。写入完成后,DataNodes向NameNode报告新块信息。[^1][^3] 4. **确认和完成**: 客户端收到所有DataNodes的确认后,通知NameNode写入成功。NameNode更新元数据(记录块位置)。如果中途失败(如节点宕机),NameNode会重新分配节点重试写入。[^1] **架构图解**(文字描述): - 客户端 → NameNode(获取块位置) → 客户端 → D1 → D2 → D3(数据管道)。 - 关键点:数据不经NameNode,避免瓶颈;管道机制优化网络带宽使用。[^1] 此程在HA架构下类似,但NameNode采用主备切换(如ZooKeeper协调),确保高可用。[^1][^4] #### 3. 读工作程 读程指客户端从HDFS读取文件的过程。核心目标是高效获取数据,通过就近读取策略减少网络开销。标准步骤基于引用[1]的1.5.2节描述: 1. **客户端发起读取请求**: 客户端调用`hdfs dfs -get`或API读取文件时,联系NameNode请求文件元数据(如文件块列表和位置)。NameNode返回块信息(块ID、副本位置),但不传输实际数据。[^1] 2. **NameNode返回块位置**: NameNode基于网络距离计算,优先返回离客户端最近的DataNode(如同机架)。例如,如果客户端在机架A,优先选择机架A的DataNode。[^1][^3] 3. **客户端直接读取数据**: - 客户端并行联系最近的DataNode,请求数据块。 - DataNode读取本地磁盘数据块,式传输给客户端。 - 客户端组装数据块成完整文件。如果读取失败(如节点故障),客户端会用其他副本重试。[^1] 4. **完成读取**: 客户端接收所有块后,关闭连接。整个过程为“式读取”,适合大规模数据集(如日志分析)。[^1] **架构图解**(文字描述): - 客户端 → NameNode(获取块位置) → 客户端 → DataNode(直接读取数据)。 - 关键点:读取不依赖NameNode数据,避免单点瓶颈;机架感知优化延迟。[^1] #### 4. 工作程优化和注意事项 - **HA架构影响**:在HA模式下(如使用ZooKeeper),NameNode主备同步元数据。读写程不变,但故障切换时可能短暂延迟(秒级)。[^1][^4] - **写程优化**:追加数据使用`hdfs dfs -appendTofile`,但HDFS不支持随机修改(只追加)。小文件合并建议用SequenceFile归档。[^2][^3] - **性能因素**:网络带宽、副本数配置(太高增加写入延迟)、检查点机制(如Secondary NameNode定期合并元数据,防止NameNode过)。[^4] - **安全模式**:NameNode启动时进入安全模式(只读),使用`hdfs dfsadmin -safemode leave`退出后允许写操作。[^1][^3] HDFS工作程强调高吞吐量而非低延迟,适合大数据批处理场景(如MapReduce作业)。通过上述程,HDFS实现了PB级数据的可靠存储和访问。[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值