wdgcd logo wdgcd personal lab
全文 3,657 字 约 11 分钟

hdfs20问-1

bg

1、HDFS 的核心组件是什么?它们的作用分别是什么?

namenode:负责管理文件系统的 metadata,比如文件名、路径、权限以及文件块到 datanode 的映射等;它对 hdfs 的操作起到主控作用,当客户端请求访问文件时,namenode 提供文件的元数据,使得客户端能够直接和 datanode 进行数据读写操作;

datanode:这是 hdfs 中的工作节点,负责存储实际数据;每个文件在 hdfs 中被分成若干个 block,这些 block 存储在 datanode 上,datanode 会定期向 namenode 发送心跳信号和块报告,以确保 namenode 掌控数据块的存储情况和节点的健康状况;

secondary namenode:主要任务是定期对 namenode 的元数据进行检查点操作,帮助减少 namenode 的内存占用,这在 namenode 重启时大大加快了元数据的载入速度;

2、在 HDFS 中,NameNode 的作用是什么?它如何管理文件系统元数据?

充当文件系统的主控节点,负责管理文件系统中的所有元数据,主要负责存储和管理一下几方面的数据:

a、文件系统的目录结构和文件信息,包括文件名、文件大小、权限、时间戳

b、文件所在的具体 datanode 位置,即各文件的 block mapping

c、管理和协调客户端对文件的访问请求,包括创建、删除、修改文件等操作;

namenode 使用两种形式存储元数据:内存中存储的文件系统镜像 FsImage、以及编辑日志 EditLog,这些数据会定期合并和持久化到磁盘上以确保文件系统的可靠性和一致性;

3、HDFS 默认的数据块(block)大小是多少?为什么 HDFS 采用块存储的方式?

128MB;

a、将大文件拆分成多个块,分布在不同的节点上存储,方便管理

b、每个数据块可以有多个副本,存储在不通过的节点上,即使某个节点损坏,也可以通过其他节点恢复数据,从而提高数据的可靠性,提高容错性;

c、hdfs 设计之初是为了处理大数据量的分布式计算,这种分布式存储方式便于 hadoop 生态系统并行处理不同数据块,大幅提升计算效率

4、HDFS 如何处理大文件的存储?为什么大文件更适合存储在 HDFS 中?

通过将大文件分割成固定大小的块来处理大文件的存储,这些块通常是 128MB 或 256MB,每个块独立存储在 hdfs 集群中的不同节点,这种设计使得 hdfs 能够并行地读取和写入大文件,从而提高数据处理速度和吞吐量;

a、多个块并行处理能显著提高效率;

b、大文件减少了系统需要管理的文件数量,降低了 namenode 的元数据压力;

c、通过副本机制提高了数据的容错性;

块大小可配置、数据复制、、流式数据访问、滚动升级

5、在 HDFS 中,如何检查文件是否成功复制到所有副本?

通过 hdfs 命令行工具 hdfs dfsadmin -report 或者通过 Hadoop 的 Web 界面来玩完成;

具体操作步骤:

a、输入命令 hdfs dfsadmin -report,查看生成的报告,找到 Under replicated blocks 这一栏,这里会列出所有在 hdfs 中未按照预期副本数存储的块;

b、通过 Hadoop 的 web 界面:打开浏览器,访问 hdfs 的 namenode web 页面,通常是 http://namenode-host:50070,进入 Block Report 或类似的部分;在这个报告中,可以查看具体的块和它们的副本分布情况,如果所有的块都满足所需的副本数,说明文件复制成功;

6、在 HDFS 中,文件如何被拆分成多个块?这些块如何分布在不同的 DataNode 上?

这些块默认大小为 128MB,hdfs 将这些块分布到集群中的多个 datanode 上;

7、HDFS 是如何保证数据高可用性的?数据的副本机制是如何设计的?

第一个副本存储在写入数据的节点上;

第二个副本存储在和第一个副本不同机架上的一个节点上;

第三个副本存储在和前两个副本不同节点但同机架的另一个节点上;

datanode 会定期向 namenode 发送心跳信息,如果某个 datanode 的心跳在指定时间内没有被接收到,namenode 会将此节点标记为已故障,并启动数据块的重复制程,来确保数据的可靠性;

