namenode datanode理解

本文深入解析HDFS的架构设计,包括NameNode与DataNode的角色分工,以及元数据的管理方式。阐述了HDFS如何通过NameNode和DataNode实现大规模数据的存储与检索,同时介绍了SecondaryNameNode的作用和HDFS的存储结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
  HDFS是以NameNode和DataNode管理者和工作者模式运行的。
         
  NameNode管理着整个HDFS文件系统的元数据。从架构设计上看,元数据大致分成两个层次:Namespace管理层,负责管理文件系统中的树状目录结构以及文件与数据块的映射关系;块管理层,负责管理文件系统中文件的物理块与实际存储位置的映射关系BlocksMap,如图1所示[1]。Namespace管理的元数据除内存常驻外,也会周期Flush到持久化设备上FsImage文件;BlocksMap元数据只在内存中存在;当NameNode发生重启,首先从持久化设备中读取FsImage构建Namespace,之后根据DataNode的汇报信息重新构造BlocksMap。这两部分数据结构是占据了NameNode大部分JVM Heap空间。
 
    

 

 

 

  除了对文件系统本身元数据的管理之外,NameNode还需要维护整个集群的机架及DataNode的信息、Lease管理以及集中式缓存引入的缓存管理等等。这几部分数据结构空间占用相对固定,且占用较小。

测试数据显示,Namespace目录和文件总量到2亿,数据块总量到3亿后,常驻内存使用量超过90GB。


         DataNode负责存储和检索数据块,他受客户端和Namenode调度,并且他会定期向NameNode发送本节点上所存储的块列表,这就是为什么NameNode并不是永久保存各个节点块的信息原因了。
         能看到NameNode的重要性,因为如果NameNode挂掉之后,无法根据DataNode上的数据重建文件。所以一般有两种机制进行对NameNode的容错。第一将NameNode上的元数据信息持久化到本地磁盘的同时,同时备份到一个挂载的远程网络文件系统上NFS。第二使用辅助NameNode,辅助NameNode会定期通过编辑日志合并镜像文件,防止编辑日志过大。但是他存在的问题在于总是滞后于NameNode的。所以一般可以将远程NFS的元数据复制到辅助NameNode上,辅助NameNode作为新的NameNode。
         那么NameNode、DataNode、SecondaryNameNode存储结构是什么样子的呢。

         NameNode存储结构:

         {dfs.namenode.name.dir}
          |---VERSION
          |---fsimage
          |---edits
         首先看下VERSION里面是什么
          

          namespaceID:代表的是文件系统唯一标识,文件系统首次格式化时产生。没有注册到namenode之前的datanode都不知道namespaceID,所以可以通过这个来检查新建的datanode
          clusterID:集群ID
          cTime:NameNode存储系统创建时间,首次格式化文件系统这个属性是0,当文件系统升级之后,该值会更新到升级之后的时间戳
          storageType:说明该存储目录是namenode的数据结构
          layoutVersion:是一个负整数,用来描述HDFS持久化数据结构的版本的。这个版本与Haoop版本号无关,当文件系统布局发生改变他就回减一,但是此时HDFS也需要升级,否则新的namenode无法使用。
          blockpoolID:是当前NameNode管理的数据块池ID,对于Federation HDFS,不同的NameNode管理不同的数据块池,同一个DataNode管理多个数据块池。blockpoolID的命名方式如下:

    BP-<random num><namenode ip><namenode create time(UTC)>       在dn上会有这个桐木目录来存储数据  

      

 

       
          编辑日志和镜像文件
          fsimage镜像文件存储着文件系统所有目录和文件的元数据信息即inode序列化信息。每一个inode是文件或目录的元数据内部描述方式,对于文件存储比如副本级别、修改时间、块大小等等。fsimage并不存储描述datanode的信息。因为datanode加入集群后会定期向namenode发送块的映射信息。
          edits编辑日志如果这样会不断增长,这样每当重启namenode时候会比较慢,这时候文件系统就处于离线状态,这并不是用户想要的。可以通过运行辅助namenode来解决。
           为主Namenode中的元数据创建检查点,进行编辑日志和镜像文件合并。
           (1)辅助namenode要求主namenode停止使用edits文件,暂时使用新的edits文件。
           (2)辅助namenode从主namenode那里获取fsimage和edits文件
           (3)辅助namenode将fsimage加入到内存,然后根据edits执行文件操作,创建新的fsimage
           (4)辅助namenode将新的fsimage发送到主namenode中
           (5)主namenode用新的fsimage替代原先的fsimage,并且使用(1)中的eits代替旧的edits文件。
