Hadoop第三天!!!

NameNode

概述
  1. NameNode是HDFS的主进程,也是核心进程。在Hadoop1.x中只允许存在1个NameNode,在Hadoop2.x允许最多存在2个NameNode(1个Active+1个Standby),在Hadoop3.x中不再限制NameNode的数量(1个Active+n个Standby)

  2. 作为主进程,NameNode对外负责接收请求,对内负责记录元数据和管理DataNode

记录元数据
  1. 元数据(metadata)是用于描述数据的数据。在HDFS中,元数据是用于描述DataNode上存储文件的数据,可以理解为账本

  2. HDFS中,元数据的内容非常复杂,包含了三十多项,例如:

    1. 上传的文件名以及对应的虚拟存储路径

    2. 文件的所属用户和用户组

    3. 文件的权限

    4. 文件的大小

    5. Block的大小

    6. 文件和BlockID的映射关系

    7. 副本的数量

    8. Block和DataNode的映射关系等

  3. 在HDFS中,每一条元数据大小大约是150B左右

  4. NameNode会将元数据维系在内存以及磁盘中

    1. 维系在内存中的目的是为了读写快

    2. 维系在磁盘上的目的是为了持久化

  5. 元数据在磁盘上的存储位置由dfs.namenode.name.dir属性来决定,默认值是file://${hadoop.tmp.dir}/dfs/name,引用了hadoop.tmp.dir属性的值。hadoop.tmp.dir的默认值是/tmp/hadoop-${user.name},此时就意味着必须修改这个存储路径

  6. 在HDFS中,和元数据相关的文件

    1. edits文件:记录HDFS的写操作文件

    2. fsimage文件:元映像文件,记录的是HDFS的元数据

  7. 当NameNode接收到写请求的时候,首先会将这个命令解析记录到edits_inprogress文件中。记录完成之后,会更新内存中的元数据。更新完成之后,会给客户端返回一个ACK信号表示记录成功。注意,在这个过程中,fsimage文件中的元数据没有更新!也就意味着,fsimage文件中的元数据和内存中的元数据不是同步的!!!

  8. 当达到指定条件之后,edits_inprogress文件就会产生滚动,滚动生成edits文件,同时产生一个新的edits_inprogress文件,新来的写操作记录到新的edits_inprogress文件中。生成edits文件之后,HDFS会解析edits文件,根据edits文件的内容,更新fsimage文件中的元数据

  9. edits_inprogress的滚动条件

    1. 空间:默认情况下,每隔1min(可以通过dfs.namenode.checkpoint.check.period属性来调节,单位是秒,默认值是60)扫描一次edits_inprogress文件。当扫描edits_inprogress文件的时候,发现达到指定大小(可以通过dfs.namenode.checkpoint.txns属性来调节,默认值是1000000,即edits_inprogress文件中记录达到1000000条)之后,会自动滚动生成edits文件

    2. 时间:当距离上一次滚动达到指定的时间间隔(可以通过dfs.namenode.checkpoint.period属性来调节,默认值是3600,单位是秒)的时候,edits_inprogress文件自动滚动生成edits文件

    3. 重启:当NameNode被重启的时候,也会自动触发edits_inprogress的滚动

    4. 强制:可以通过命令hdfs dfsadmin -rollEdits来强制滚动edits_inprogress

  10. 查看edits文件

    hdfs oev -i edits_0000000000000000012-0000000000000000028 -o a.xml
  11. HDFS会给每一给写操作一个递增的编号,称之为事务id,简写为txid

  12. 在HDFS中,会将开始记录日志(OP_START_LOG_SEGMENT)和结束记录日志(OP_END_LOG_SEGMENT)都看作是写操作,都会分配一个事务id

  13. 上传文件的时候,NameNode如何拆分的命令

    1. OP_ADD:在指定路径下添加文件名._COPYING_文件

    2. OP_ALLOCATE_BLOCK_ID:分配BlockID(意味着对文件进行切块)

    3. OP_SET_GENSTAMP_V2:设置时间戳编号

    4. OP_ADD_BLOCK:上传(添加)Block

    5. OP_CLOSE:关闭文件(本质上就是关流)

    6. OP_RENAME_OLD:重命名文件

  14. 在HDFS中,文件一旦写完就不能修改!!!(HDFS中的文件不允许被修改!!!)

  15. 查看fsimage文件

    hdfs oiv -i fsimage_0000000000000000033 -o a.xml -p XML
  16. HDFS第一次启动之后1min,会自动触发一次edits_inprogress文件的滚动

  17. NameNode会为每一个fsimage文件生成一个md5文件,用于对fsimage文件进行校验

