HDFS基本知识整理

设计理念:
        1、超大文件
        2、流式数据访问
        3、商用普通硬件
不适合场景:
        1、低时间延迟的数据访问
        2、大量的小文件
        3、多用户写入,任意修改文件
一、HDFS的基本概念
1.1、数据块(block)
HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块。
和普通文件系统相同的是,HDFS中的文件是被分成64M一块的数据块存储的。
不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。
目的:最小化寻址,加快数据传输速度
列出文件系统中各个文件有哪些块构成:
hadoop fsck / -files -blocks
1.2、元数据节点(Namenode)和数据节点(datanode)
Namenode用来管理文件系统的命名空间,维护着文件系统树及整棵树内所有的文件和目录。
信息保存位置:命名空间镜像(namespace image)及修改日志(edit log)
其还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成的。
数据节点是文件系统中真正存储数据的地方。
客户端(client)或者元数据信息(namenode)可以向数据节点请求写入或者读出数据块。
其周期性的向元数据节点回报其存储的数据块信息。
从元数据节点(secondary namenode)
从元数据节点并不是元数据节点出现问题时候的备用节点,它和元数据节点负责不同的事情。
其主要功能就是周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。这点在下面会相信叙述。
合并过后的命名空间镜像文件也在从元数据节点保存了一份,以防元数据节点失败的时候,可以恢复。
1.2.1、元数据节点文件夹结构
 
VERSION文件是java properties文件,保存了HDFS的版本号。
layoutVersion是一个负整数,保存了HDFS的持续化在硬盘上的数据结构的格式版本号。
namespaceID是文件系统的唯一标识符,是在文件系统初次格式化时生成的。
cTime此处为0
storageType表示此文件夹中保存的是元数据节点的数据结构。
 
1.2.2、文件系统命名空间映像文件及修改日志
当文件系统客户端(client)进行写操作时,首先把它记录在修改日志中(edit log)
元数据节点在内存中保存了文件系统的元数据信息。在记录了修改日志后,元数据节点则修改内存中的数据结构。
每次的写操作成功之前,修改日志都会同步(sync)到文件系统。
fsimage文件,也即命名空间映像文件,是内存中的元数据在硬盘上的checkpoint,它是一种序列化的格式,并不能够在硬盘上直接修改。
同数据的机制相似,当元数据节点失败时,则最新checkpoint的元数据信息从fsimage加载到内存中,然后逐一重新执行修改日志中的操作。
从元数据节点就是用来帮助元数据节点将内存中的元数据信息checkpoint到硬盘上的
checkpoint的过程如下:
从元数据节点通知元数据节点生成新的日志文件,以后的日志都写到新的日志文件中。
从元数据节点用http get从元数据节点获得fsimage文件及旧的日志文件。
从元数据节点将fsimage文件加载到内存中,并执行日志文件中的操作,然后生成新的fsimage文件。
从元数据节点奖新的fsimage文件用http post传回元数据节点
元数据节点可以将旧的fsimage文件及旧的日志文件,换为新的fsimage文件和新的日志文件(第一步生成的),然后更新fstime文件,写入此次checkpoint的时间。
这样元数据节点中的fsimage文件保存了最新的checkpoint的元数据信息,日志文件也重新开始,不会变的很大了。
 
1.2.3、从元数据节点的目录结构
 
1.2.4、数据节点的目录结构
 
数据节点的VERSION文件格式如下:
 
blk_<id>保存的是HDFS的数据块,其中保存了具体的二进制数据。
blk_<id>.meta保存的是数据块的属性信息:版本信息,类型信息,和checksum
当一个目录中的数据块到达一定数量的时候,则创建子文件夹来保存数据块及数据块属性信息。
二、数据流(data flow)
2.1、读文件的过程
客户端(client)用FileSystem的open()函数打开文件
DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息。
对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。
DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据。
客户端调用stream的read()函数开始读取数据。
DFSInputStream连接保存此文件第一个数据块的最近的数据节点。
Data从数据节点读到客户端(client)
当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。
在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。
失败的数据节点将被记录,以后不再连接。
 