namenode 会追踪各个 datanode 的存储容量和负载情况,动态调节副本的位置,以保证均衡的负载分布和存储利用率;

8、HDFS 如何处理节点故障?当一个 DataNode 失效时会发生什么?

当一个 datanode 失效时,hdfs 可以自动处理节点故障,确保数据不会丢失;

具体来说,当一个 datanode 发生故障,会出现以下情况:

a、datanode 失效检测:namenode 会定期收到所有 datanode 发送的心跳信号,如果在一定时间内未收到某个 datanode 的心跳信号,namenode 会将该节点标记为失效;

b、在检测到 datanode 失效后,namenode 会追踪失效节点上存储的所有数据块,并以此为基础决定需要重新复制的数据块以达到 hdfs 的数据副本系统 3,namenode 会从其他健康的 datanode 上选择一个或多个节点,创建这些数据块的副本,并将复制命令发送给这些健康 datanode,这样 hdfs 保证了数据的冗余和可用性;

c、namenode 会更新元数据以反映新的数据块副本位置,并在该 datanode 失效后更新系统的状态,以确保系统始终掌握最新的数据状况;

再平衡:随着时间推移,数据分布可能变得不均匀,hdfs 提供了再平衡功能,可以在集群中重新分布数据块,以优化存储空间使用和提升整体系统性能;

9、在 HDFS 中,副本数量的默认值是多少?为什么需要配置多个副本?

--

10、HDFS 中的 Heartbeat 机制是什么?它如何确保集群的健康状态?

datanode 每隔几秒会发送一个心跳到 namenode;

namenode 收到这些心跳,并根据这些信息更新节点状态,包括节点的存储容量、已使用的容量、正在传输的数据块;

负载均衡:通过心跳信息,namenode 可以了解每个 datanode 的 存储和处理情况,从而更好地分配新的数据块,避免某些节点过载;

除了心跳,datanode 还会在心跳消息中附带一个轻量级的报告,告知 namenode 当前存储的数据块信息,这有助于 namenode 及时获取和校对系统中的数据块元数据,确保每个块的准确位置和状态;

当 datanode 重启或变为活跃状态时,它会发送一个完整的 block report 给 namenode,告知其存储的所有数据块的详细信息

11、在 HDFS 中,NameNode 和 Secondary NameNode 有什么区别?它们如何协同工作?

namenode 负责所有元数据操作,保存了所有的元数据,是一个单点故障点,如果 namenode 失败,整个 hdfs 集群都会不可用;

secondary namenode:定期辅助 namenode 进行 fsimage 和 edit log 的合并操作;namenode 在内存中维护着文件系统的 元数据快照和事务日志,随着时间的推移,edit log 会变得非常大,使得 namenode 的启动时间延长并增加故障风险,secondary namenode 会定期将 fsimage 和 edit log 合并成一个新的 fsimage 文件,并存储在 namenode 和 secondary namenode 上;

可以通过配置一个备份 namenode,处于 standby 状态,在主 namenode 失败时迅速接替其工作;使用 secondary namenode 做 checkpointing 确保出现故障能够快速恢复; fsimage 是 hdfs 文件系统的一个完整快照,它记录了在某个时间点上,文件的整体视图,edit log 记录的是自从最近一次 fsimage 生成以来,所有对 hdfs 文件系统元数据的更改操作;

12、如何通过配置 HDFS 调整块大小?在什么情况下需要修改块大小?

修改 hadoop 配置文件 hdfs-site.xml 中的 dfs.blocksize 参数;

需要修改块大小的情况:

a、处理超大文件时,可以增加块大小;

b、需要更快的数据读取速度

c、在一些特定的 mr 作业中,调整块大小可以优化任务划分的调度,提升整体计算效率

还要考虑:块复制、网络带宽、数据均衡、计算任务划分;

13、HDFS 是如何实现机架感知(Rack Awareness)的?为什么它对数据存储很重要?

通过机架感知脚本实现,这个脚本根据每个节点的网络拓扑信息来确定节点所在的机架,从而优化数据分布并提升系统的容错能力和网络性能;具体而言,hdfs 会根据配置文件中的机架感知脚本,在写入数据块时,优先将副本写入到不同的机架上,提高数据可用性和可靠性;

