校招面试重点汇总之Hadoop中的HDFS(不多但都是高频面试题) 您所在的位置:网站首页 为什么选择zookeeper作为hadoop生态圈的分布式协调系统 校招面试重点汇总之Hadoop中的HDFS(不多但都是高频面试题)

校招面试重点汇总之Hadoop中的HDFS(不多但都是高频面试题)

#校招面试重点汇总之Hadoop中的HDFS(不多但都是高频面试题)| 来源: 网络整理| 查看: 265

一、介绍下什么是 HDFS(Hadoop Distributed File System)?它的特点是什么?

Hadoop Distributed File System(HDFS)是Apache Hadoop生态系统的一个核心组件,是一个可扩展的分布式文件系统,用于存储和处理大规模数据集。HDFS的设计基于Google的GFS(Google File System),具有高可靠性、高容错性和高吞吐量等特点。其特点如下:

(1)分布式存储:HDFS文件系统采用分布式存储方式,将大文件切分为一系列数据块并存储于多台机器上,提高了数据的可靠性和处理能力。(2)高容错性:HDFS采用了多副本机制,将文件的多份副本分散地存放在不同的机器上,这样即使某台机器发生故障,也可以从其他机器上找到文件的副本。(3)海量数据:HDFS可存储PB级以上的数据,可进行高效、快速的读写操作,适用于海量数据的存储和处理。(4)适用于批处理:HDFS倾向于支持批处理操作,通常用于大数据场景下的离线计算等任务。

但其也有一些缺点,具体如下:

(1)不适合低延时数据访问:比如毫秒级的来存储数据,这是不行的,它做不到。(2)无法高效的对大量小文件进行存储:存储大量小文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。(3)并发写入、文件随机修改:一个文件只能有一个写,不允许多个线程同时写。仅支持数据 append(追加),不支持文件的随机修改。 二、HDFS 中的块(Block)大小是多少?为什么?

在HDFS3.×中,默认的块大小是128MB。这个块大小的选择是有理由的,主要基于以下两个方面的考虑:

(1)减少寻址开销:较小的块大小会增加访问文件的次数,因为要读取更多的块。这将导致更多的寻址操作,从而增加寻址开销和网络开销。较大的块大小可以减少寻址次数,从而减少了寻址开销和网络开销。(2)提高吞吐量:较大的块大小可以提高磁盘顺序读取的效率,因为较大的块大小可以在读取过程中更好地利用磁盘的数据传输速率和缓存效率。这可以提高数据传输的吞吐量,从而提高整个系统的性能。

因此,在HDFS中,选择128MB的块大小可以在寻址效率和磁盘读取效率之间达到一个合理的平衡点,从而提高整个系统的性能。但是,块大小也可以根据特定的应用场景进行调整,以更好地满足特定需求。

三、介绍下HDFS的心跳机制

在HDFS中,在HDFS集群中,每个数据节点(DataNode)通过定期向名字节点(NameNode)发送心跳信号来确认自己在线的机制。它是一种基于时间间隔的通信协议,用于数据节点向名称节点发送消息,告知名称节点它们的存活状态和负载情况。

HDFS心跳机制的工作流程如下:

(1)数据节点启动后,向名称节点注册自己,并告知自己的存储空间、块列表等信息。

(2)数据节点定期向名称节点发送心跳消息。心跳消息中包含节点的状态信息、存储空间、数据块列表等信息。心跳时间间隔默认为3秒。

(3)名称节点接收心跳消息,并记录节点的状态信息。如果名称节点在一定时间内没有收到某个节点的心跳消息,就会认为该节点已经失效,并将其从集群中移除。

(4)如果数据节点上的某个块已经被标记为失效,数据节点在下一次向名称节点发送心跳时会告知名称节点,这样名称节点就可以更新块的状态信息,以便客户端能够避免访问已经失效的块。

心跳机制可以保证HDFS集群中数据节点和名称节点之间的连接状态,以及数据节点上块的状态信息都是最新的。它还可以检测并处理故障节点,以确保数据的可靠性和一致性。

四、如何保证 HDFS 中的数据一致性?

在HDFS中,保证数据一致性是非常重要的。以下是一些HDFS如何保证数据一致性的方法:

(1)写入管道机制:HDFS中的写入管道机制可以保证数据的一致性。在写入过程中,所有的副本必须在相同的时间内被更新,以保证数据一致性。具体而言,HDFS使用数据块副本管道机制,即一个客户端写入数据时,HDFS会建立一条副本管道,保证所有的副本都同时被写入。

(2)副本协调:HDFS通过副本协调来确保数据的一致性。当一个数据块的某个副本出现故障时,HDFS会自动将该副本的数据块恢复到其他可用的副本上,以保证数据的一致性。

(3)心跳机制:HDFS使用心跳机制来检测数据节点和名称节点之间的连接状态,并在节点失效时进行故障处理。这可以保证数据的一致性,并防止客户端访问已经失效的块。