2.2、写文件的过程
客户端调用create()来创建文件
DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。
元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。
DistributedFileSystem返回DFSOutputStream,客户端用于写数据。
客户端开始写入数据,DFSOutputStream将数据分成块,写入data queue。
Data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。
Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。
如果数据节点在写入的过程中失败:
关闭pipeline,将ack queue中的数据块放入data queue的开始。
当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。
失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。
元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。
当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。
 


 

 

<think>首先,用户要求回答关于HDFS常见面试题及答案解析。我需要基于提供的引用内容来构建回答。引用包括: - 引用[1]: 讨论了HDFS的缺点,如不适合低延时数据访问、无法高效存储大量小文件、不支持并发写入或随机修改。 - 引用[2]: 提到了“问答题(二)”,但内容不完整,可能是一个列表的一部分。 - 引用[3]: 提供了100道常见Hadoop面试题及答案解析,特别提到HDFS存储的好处:文件大小可大于单个磁盘容量、简化系统设计、便于计算存储量、消除元数据问题。 - 引用[4]: 解释了HDFS如何选择DataNode上传文件,基于就近原则、机架感知(优先不同机架)和随机选择。 用户意图是查找与HDFS相关的面试题目及解答,可能用于求职准备或知识复习。所以,我需要构建一个结构清晰的回答,列出常见的HDFS面试题及其答案。 回答结构: 1. **引言**:简要介绍HDFS及其重要性。 2. **常见面试题及答案**:列出几个关键问题,并基于引用提供答案。确保答案真实可靠。 - 从引用中提取关键点: - 缺点(引用[1]) - 块存储的好处(引用[3]) - 文件上传策略(引用[4]) - 引用[2]似乎不完整,可能忽略或作为一般参考。 3. **格式要求**: - 使用中文回答。 - 行内数学表达式用$...$格式(但HDFS问题可能不涉及数学,所以可能不需要)。 - 独立公式用$$...$$格式(同样,可能不适用)。 - 生成相关问题:在回答末尾添加相关问题部分。 - 引用标识:在引用的段落末尾自然地添加引用标识,如[^1]。 4. **生成相关问题**:在回答结束时,添加一个相关问题部分,类似于示例中的“相关问题”。 基于引用,我可以覆盖以下面试题: 1. HDFS的缺点是什么?答案基于引用[1]。 2. HDFS存储的好处是什么?答案基于引用[3]。 3. HDFS如何选择DataNode上传文件?答案基于引用[4]。 4. 其他常见问题:如NameNode的作用、Secondary NameNode、机架感知等。但引用中没有直接提供这些,所以基于一般知识补充。 - 为了保持真实可靠,尽量基于引用。如果引用不足,可以添加常见问题,但标注来源。 5. **回答结构**: - 开头:介绍HDFS。 - 主体:列出问题及答案。 - 每个问题后给出答案,并在末尾添加引用标识。 - 结尾:相关问题部分。 生成相关问题示例: - HDFS如何保证数据可靠性? - NameNode和DataNode的区别是什么? - HDFS适合存储哪些类型的数据? 确保回答清晰、逐步解决问题。</think>### HDFS常见面试题及答案解析 Hadoop分布式文件系统(HDFS)是Hadoop生态系统的核心组件,专为大规模数据存储和处理设计。它通过分布式架构实现高容错性和高吞吐量,广泛应用于大数据场景。以下是一些常见的HDFS面试题及其答案解析,基于真实面试资料整理。答案结合了HDFS的核心原理和实践经验,确保可靠性和实用性。问题覆盖了基本概念、优缺点、设计细节和优化策略。 #### 1. HDFS的主要缺点是什么? HDFS虽然适合处理海量数据,但存在一些局限性: - **不适合低延时数据访问**:HDFS设计用于批处理任务(如MapReduce),其高吞吐量优先于低延迟,因此无法支持毫秒级的数据访问需求(例如实时查询)。 - **无法高效存储大量小文件**: - NameNode在内存中存储文件元数据(如目录结构和块信息),大量小文件会占用过多NameNode内存,可能导致内存瓶颈[^1]。 - 小文件的寻址时间(定位文件位置)可能超过实际读取时间,这违反了HDFS针对大文件优化的设计目标[^1]。 - **不支持并发写入和随机修改**: - 一个文件只能由一个写操作独占,不允许多线程同时写入。 - 仅支持数据追加(append),不支持文件的随机修改(如中间插入或删除数据),这限制了其在需要频繁更新的场景中的应用[^1]。 #### 2. HDFS文件块的大小如何设置?其设计优势是什么? HDFS将文件分割成固定大小的块(默认128MB或256MB),这一设计带来显著优势: - **文件大小可超越单个磁盘容量**:通过分布式存储,一个文件可以大于网络中任何单个磁盘的容量,便于处理TB或PB级数据[^3]。 - **简化系统设计和管理**: - 以块为控制单元简化了元数据管理(如NameNode只需跟踪块信息而非整个文件),便于计算单个磁盘的存储容量和负载均衡[^3]。 - 块机制消除了对复杂元数据的依赖,提高了系统的可扩展性和容错性(例如,块副本机制确保数据丢失时可恢复)[^3]。 面试重点:文件块大小通常根据集群规模和数据类型调整(例如,大数据集使用更大块以减少NameNode开销)。 #### 3. HDFS如何选择DataNode上传文件? HDFS采用机架感知(rack-aware)策略优化文件上传和副本放置,以提升数据可靠性和读取效率。以默认副本数3为例: 1. **就近原则**:客户端优先选择与自身物理位置相近的DataNode(如相同机架)上传第一个副本,减少网络延迟[^4]。 2. **跨机架选择**:第二个副本优先放置在不同机架的DataNode上,以防机架故障导致数据丢失[^4]。 3. **随机选择**:第三个副本在本机架上随机选择一个DataNode,平衡负载并避免热点问题[^4]。 这一策略确保了数据的高可用性和高效读取(例如,MapReduce任务优先从本地副本读取数据)。 #### 4. NameNode的作用是什么?其单点故障问题如何解决? NameNode是HDFS的主节点,负责管理文件系统的命名空间(如文件目录、块映射)和客户端访问控制。其核心功能包括: - 存储元数据(内存中),处理DataNode的心跳报告以监控集群状态。 - **单点故障解决方案**:通过Secondary NameNode或HA(High Availability)机制缓解: - Secondary NameNode定期合并编辑日志(edits log)和镜像文件(fsimage),减少NameNode恢复时间(但非实时备份)[^3]。 - HA模式使用双NameNode(active-standby),通过ZooKeeper实现自动故障切换,确保服务连续性。 #### 5. HDFS如何保证数据可靠性? HDFS通过多重机制确保数据不丢失: - **块副本(Replication)**:默认每个块存储3个副本(可配置),分布在不同机架和DataNode上,防止硬件故障。 - **心跳检测和块报告**:DataNode定期向NameNode发送心跳,NameNode据此检测节点失效并触发副本复制。 - **校验和(Checksum)**:客户端写入数据时计算校验和,读取时验证数据完整性,自动修复损坏块。 这一机制使HDFS适合存储冷数据(如日志文件),但需注意其不适合高更新频率场景[^1]。 ### 总结 HDFS是处理大数据的基础,其设计权衡了吞吐量、可靠性和成本。面试中,重点考察对HDFS架构的理解(如块存储、副本策略)和实际限制(如小文件问题)。以上答案基于常见面试题库和Hadoop官方文档整理,有助于求职准备或知识复习。如果您有特定场景问题,欢迎进一步提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值