目录
(二)第二阶段: Secondary NameNode 工作
什么是hdfs
HDFS指的是Hadoop分布式文件系统(Hadoop Distributed File System),是Apache Hadoop框架中的一个分布式 文件系统。它被设计用来在集群中存储和处理大规模数据集。 HDFS可以提供高可靠性、高吞吐量和高扩展性。
原理
1. HDFS将大文件分成多个块(block),每个块默认大小为128MB或256MB,然后将这些块分散存储在集群中 的多个节点上。
2. 每个块都会有多个副本(replica),默认情况下是3个副本,这些副本会存储在不同的节点上,以保证数据的 可靠性和容错性。
3. HDFS采用了主从架构,其中一个NameNode负责管理文件系统的元数据信息,包括文件目录结构、文件块信 息、副本位置等;多个DataNode负责存储和管理实际的数据块。
4. 客户端访问HDFS时,会先向NameNode请求文件的元数据信息,然后根据元数据信息找到对应的数据块所在 的DataNode,最终从DataNode获取数据。
5. HDFS还提供了数据的校验和机制,可以检测数据在传输过程中是否发生错误,以保证数据的完整性。
包含哪些部分
1. NameNode:负责管理文件系统的元数据信息,包括文件目录结构、文件块信息、副本位置等。 NameNode 是HDFS的核心组件之一,是一个单点故障,因此需要进行备份和容错处理。
2. DataNode:负责存储和管理实际的数据块。 DataNode是HDFS的工作节点,每个节点上都会运行一个 DataNode进程,用于管理本地存储的数据块。
3. Secondary NameNode:负责协助NameNode进行元数据信息的备份和恢复工作。 Secondary NameNode并 不是NameNode的备份,它只是定期从NameNode获取元数据信息,并将其合并为一个镜像文件,以备份和 恢复使用。
4. HDFS客户端:包括命令行工具和API等,用于与HDFS交互,完成文件上传、下载、删除等操作。客户端通过 与NameNode交互获取文件的元数据信息,并根据元数据信息找到对应的数据块所在的DataNode,最终从 DataNode获取数据。
hdfs 的读取过程
答案一 : (来源csdn)
( 1) HDFS client创建DistributedFileSystem 对象,通过该对象向 NameNode 请求下载文件, NameNode 通过查询 元数据,找到文件块所在的 DataNode 地址。 ( 2)挑选一台 DataNode (要考虑结点距离最近选择原则、 DataNode负载均衡)服务器,请求读取数据。 ( 3) DataNode 开始传输数据给客户端(从磁盘里面读取数据输入 流,以 Packet 为单位来做校验),串行读取,即先读取第一个块,再读取第二个块拼接到上一个块后面。 (4)客 户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件。
答案二: (来源chatgpt)
1. 客户端向NameNode请求文件的元数据信息,包括文件的块信息、块所在的DataNode等。
2. NameNode返回文件的元数据信息给客户端。
3. 客户端根据元数据信息找到对应的数据块所在的DataNode,然后向DataNode发送读取数据块的请求。
4. DataNode接收到客户端的请求后,从本地磁盘读取对应的数据块,并将数据块传输给客户端。
5. 客户端接收到数据块后,将其缓存在本地内存中,然后继续请求下一个数据块,直到读取完整个文件。
需要注意的是, HDFS支持多个客户端同时读取同一个文件,每个客户端都可以从不同的DataNode节点读取数据 块,从而实现了高并发和高吞吐量的文件读取。此外, HDFS还提供了数据的校验和机制,可以检测数据在传输过程 中是否发生错误,以保证数据的完整性。
hdfs 的写过程
答案一 : (来自csdn)
( 1) HDFS client创建DistributedFileSystem 对象,通过该对象向 NameNode 请求上传文件, NameNode 检查权 限,并判断目标文件是否已存在。
( 2)如果权限许可,目标文件也存在, NameNode进行响应,返回是否可以上传 文件。
( 3)客户端请求第一个 Block 上传到哪几个 DataNode 服务器上。
(4) NameNode 返回 3 个 DataNode 节点(默认副本数为3),分别为 dn1、dn2、dn3。(这一步要考虑服务器是否可用、副本存储节点选择策略、 DataNode负载均衡)
( 5) 客户端创建FSDataOutputStream数据流对象,通过该对象请求dn1 (即DataNode1) 上传(或写)数据(即建立传输通道), dn1 收到请求会继续调用dn2建立通道,然后 dn2 调用 dn3,这样dn1~dn3 的通信通道建立完成。
( 6)传输通道建立完成后, dn1、dn2、dn3 逐级应答客户端。
( 7)客户端开始往 dn1 上 传第一个 Block (先从磁盘读取数据放到一个本地内存缓存),以Packet为单位(每次发送的是一个Packet对象), dn1 收到一个 Packet (直接从内存中)传给 dn2 ,dn2 传给 dn3。需要注意的是,这里传输的packet大小是64K,这 个64K的packet其实就是一个缓冲队列,里面包含多个(chunk和chunksum),一个chunk是512byte,其校验码 chunksum是4byte。dn1 每传一个 packet会放入一个应答队列(即ack队列,起备份作用)等待应答,当所有的 DataNode应答成功后,会将该packet从应答队列中移除。
( 8)当一个 Block 传输完成之后,客户端再次请求 NameNode 上传第二个 Block 到服务器。(重复执行 3-7 步)。
( 9)所有的Block传输完毕并确认完成后, HDFS CLient关闭FSDataOutputStream数据流对象。然后, HDFS Client 联系NameNode,确认数据写完成, NameNode 在内存中对其元数据进行增删改(然后再通过 SecondaryNameNode对元数据进行修改)。注意,此时只是把更新操作记录到编辑日志Editlog,并没有真正合并编 辑日志和镜像文件,只有触发checkPoint才合并。
答案二: (来自chatgpt)
1. 客户端向NameNode请求创建文件,并指定文件的名称、大小、块大小等信息。
2. NameNode接收到客户端的请求后,根据文件大小和块大小等信息,计算出需要创建的数据块数量,然后返回 给客户端一个数据块列表,包括每个数据块的ID和副本位置等信息。
3. 客户端根据数据块列表,将文件分成多个数据块,并将每个数据块写入到对应的DataNode节点上。在写入数 据块之前,客户端会先向DataNode节点发送一个写入请求,并获取一个写入管道(pipeline)。
4. 客户端将数据块写入到写入管道中,然后DataNode节点将数据块存储到本地磁盘上,并将数据块传输给下一 个节点。这样,数据块就会依次传输到所有的副本位置上,从而实现了数据的备份和容错。
5. 当所有的数据块都写入完成后,客户端向NameNode发送一个完成请求,告知NameNode文件已经创建完 成。
NN 和 2NN 工作机制 (元数据持久化机制)
(一)第一阶段: NameNode 启动
( 1)第一次启动 NameNode 格式化后,创建 镜像文件fsimage 和 编辑日志 edits_inprogress_001 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
( 2)客户端对元数据进 行增删改的请求。
( 3) NameNode 记录更新操作到edits_inprogress_001 中
(4) NameNode 在内存中对元数据 进行增删改(然后再通过SecondaryNameNode对元数据进行修改)。
(二)第二阶段: Secondary NameNode 工作
( 1) Secondary NameNode 询问 NameNode 是否需要 CheckPoint (即是否需要服务),带回 NameNode是否可服务的条件。 CheckPoint触发条件:定时时间到; Edits中 的数据满了。
( 2) Secondary NameNode 请求执行 CheckPoint (即请求服务)。
( 3) NameNode 滚动正在写的 edits_