(4)名称节点的元数据:HDFS使用名称节点来管理文件系统中的元数据,包括文件和目录的创建、修改、删除等操作。名称节点在维护元数据时,采用复制的方式保证数据的一致性,即将元数据复制到多个节点上,从而在名称节点出现故障时,可以通过备份节点来保证数据的一致性。

五、HDFS 的数据读写流程是怎样的?

在 HDFS 中,当客户端需要读取数据时,会按照以下流程进行:

(1)客户端向名称节点发送文件读请求,名称节点返回该文件块所在的数据节点列表。

(2)客户端选择其中一个数据节点(就近原则,然后随机)作为源节点,向该节点发送读取请求。

(3)数据节点收到读取请求后,首先检查是否具有该块的本地副本,如果有,直接从本地副本读取数据并返回给客户端;如果没有,则向其他具有该块副本的数据节点发出数据传输请求。

(4)数据节点通过网络将数据块传输给客户端,并返回数据传输结果。

(5)客户端收到数据块后,再进行后续的数据处理和计算。

需要注意的是,在 HDFS 中,数据块的副本存储在不同的数据节点上,因此客户端在任何时候都可以从数据块的任何一个副本进行读取。同时,HDFS 的多副本机制也能够保证数据的可靠性和高效性。

在 HDFS 中,当客户端需要写数据时,会按照以下流程进行:

(1)客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件,NameNode 检查目标文件是否已存在,如果不存在则检查父目录是否存在。如果目标文件或父目录不存在,则返回文件无法上传的信息。

(2)如果目标文件和父目录都存在,则 NameNode 返回可以上传文件的信息,并分配一个唯一的文件 ID 号,该 ID 号用于标识文件和文件块的位置信息。

(3)客户端请求将第一个数据块(Block)上传到哪几个 DataNode 服务器上。客户端向 NameNode 发送 Block 创建请求,请求创建一个新的数据块,该请求包含文件 ID 号和数据块大小等信息。

(4)NameNode 在存储空间中为该数据块分配多个 DataNode 节点,通常为三个,分别为 dn1、dn2、dn3。NameNode 返回这些 DataNode 的位置信息列表给客户端。

(5)客户端使用 FSDataOutputStream 模块向 dn1 发送写请求,dn1 收到请求会继续调用 dn2,然后 dn2 又调用 dn3,将这个通信管道建立完成。

(6)dn1、dn2、dn3逐级对客户端应答,表示已准备好接收数据包。

(7)客户端开始从磁盘读取数据,将数据分成若干个数据包,每个数据包的大小通常是 64KB。客户端向 dn1 发送 第一个数据包,dn1 收到后依次传给 dn2,dn2 再依次传给 dn3。dn1 在传输过程中,将每个数据包的信息放入一个应答队列等待应答。

(8)当一个数据块的所有数据包都传输完成之后,客户端再次请求 NameNode 返回下一个数据块要上传的 DataNode 节点列表,并重复上述步骤进行下一个数据块的上传。

需要注意的是,在 HDFS 中,数据块默认大小为 128MB,HDFS 采用了多副本机制保证数据可靠性,因此同一个数据块在多个 DataNode 节点上会有多个副本。数据的传输过程中,HDFS 还使用了确认机制和心跳机制,保证数据的一致性和稳定性。

六、HDFS的容错机制是如何实现的?

HDFS 是基于多副本机制实现的分布式文件系统,其容错机制的实现主要包括以下几个方面:

(1)多副本机制 HDFS 中的每个数据块都会被划分为多个副本,并分散存储在不同的 DataNode 节点上。这样即使某个 DataNode 节点发生故障,其他节点上的副本仍然可以保证数据的可用性和完整性。同时,HDFS 还支持副本的自动恢复,当一个副本损坏或不可用时,HDFS 会自动从其他节点上的副本中选择一个进行替换。

(2)快速检测和恢复 HDFS 容错机制中还包括了快速检测和恢复的机制,主要体现在以下两个方面: 快速检测 :HDFS 使用心跳机制,DataNode 节点会周期性地向 NameNode 发送心跳信息,以保证自身正常运行。如果某个 DataNode 节点长时间没有向 NameNode 发送心跳信息,NameNode 就会认为该节点已经故障,并将该节点上的所有副本标记为不可用。 快速恢复:当 HDFS 发现某个节点上的数据块不可用时,会尝试从其他副本所在的节点中找到可用的副本并进行替换。同时,HDFS 还可以通过重复存储数据块来提高数据的容错性。即将同一个数据块存储在多个节点上,并且这些节点之间的距离尽可能远,以减小节点损坏的概率。

(3)数据校验 HDFS 还使用数据校验机制来检测数据的完整性和正确性。在数据块写入时,会为该数据块计算一份校验和,并将其存储在 HDFS 中。当读取数据块时,HDFS 会重新计算校验和并与之前存储的校验和进行比对,以确保读取到的数据块的完整性和正确性。

