保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存3份。 2. 运行在廉价的机器上。 3. 适合大数据的处理。HDFS默认会将文件分割成block,64M为1个block。 然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。如果小文件太多,那内存的负担会很重。 (笔记:HDFS不适合小文件存储:小文件多,造成内存负担。) ### HDFS原理详解 #### 一、HDFS概述与特性 **Hadoop Distributed File System (HDFS)** 是Hadoop项目的核心之一,专为大规模数据集设计。它具有以下几个显著特点: 1. **副本机制与容错性:** - HDFS能够自动保存数据的多个副本,默认情况下每个文件的数据会被复制三份,分布在不同的节点上。 - 当某个副本丢失或所在的DataNode出现故障时,系统能够自动检测并在其他节点上恢复该副本。 2. **运行环境的灵活性:** - HDFS能够在低成本的硬件上运行,这意味着组织不必投资昂贵的存储设备即可搭建起大规模的数据处理平台。 3. **面向大数据处理:** - HDFS非常适合处理大规模数据集。它将文件切分为固定大小的块(默认64MB),这些块会被分布存储在网络的不同节点上,提高了数据读取速度和整体系统的吞吐量。 4. **小文件存储问题:** - 由于HDFS将文件的元数据存储在内存中,如果存储大量的小文件,则会导致NameNode内存负担过重,影响性能。 #### 二、HDFS系统架构 **1. NameNode** - **职责**:作为HDFS集群的大脑,NameNode负责管理文件系统的命名空间和客户端对文件的访问。其内存中存储了文件系统的元数据,包括文件和目录的信息以及它们对应的block信息。 - **元数据管理**:NameNode维护两种类型的文件来管理元数据——`fsimage` 和 `edits` 文件。 - `fsimage` 文件包含了文件系统的目录树及文件的inode信息,例如数据块描述、修改时间、访问时间等。 - `edits` 文件记录了针对文件系统的修改操作,包括添加、删除或修改文件等动作。每当有新的修改发生时,这些操作就会被记录下来。 - **启动过程**:启动时,NameNode会加载`fsimage` 文件中的内容到内存中,然后应用`edits` 文件中的操作,确保内存中的元数据是最新的状态。 - **存储位置**:通常位于`hdfs-site.xml` 配置文件中指定的`dfs.name.dir` 目录下。 **2. SecondaryNameNode** - **角色定位**:SecondaryNameNode并非集群运行的必要组件,它的主要作用是帮助减轻NameNode的压力,定期合并`fsimage` 和 `edits` 文件,从而减少NameNode重启时的恢复时间。 - **工作流程**:每隔一段时间(默认每小时),SecondaryNameNode会从NameNode获取最新的`fsimage` 和 `edits` 文件,并将它们合并生成一个新的`fsimage` 文件。完成后,新的`fsimage` 文件会被发送回NameNode。 - **注意事项**:在Hadoop 2.x版本中,如果启用了HDFS High Availability (HA)模式,SecondaryNameNode的角色会被替换为其他组件,例如Zookeeper Quorum。 **3. DataNode** - **职责**:DataNode是HDFS的实际存储节点,负责存储客户端上传的数据块,并根据NameNode的指令执行数据块的读写操作。 - **存储过程**:当客户端上传一个文件时,HDFS会按照默认设置将文件分割成多个block(例如64MB),并根据NameNode的指示存储到不同的DataNode上。 - **机架感知**:为了提高数据的可靠性和读取效率,HDFS具备机架感知能力,即在放置数据块副本时会考虑到机架之间的距离,尽可能将副本放在不同的机架上,以减少网络拥堵的可能性。 #### 三、HDFS读写流程示例 **写入流程:** 1. 客户端将文件切分为多个block(例如每个block为64MB)。 2. 客户端向NameNode发起写请求。 3. NameNode记录block信息,并返回一组可用的DataNode列表给客户端。 4. 客户端按照流式方式向DataNode发送block数据。 5. DataNode之间通过管道传递数据,形成多级流水线,提高了传输效率。 6. 一旦所有DataNode都确认接收到完整的block,它们会向NameNode发送确认消息,同时客户端也向NameNode发送完成消息。 **读取流程:** 1. 客户端发起文件读取请求。 2. NameNode响应客户端请求,告知其文件块的位置信息。 3. 客户端直接从DataNode读取数据,而不是再次经过NameNode。 4. 通过这种方式,减少了NameNode的负载,提高了读取速度。 通过以上对HDFS的详细介绍,我们可以看出HDFS是一个高度可靠、高效的大规模分布式文件系统,特别适用于大数据处理场景。然而,需要注意的是,由于其设计初衷,HDFS并不适合存储大量的小文件,这可能会导致NameNode内存负担过重,进而影响整个系统的性能。
剩余6页未读,继续阅读
- 粉丝: 1
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于C语言的系统服务框架.zip
- (源码)基于Spring MVC和MyBatis的选课管理系统.zip
- (源码)基于ArcEngine的GIS数据处理系统.zip
- (源码)基于JavaFX和MySQL的医院挂号管理系统.zip
- (源码)基于IdentityServer4和Finbuckle.MultiTenant的多租户身份认证系统.zip
- (源码)基于Spring Boot和Vue3+ElementPlus的后台管理系统.zip
- (源码)基于C++和Qt框架的dearoot配置管理系统.zip
- (源码)基于 .NET 和 EasyHook 的虚拟文件系统.zip
- (源码)基于Python的金融文档智能分析系统.zip
- (源码)基于Java的医药管理系统.zip