14、在 HDFS 中,如何增加或减少文件的副本数量?这对性能有什么影响?

通过使用 hdfs dfs -setrep 命令来增加或减少文件的副本数量,这个命令可以指定文件或目录,并设置新的副本因子,格式如下:

hdfs dfs -setrep -w [新的副本数量] [文件或目录路径]

15、HDFS 中的文件系统检查(fsck)命令的作用是什么?它如何用于维护集群的健康?

主要用于检查文件系统的状态,类似 unix 系统中的 fsck 命令,用来检测并报告文件系统中的问题:

a、检测和报告 hdfs 文件系统中的损坏块;

b、显示集群中所有文件的概述,包括每个文件的副本状态;

c、查找丢失的文件和块,一遍遍及早发现并处理数据丢失的风险;

16、HDFS 如何处理小文件问题?为什么小文件会对性能产生负面影响?

a、元数据存储负担;

b、数据块浪费

c、读写性能:适用于处理大文件的顺序读写;

合并小文件;har:在将文件放入 har 中,小文件被合并;SequenceFiles 和 avro 允许多个小文件数据存储到一个更大容器文件中,同时提供了对数据内元数据的管理功能;频繁读取小文件可以放到 hbase 中;

17、在 HDFS 中,如何确保数据的一致性?当发生故障时,如何恢复一致性?

数据的三副本机制和写操作的一致性协议;

写操作只有在所有副本都成功写入后才会被认为是成功的,这一过程通过 hdfs 的数据写入协议来保证;

每个数据块在写入时生成校验和,namenode 定期检查这些校验和,来纠正潜在的错误;

18、HDFS 如何实现文件的追加写入?这种操作对系统性能有什么影响?

a、用户通过调用 hdfs 的 api 或命令行工具,将需要追加的数据追加到文件末尾;

b、namenode 负责检查文件元数据,以确认文件是否允许追加操作,并且确保只有一个写者可以对该文件进行写操作;

c、datanode 负责市级的数据存储工作,将追加的数据写入文件的末尾,同时以数据块的形式存储在不同的 datanode 上,以确保数据的高可靠性和冗余;

文件追加操作对系统性能也会有一定的影响,主要表现在以下方面:

a、为了确保数据的一致性,namenode 和 datanode 需要额外的同步和协调,可能会增加延迟;

b、每次附加数据时,系统都需要进行一定的元数据更新和数据块管理工作,这会消耗额外的计算资源和 io 性能;

c、如果文件增加过快,hdfs 需要不断地对文件进行分块存储和定位,可能导致额外的碎片化和管理开销;

19、HDFS 中的 SafeMode 是什么?什么时候需要进入 SafeMode?

SafeNode 是一个用于维护和保存文件系统的安全模式,在进入 safenode 时,hdfs 集群会以只读模式运行,不允许对文件系统进行任何写操作,这通常在以下几种情况中使用或触发:

a、启动 hdfs:当 namenode 启动时,默认会进入 safemode,这是为了确保所有数据块的状态被充分验证和确认,以防止数据损坏或丢失;

b、管理员可以通过命令手动将 hdfs 置于 safemode,以便执行诸如维护、升级或检查等操作;

c、完成数据架构或操作闪失后:当 hdfs 检测到某种潜在危险,如大规模数据丢失或数据块复制率低于规定值时,会自动进入 safemode,确保可以恢复这些数据副本到合法数量;

d、当 hdfs 需要安全关闭时,也会进入 safemode,以便逐步停止所有操作,防止数据不一致;

dfs.namenode.safemode.threshold-pct 这个参数定义了复制块达到多少百分比可以退出 safemode

20、HDFS 的写操作和读操作流程分别是怎样的?这两者的设计挑战有哪些?

写操作流程:

客户端向 namenode 请求上传文件;namenode 分配数据块并返回响应的 datanode 信息;客户端将数据切分为块并同时传输给不同的 datanode,这里会有一个链式复制的过程:第一个 datanode 会将块传给第二个,第二个传递给第三个,以保证数据冗余和高可用性;每个 datanode 会将块写入其本地存储并通知 namenode;

读操作流程:

客户端向 namenode 请求读取文件;namenode 返回含有文件块位置的 datanode 信息;客户端从最近的 datanode 读取数据块,合并并呈现给用户;