综上所述,HDFS 的容错机制主要是基于多副本机制、快速检测和恢复机制以及数据校验机制实现的。通过这些机制,HDFS 可以有效地保证数据的可靠性和高可用性,为用户提供高质量的服务。

七、HDFS中大量小文件问题该如何解决?

在 HDFS 中,存储大量小文件会导致以下问题:

(1)Namenode 内存消耗:每个小文件都会占用 Namenode 的内存,包括文件名、权限、块信息等元数据,导致 Namenode 内存占用过高,影响系统的性能。(2)副本数量过多:每个小文件都需要占用一个或多个数据块,如果副本数设置过高,将导致 HDFS 集群存储资源的浪费。(3)数据块数量过多:每个小文件都会占用一个或多个数据块,导致数据块数量过多,从而影响 HDFS 的性能。

为了解决大量小文件问题,可以采用以下几种方式:

(1)合并小文件 将多个小文件合并成一个大文件,可以有效减少 Namenode 内存消耗、副本数量和数据块数量等问题。可以通过 MapReduce 程序实现文件合并。

(2)使用 SequenceFile SequenceFile 是一种用于存储二进制键值对数据的文件格式,可以将多个小文件打包成一个 SequenceFile 文件,从而减少小文件数量,同时提高读写效率。其中,使用文件名作为 key,文件内容作为 value,可以在 map/reduce 过程中的input/output 的 format 使用。

(3)将小文件打包存储 可以将多个小文件打包成一个大文件,然后将打包后的文件上传到 HDFS 中。这种方式可以减少 Namenode 内存消耗、副本数量和数据块数量等问题,但是可能会影响文件的读写效率。

(4)使用Har文件

Har(Hadoop Archives)是Hadoop提供的一种归档格式,它可以将多个小文件归档成一个Har文件。Har文件可以作为一个独立的文件使用,并且可以像普通文件一样进行读写操作。使用Har文件可以减少存储空间、加快文件读取速度。

八、HDFS如何实现高可用?

HDFS 的高可用性是通过 NameNode 的高可用性实现的,以下是 HDFS 实现高可用的主要方式:

(1)Secondary NameNode 在 Hadoop 1.x 版本中,使用 Secondary NameNode 来实现 NameNode 的高可用性。Secondary NameNode 会定期从 NameNode 拉取元数据,并将元数据合并成一个新的文件,然后将文件发送给 NameNode,用于替换旧的元数据文件。但是 Secondary NameNode 无法实时监控 NameNode 状态,一旦 NameNode 发生故障,需要手动切换 Secondary NameNode 到活动状态。

(2)Quorum Journal Manager (QJM) 在 Hadoop 2.x 版本中,引入了 Quorum Journal Manager (QJM) 作为 NameNode 的高可用性解决方案。QJM 通过在多个节点上存储 Journal,实现了多节点之间的数据同步和数据容错。 在 QJM 中,一个集群中的每个 Journal Node 负责接收 NameNode 发送的元数据变更日志,并将日志写入本地磁盘和共享存储(例如 ZooKeeper)。当 NameNode 启动或发生故障时,它将从 QJM 中读取最新的元数据日志,从而实现快速恢复和故障转移。

(3)Standby NameNode 在 QJM 的基础上,Hadoop 2.x 版本中引入了 Standby NameNode,使得 NameNode 的故障转移变得更加自动化。Standby NameNode 会与 Active NameNode 保持同步,并定期从 QJM 中获取元数据变更日志。当 Active NameNode 发生故障时,Standby NameNode 可以快速接管 Active NameNode 的职责,从而实现故障转移。

(4)NameNode Federation 在 Hadoop 2.x 版本中,引入了 NameNode Federation,将一个 Hadoop 集群分成多个命名空间,每个命名空间拥有独立的 NameNode。这样可以使得每个命名空间的数据和元数据相互隔离,从而提高系统的可用性和安全性。

九、HDFS 中的JournalNode 有什么作用?

JournalNode是 Hadoop 分布式文件系统 (HDFS) 中的一个组件,用于存储 NameNode 发送的元数据变更日志,并将其复制到其他 JournalNode 以实现数据冗余和容错。JournalNode 与 NameNode 共同构成了 HDFS 中实现高可用性的机制,能够确保在某个节点出现故障时,HDFS 集群仍然可以正常运行。

在 HDFS 中,为了实现高可用性,通常会配置一个集群,其中有一个 NameNode 在任何时刻都处于活动状态,另一个 NameNode 则处于备份状态。这两个 NameNode 之间会周期性地进行数据同步,以确保备份 NameNode 在活动 NameNode 发生故障时可以快速接管其职责,从而实现故障转移。

为了实现这种数据同步,HDFS 引入了 JournalNode 组件。在 HDFS 集群中,可以配置多个 JournalNode,它们分别存储 NameNode 发送的元数据变更日志,并将这些日志复制到其他 JournalNode。在这种配置下,当一个 NameNode 发生故障时,备份 NameNode 可以从 JournalNode 中获取最新的元数据变更日志,并恢复其状态,从而实现快速故障转移。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有