这就是为什么SecondaryNamenode也需要一台独立服务器的原因了。他的操作和namenode差不多
           这个创建检查点需要两个配置控制,第一就是dfs.namenode.checkpoint.period属性设定,每隔多长时间创建一次检查点,默认是3600即一个小时。第二就是dfs.namenode.checkpoint.txns这个hadoop1中是fs.checkpoint.size,我在hadoop2.2中没有找到与之类似,但是估计是这个,当编辑日志达到这个配置的大小即使没有到达之前配置的时间也会创建检查点。
          SecondaryNameNode中的current目录与namenode的一样,因为创建检查点不仅为主namenode创建检查点数据,也是辅助namenode也有一份检查点数据,用来备份namenode元数据,尽管他不是最新的。如果主namenode挂了,并且没有NFS,可以使用SecondaryNamenode作为主namenode,当dfs.namenode.name.dir中没有元数据的时候就会从dfs.namenode.checkpoint.dir中载入检查点数据。这就是为什么两者目录为什么设计成一样的原因了,不用担心覆盖现有的元数据。

          DataNode的目录结构:

          {dfs.datanode.data.dir}
           |--VERSION
           |--BP-792156149-127.0.1.1-1431433217275
                       |--current
                                  |--finalized
                                  |--VERSION
           VERSION内容与namenode类似,他的namespaceID是datanode首次向namenode访问获取的,storageID是每个datanode的id,namenode通过他来区分不同的datanode
          看到BP-792156149-127.0.1.1-1431433217275这个让我明白了namendoe上面的那个blockpoolId了,这时hadoop1中没有的,在这个BP-792156149-127.0.1.1-1431433217275目录里面放着这个块池的current,里面还有一个VERSION这个VERSION才有namespaceID,而外层那个只有storageID
深入理解NameNode和DataNode

深入理解NameNode和DataNode

在hadoop2中数据块存放到块池中的finalized中以blk_为前缀,有两种类型:块文件和块文件元数据信息(以meta结尾)块文件存储数据,块文件信息存储版本号以及校验和等信息。

如果dfs.namenode.data.dir指定了不同磁盘的多个目录,数据会以轮转的方式写入到磁盘中,当同一个datanode不会存储相同的块。
一个典型的结构如下:

 

dfsused:磁盘使用率

 finalized 表示数据副本状态

 常用的几个状态:
 

块状态

存储目录

说明

Finalized

${BP_HOME}/current/finalized

表示该副本已经完成了所有数据的写入。

RBW 
(Replica Being Written To)

${BP_HOME}/current/rbw

表示该副本正在写入或追加数据。

RWR 
(Replica Waiting to be Recovered)

${BP_HOME}/current/rbw

如果DataNode宕机或重启,处于RBW状态的副本将转换为RWR状态,不会在接受新数据的写入。

RUR 
(Replica Under Recovery)

${BP_HOME}/current/rbw

当租约到期,NameNode将为客户端关闭其所占用的副本,这将使该副本进入RUR状态。

Temporary

${BP_HOME}/tmp

表示该副本正在被创建。

 

*${BP_HOME}为${datanode.data.dir}/current/<blockpool_id>
一个数据块由两个文件组成,一个为块数据文件(以blk_为前缀),一个为该数据块的元数据文件(以.meta为后缀),该文件包括了数据块的版本、类型和一系列区域检验和。当数据目录中的块文件达到64个之后,DataNode会在该目录下建立一个子目录(subdirn),将这些块文件移动到该目录下,以避免一个目录存储过多的文件,影响了系统的性能

 

 


如果你有时候连续格式化文件系统,会产生datanode与namenode 的namespaceID不同,这时候你启动不了datanode因为namenode并不认识这个datanode,你需要将datanode的namespaceID与namenode相匹配。
 