管理DataNode

  1. NameNode通过心跳(heart beat)机制来管理DataNode:DataNode定时(通过dfs.heartbeat.interval属性来调节,默认值是3,单位是秒)给NameNode发送心跳信号。如果在一定时间内,NameNode没有收到DataNode的心跳信号,那么就表示这个DataNode已经lost(丢失),此时NameNode就会将这个DataNode上的数据重新备份到其他的DataNode上以保证整个集群中的副本数量

  2. 需要注意的是,心跳超时时间由两个属性决定:dfs.heartbeat.intervaldfs.namenode.heartbeat.recheck-interval

  3. 属性默认值单位
    dfs.heartbeat.interval3
    dfs.namenode.heartbeat.recheck-interval300000毫秒

    心跳超时时间=2*dfs.namenode.heartbeat.recheckinterval+10*dfs.heartbeat.interval,默认情况下,心跳超时时间=2*5min+10*3s=10min30s

  4. 心跳信号

    1. clusterid:集群编号。

      1. 当NameNode被格式化(hdfs namenode -format)的时候,自动计算产生一个clusterid

      2. HDFS启动之后,DataNode第一次给NameNode发送心跳,NameNode会在心跳响应中将clusterid返回给这个DataNode,并且要求DataNode在后续的请求(包括心跳)中携带clusterid

      3. 当NameNode收到DataNode的请求之后,会校验clusterid是否一致。如果clusterid一致,那么NameNode才会接收DataNode的请求或者心跳,如果不一致,那么可能会导致DataNode进程或者NameNode进程结束

      4. 每一次格式化,NameNode都会重新计算产生一个新的clusterid

    2. 当前DataNode的状态(预服役、服役、预退役)

  5. 默认情况下,DataNode每隔6个小时(由dfs.blockreport.intervalMsec属性来调节,单位是毫秒,默认值是21600000),会给NameNode汇报一次当前DataNode上存储的Block情况

安全模式(safemode)

  1. 当NameNode被重启的时候,自动进入安全模式

  2. 在安全模式中,NameNode首先会触发edits_inprogress文件的滚动。滚动完成之后,更新fsimage文件

  3. 更新完成之后,NameNode会将fsimage文件中的元数据加载到内存中。加载完成之后,NameNode等待DataNode的心跳

  4. 如果NameNode没有收到DataNode的心跳,那么此时NameNode就会认为这个DataNode已经lost,那么此时NameNode会将这个DataNode上的数据备份到其他的节点上来保证副本数量;如果NameNode收到了DataNode的心跳,那么会对这个DataNode上的Block存储情况进行校验。如果校验成功,那么NameNode自动退出安全模式;如果校验失败,那么NameNode会试图恢复这个DataNode上的数据,恢复完成之后,会重新校验;校验成功之后,才会退出安全模式

  5. 在安全模式下,HDFS只提供读(下载)操作,不提供写(上传)操作

  6. 如果在合理的时间内,HDFS依然没有退出安全模式,那么说明数据已经产生了不可逆的损坏或者丢失(这个数据的所有副本都损坏或者丢失)

  7. 安全模式的命令

    命令解释
    hdfs dfsadmin -safemode enter进入安全模式
    hdfs dfsadmin -safemode leave退出安全模式
    hdfs dfsadmin -safemode get获取安全模式的状态

DataNode

  1. DataNode是HDFS的从进程,负责存储数据。DataNode会将数据以Block形式落地到本地的磁盘上

  2. Block在磁盘上的存储位置由dfs.datanode.data.dir属性来决定的,默认值是file://${hadoop.tmp.dir}/dfs/data,由hadoop.tmp.dir属性来决定

  3. DataNode会为每一个Block生成一个.meta文件,.meta文件实际上是这个Block的校验文件

  4. DataNode会通过心跳向NameNode注册信息

  5. DataNode的状态:预服役、服役、预退役、退役

SecondaryNameNode

  1. SecondaryNameNode不是NameNode的备份,而是辅助进程,用于辅助NameNode完成edits_inprogress文件的滚动和fsimage文件的更新

    1. 如果HDFS集群中存在SecondaryNameNode,那么fsimage文件的更新是由SecondaryNameNode来完成

    2. 如果HDFS集群中不存在SecondaryNameNode,那么fsimage文件的更新是由NameNode自己来完成

  2. 因此,SecondaryNameNode不是必须的进程。实际过程中,NameNode和SecondaryNameNode不是在同一个节点上

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值