转载于:https://www.cnblogs.com/ZFBG/p/11125068.html

<think>好的,我现在需要回答用户关于Hadoop NameNode如何连接DataNode的问题。首先,我得回忆Hadoop的架构,特别是HDFS的组成部分。NameNode是管理文件系统元数据的,而DataNode负责存储实际的数据块。连接过程涉及到初始化和维护通信,可能包括心跳机制、块报告等。 用户可能想知道连接的具体机制,比如启动时的注册流程,或者运行中的心跳检测。需要分步骤解释,比如启动过程、心跳机制、块报告、指令响应、故障处理等。还要注意使用正确的中文术语,避免技术术语混淆。 要确保符合系统级指令,所有数学公式和行内代码用$...$,独立公式用$$...$$。不过这个问题可能涉及较多的技术术语而不是数学公式,但如果有变量或代码片段,需要正确应用格式。比如DataNode的配置参数可能需要用$...$包裹。 另外,用户需要结构清晰的回答,逐步解释连接过程。可能需要先概述,再分点详细说明。同时要确保内容真实可靠,比如参考Hadoop官方文档中的机制,比如心跳默认3秒一次,超时时间默认10分钟。 需要检查是否有遗漏的步骤,比如安全模式下的处理,或者HA架构中的Standby NameNode如何处理DataNode连接。但用户的问题可能更关注基础的单NameNode情况,所以可以暂不深入HA部分,除非必要。 最后,确保语言简洁明了,用中文表达,避免长句,分点说明,帮助用户逐步理解整个过程。可能需要总结连接过程的关键点,强调心跳和块报告的重要性,以及故障处理机制。</think>Hadoop NameNodeDataNode的连接机制是HDFS(Hadoop Distributed File System)实现分布式存储的核心。以下是分步骤说明: 1. **启动注册阶段** - DataNode启动时,通过`dfs.datanode.address`配置的IPC端口(默认50020)向NameNode发送注册请求 - NameNodeDataNode信息(IP、端口、存储容量等)记录到内存元数据 - 注册成功后,DataNode被纳入集群可用节点列表 2. **心跳维持连接(关键机制)** ```java // DataNode的心跳发送逻辑伪代码 while (running) { sendHeartbeat(); // 默认每3秒发送一次 wait(heartbeatInterval); } ``` - 心跳包含:存储状态、网络吞吐量、当前负载等 - NameNode通过心跳判断DataNode存活状态 - 超时阈值:`dfs.namenode.heartbeat.recheck-interval`(默认10分钟) 3. **块报告同步** - 初次注册后发送全量块报告(BlockReport) - 后续每小时发送增量块报告(IncrementalBlockReport) - 报告格式:块ID、时间戳、长度、校验和 4. **指令响应通道** - NameNode通过心跳响应返回指令: * 数据块复制(副本数不足时) * 数据块删除(冗余副本或过期数据) * 节点维护指令(退役/进入维护模式) 5. **故障处理流程** - 心跳丢失检测:$$ T_{timeout} = 2 \times T_{heartbeat} + T_{grace} $$ - NameNode将故障节点标记为`DEAD` - 触发副本复制(通过Rack Awareness策略) 6. **网络拓扑维护** ```shell # 典型网络拓扑映射 /default/rack1/192.168.1.101 /default/rack2/192.168.2.102 ``` - 基于`net.topology.script.file.name`脚本实现机架感知 - 影响数据放置策略和副本分布 **关键配置文件**: - `hdfs-site.xml`: ```xml <property> <name>dfs.namenode.rpc-address</name> <!-- NameNode RPC地址 --> <value>namenode-host:8020</value> </property> <property> <name>dfs.datanode.address</name> <!-- DataNode连接端口 --> <value>0.0.0.0:50010</value> </property> ``` **监控指标**: - `LastContact`:NameNode记录的最后心跳时间 - `XceiverCount`:DataNode的并发传输线程数 - `FailedVolumes`:DataNode的故障磁盘数 这种基于心跳的松耦合设计,使HDFS能有效应对网络波动和节点故障,同时保持高扩展性(支持数千节点集群)。实际运维中需特别注意心跳间隔集群规模的平衡调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值