Hadoop 从 0 到 1 学习 ——第六章 HDFS NameNode 和 SecondaryNameNode 详解 (面试开发重点)

1. NameNode和SecondaryNameNode

1.1 NameNode 和 SecondaryNameNode 工作机制

思考:NameNode 中的园数据存储在哪里的?

首先,我们做个假设,如果存储在 NameNode 节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage

这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据

但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并

NN和2NN工作机制,如图3-14所示。

在这里插入图片描述

NN和2NN工作机制
  1. 第一阶段:NameNode启动

    (1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

    (2)客户端对元数据进行增删改的请求。

    (3)NameNode记录操作日志,更新滚动日志。

    (4)NameNode在内存中对数据进行增删改。

  2. 第二阶段:Secondary NameNode工作

    (1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。

    (2)Secondary NameNode请求执行CheckPoint。

    (3)NameNode滚动正在写的Edits日志。

    (4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。

    (5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。

    (6)生成新的镜像文件fsimage.chkpoint。

    (7)拷贝fsimage.chkpoint到NameNode。

    (8)NameNode将fsimage.chkpoint重新命名成fsimage。

NN 和 2NN 工作机制详解:

Fsimage:NameNode内存中元数据序列化后形成的文件。

Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据)。

NameNode 启动时,先滚动 Edits 并生成一个空的 edits.inprogress,然后加载 Edits 和 Fsimage 到内存中,此时 NameNode 内存就持有最新的元数据信息。Client 开始对 NameNode 发送元数据的增删改的请求,这些请求的操作首先会被记录到 edits.inprogress 中(查询元数据的操作不会被记录在 Edits 中,因为查询操作不会更改元数据信息),如果此时 NameNode 挂掉,重启后会从 Edits 中读取元数据的信息。然后,NameNode 会在内存中执行元数据的增删改的操作。

由于 Edits 中记录的操作会越来越多,Edits 文件会越来越大,导致 NameNode 在启动加载 Edits 时会很慢,所以需要对 Edits 和 Fsimage 进行合并(所谓合并,就是将 Edits 和 Fsimage 加载到内存中,照着 Edits 中的操作一步步执行,最终形成新的 Fsimage )。SecondaryNameNode 的作用就是帮助 NameNode 进行 Edits 和Fsimage 的合并工作。

SecondaryNameNode 首先会询问 NameNode 是否需要 CheckPoint(触发 CheckPoint 需要满足两个条件中的任意一个,定时时间到Edits 中数据写满了)。直接带回 NameNode 是否检查结果。SecondaryNameNode 执行 CheckPoint 操作,首先会让 NameNode 滚动 Edits 并生成一个空的 edits.inprogress,滚动 Edits 的目的是给 Edits 打个标记,以后所有新的操作都写入 edits.inprogress ,其他未合并的 Edits 和 Fsimage 会拷贝到 SecondaryNameNode 的本地,然后将拷贝的 Edits 和 Fsimage 加载到内存中进行合并,生成 fsimage.chkpoint,然后将 fsimage.chkpoint 拷贝给 NameNode,重命名为 Fsimage 后替换掉原来的 Fsimage。NameNode 在启动时就只需要加载之前未合并的 Edits 和 Fsimage 即可,因为合并过的 Edits 中的元数据信息已经被记录在 Fsimage 中。

1.2 Fsimage 和 Edits 解析

1.2.1 概念

NameNode 被各式化后,将在 /opt/module/hadoop-2.7.2/data/dfs/name/current 目录下产生如下文件:

fsimage
fsimage.md5
see_txid
VERSION
  1. Fsimage 文件:HDFS 文件系统元数据的一个 永久性的检查点,其中包含 HDFS 文件系统的所有目录和 inode 的序列化信息。
  2. Edits 文件:存放 HDFS 文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到 Edits 文件中。
  3. seen_txid文件:保存的是一个数字,就是最后一个 edits 的数字。
  4. 每次 NameNode 启动的时候都会讲 Fsimage 文件读入内存,加载 Edits 文件的更新操作,保证内存中的元数据是最新的、同步的,可以看成 NameNode 启动的时候就将 Fsimage 和 Edits 文件合并到内存。

1.2.2 oiv 查看 Fsimage 文件

  1. 查看 oiv 和 oev 命令

    [dwjf321@hadoop102 current]$ hdfs
    oiv            apply the offline fsimage viewer to an fsimage
    oev            apply the offline edits viewer to an edits file
    
  2. 基本语法

    hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
    
  3. 案例操作

    [dwjf321@hadoop102 current]$ pwd
    /opt/module/hadoop-2.7.2/data/tmp/dfs/name/current
    [dwjf321@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml
    [dwjf321@hadoop102 current]$ cat /opt/module/hadoop-2.7.2/fsimage.xml
    

    将显示的 xml 文件拷贝到 IDEA 中创建的 xml 文件中,并格式化。部分显示结果如下:

    <inode>
    	<id>16386</id>
    	<type>DIRECTORY</type>
    	<name>user</name>
    	<mtime>1512722284477</mtime>
    	<permission>atguigu:supergroup:rwxr-xr-x</permission>
    	<nsquota>-1</nsquota>
    	<dsquota>-1</dsquota>
    </inode>
    <inode>
    	<id>16387</id>
    	<type>DIRECTORY</type>
    	<name>atguigu</name>
    	<mtime>1512790549080</mtime>
    	<permission>atguigu:supergroup:rwxr-xr-x</permission>
    	<nsquota>-1</nsquota>
    	<dsquota>-1</dsquota>
    </inode>
    <inode>
    	<id>16389</id>
    	<type>FILE</type>
    	<name>wc.input</name>
    	<replication>3</replication>
    	<mtime>1512722322219</mtime>
    	<atime>1512722321610</atime>
    	<perferredBlockSize>134217728</perferredBlockSize>
    	<permission>atguigu:supergroup:rw-r--r--</permission>
    	<blocks>
    		<block>
    			<id>1073741825</id>
    			<genstamp>1001</genstamp>
    			<numBytes>59</numBytes>
    		</block>
    	</blocks>
    </inode >
    

    思考:可以看出,Fsimage中没有记录块所对应DataNode,为什么?

    在集群启动后,要求DataNode上报数据块信息,并间隔一段时间后再次上报。

1.2.3 oev 查看 Edits 文件

  1. 基本语法

    hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
    
  2. 案例操作

    [dwjf321@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
    [dwjf321@hadoop102 current]$ cat /opt/module/hadoop-2.7.2/edits.xml
    

    将显示的xml文件内容拷贝到 IEDA 中创建的 xml 文件中,并格式化。显示结果如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <EDITS>
    	<EDITS_VERSION>-63</EDITS_VERSION>
    	<RECORD>
    		<OPCODE>OP_START_LOG_SEGMENT</OPCODE>
    		<DATA>
    			<TXID>129</TXID>
    		</DATA>
    	</RECORD>
    	<RECORD>
    		<OPCODE>OP_ADD</OPCODE>
    		<DATA>
    			<TXID>130</TXID>
    			<LENGTH>0</LENGTH>
    			<INODEID>16407</INODEID>
    			<PATH>/hello7.txt</PATH>
    			<REPLICATION>2</REPLICATION>
    			<MTIME>1512943607866</MTIME>
    			<ATIME>1512943607866</ATIME>
    			<BLOCKSIZE>134217728</BLOCKSIZE>
    			<CLIENT_NAME>DFSClient_NONMAPREDUCE_-1544295051_1</CLIENT_NAME>
    			<CLIENT_MACHINE>192.168.1.5</CLIENT_MACHINE>
    			<OVERWRITE>true</OVERWRITE>
    			<PERMISSION_STATUS>
    				<USERNAME>atguigu</USERNAME>
    				<GROUPNAME>supergroup</GROUPNAME>
    				<MODE>420</MODE>
    			</PERMISSION_STATUS>
    			<RPC_CLIENTID>908eafd4-9aec-4288-96f1-e8011d181561</RPC_CLIENTID>
    			<RPC_CALLID>0</RPC_CALLID>
    		</DATA>
    	</RECORD>
    	<RECORD>
    		<OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE>
    		<DATA>
    			<TXID>131</TXID>
    			<BLOCK_ID>1073741839</BLOCK_ID>
    		</DATA>
    	</RECORD>
    	<RECORD>
    		<OPCODE>OP_SET_GENSTAMP_V2</OPCODE>
    		<DATA>
    			<TXID>132</TXID>
    			<GENSTAMPV2>1016</GENSTAMPV2>
    		</DATA>
    	</RECORD>
    	<RECORD>
    		<OPCODE>OP_ADD_BLOCK</OPCODE>
    		<DATA>
    			<TXID>133</TXID>
    			<PATH>/hello7.txt</PATH>
    			<BLOCK>
    				<BLOCK_ID>1073741839</BLOCK_ID>
    				<NUM_BYTES>0</NUM_BYTES>
    				<GENSTAMP>1016</GENSTAMP>
    			</BLOCK>
    			<RPC_CLIENTID></RPC_CLIENTID>
    			<RPC_CALLID>-2</RPC_CALLID>
    		</DATA>
    	</RECORD>
    	<RECORD>
    		<OPCODE>OP_CLOSE</OPCODE>
    		<DATA>
    			<TXID>134</TXID>
    			<LENGTH>0</LENGTH>
    			<INODEID>0</INODEID>
    			<PATH>/hello7.txt</PATH>
    			<REPLICATION>2</REPLICATION>
    			<MTIME>1512943608761</MTIME>
    			<ATIME>1512943607866</ATIME>
    			<BLOCKSIZE>134217728</BLOCKSIZE>
    			<CLIENT_NAME></CLIENT_NAME>
    			<CLIENT_MACHINE></CLIENT_MACHINE>
    			<OVERWRITE>false</OVERWRITE>
    			<BLOCK>
    				<BLOCK_ID>1073741839</BLOCK_ID>
    				<NUM_BYTES>25</NUM_BYTES>
    				<GENSTAMP>1016</GENSTAMP>
    			</BLOCK>
    			<PERMISSION_STATUS>
    				<USERNAME>atguigu</USERNAME>
    				<GROUPNAME>supergroup</GROUPNAME>
    				<MODE>420</MODE>
    			</PERMISSION_STATUS>
    		</DATA>
    	</RECORD>
    </EDITS >
    

    思考:NameNode 如何确定下次开机启动的时候合并哪些 Edits ?

1.3 CheckPoint 时间设置

  1. 通常情况下,SecondaryNameNode 每隔一小时执行一次。

    [hdfs-default.xml]

    <property>
      <name>dfs.namenode.checkpoint.period</name>
      <value>3600</value>
    </property>
    
  2. 一分钟检查一次操作次数,当操作次数达到 1 百万时, SecondaryNameNode 执行一次。

    <property>
      <name>dfs.namenode.checkpoint.txns</name>
      <value>1000000</value>
    <description>操作动作次数</description>
    </property>
    
    <property>
      <name>dfs.namenode.checkpoint.check.period</name>
      <value>60</value>
    <description> 1分钟检查一次操作次数</description>
    </property >
    

1.4 NameNode故障处理

NameNode 故障后,可以采用如下两种方法恢复数据。

方法一:将 SecondaryNameNode 中数据拷贝到 NameNode 存储数据的目录:

  1. kill -9 NameNode 进程

  2. 删除 NameNode 存储的数据 (/opt/module/hadoop-2.7.2/data/tmp/dfs/name)

    [dwjf321@hadoop102 hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
    
  3. 拷贝 SecondaryNameNode 中数据到原 NameNode 存储目录

    [dwjf321@hadoop102 dfs]$ scp -r dwjf321@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/
    

方法二:使用 -importCheckpoint 选项启动 NameNode 守护进程,从而将 SecondaryNameNode 中数据拷贝到 NameNode 目录中。

  1. 修改 hdfs-site.xml中的

    <property>
      <name>dfs.namenode.checkpoint.period</name>
      <value>120</value>
    </property>
    
    <property>
      <name>dfs.namenode.name.dir</name>
      <value>/opt/module/hadoop-2.7.2/data/tmp/dfs/name</value>
    </property>
    
  2. kill -9 NameNode进程

  3. 删除NameNode存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)

    [dwjf321@hadoop102 hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
    
  4. 如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件

    [dwjf321@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary ./
    [dwjf321@hadoop102 namesecondary]$ rm -rf in_use.lock
    [dwjf321@hadoop102 dfs]$ pwd
    /opt/module/hadoop-2.7.2/data/tmp/dfs
    [dwjf321@hadoop102 dfs]$ ls
    data  name  namesecondary
    
  5. 导入检查点数据(等待一会ctrl+c结束掉)

    [dwjf321@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -importCheckpoint
    
  6. 启动 NameNode

    [dwjf321@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
    

1.5 集群安全模式

1.5.1 概述

  1. NameNode 启动

    NameNode 启动时,首先将镜像文件(Fsimage) 载入内存,并执行编辑日志 (Edits) 中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的 Fsimage 文件和一个空的编辑日志。此时,NameNode 开始监听 DataNode 请求。这个过程期间,NameNode 一直运行在安全模式,即 NameNode 的系统对于客户端来说是只读的

  2. DataNode 启动

    系统中的数据块的位置并不是由 NameNode 维护的,而是以块列表的形式存储在 DataNode 中。在系统的正常操作期间,NameNode 会在内存中保留所有块位置的映射信息。在安全模式下,各个 DataNode 会向 NameNode 发送最新的块列表信息,NameNode 了解到足够多的块位置信息之后,即可高效运行文件系统。

  3. 安全模式退出判断

    如果满足“最小副本条件”,NameNode 会在 30s 钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中的 99.9% 的块满足最小副本级别(默认值:dfs.replication.min=1)。在启动一个刚刚格式化的 HDFS 集群市,因为系统中还没有任何块,所以 NameNode 不会进入安全模式

1.5.2 基本语法

集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。

  1. 查看安全模式状态

    $ bin/hdfs dfsadmin -safemode get
    
  2. 进入安全模式状态

    $ bin/hdfs dfsadmin -safemode enter
    
  3. 离开安全模式状态

    $ bin/hdfs dfsadmin -safemode leave
    
  4. 等待安全模式状态

    $ bin/hdfs dfsadmin -safemode wait 
    

1.5.3 案例

模拟等待安全模式

  1. 查看当前模式

    [dwjf321@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -safemode get
    Safe mode is OFF
    
  2. 先进入安全模式

    [dwjf21@hadoop102 hadoop-2.7.2]$ bin/hdfs dfsadmin -safemode enter
    
  3. 创建并执行下面的脚本

    在 /opt/module/hadoop-2.7.2 路径上,编辑一个脚本 safemode.sh

    [dwjf321@hadoop102 hadoop-2.7.2]$ vim safemode.sh
    
    #!/bin/bash
    hdfs dfsadmin -safemode wait
    
    hdfs dfs -put /opt/module/hadoop-2.7.2/README.txt /
    

    执行脚本

    [dwjf321@hadoop102 hadoop-2.7.2]$ chmod 777 safemode.sh
    [dwjf321@hadoop102 hadoop-2.7.2]$ ./safemode.sh 
    
  4. 再打开一个窗口,执行

    [dwjf321@hadoop102 hadoop-2.7.2]$ bin/hdfs dfsadmin -safemode leave
    
  5. 观察

    (a)再观察上一个窗口

    ​ Safe mode is OFF

    (b)HDFS集群上已经有上传的数据了

1.6 NameNode 多目录配置

NameNode 的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性

具体配置如下:

  1. 在hdfs-site.xml文件中增加如下内容

    <property>
        <name>dfs.namenode.name.dir</name>
    <value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
    </property>
    
    
  2. 停止集群,删除data和logs中所有数据。

    [dwjf321@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/
    [dwjf321@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/
    [dwjf321@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/
    
  3. 格式化集群并启动

    [dwjf321@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode –format
    [dwjf321@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
    
  4. 查看结果

    [dwjf321@hadoop102 dfs]$ ll
    总用量 12
    drwx------. 3 dwjf321 dwjf321 4096 12月 11 08:03 data
    drwxrwxr-x. 3 dwjf321 dwjf321 4096 12月 11 08:03 name1
    drwxrwxr-x. 3 dwjf321 dwjf321 4096 12月 11 08:03 name2
    

2. DataNode 详解

2.1 DataNode工作机制

DataNode工作机制,如图所示:

在这里插入图片描述

DataNode工作机制
  1. 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据。元数据包括:数据块的长度块数据的校验和、以及时间戳

  2. DataNode 启动后向 NameNode 注册,通过后,周期性(1小时)的向 NameNode 上报所有的块信息。

  3. 心跳是每3秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过 10分钟 没有收到某个DataNode 的心跳,则认为该节点不可用。

  4. 集群运行中可以安全加入和退出一些机器。

2.2 数据完整性

思考:如果电脑磁盘里面存储的数据是控制高铁信号灯的红灯信号(1)和绿灯信号(0),但是存储该数据的磁盘坏了,一直显示是绿灯,是否很危险?同理 DataNode 节点上的数据损坏了,却没有发现,是否也很危险,那么如何解决呢?

如下是 DataNode 节点保证数据完整性的方法:

  1. 当 DataNode 读取 Block 的时候,它会计算 CheckSum。

  2. 如果计算后的 CheckSum,与 Block 创建时值不一样,说明 Block 已经损坏。

  3. Client 读取其他 DataNode 上的 Block。

  4. DataNode 在其文件创建后周期验证 CheckSum ,如图所示:
    在这里插入图片描述

    校验和

2.3 掉线时限参数设置

在这里插入图片描述

需要注意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。

<property>
    <name>dfs.namenode.heartbeat.recheck-interval</name>
    <value>300000</value>
    <description>5分钟</description>
</property>

<property>
    <name>dfs.heartbeat.interval</name>
    <value>3</value>
    <description>3秒</description>
</property>

2.4 服役新数据节点(集群扩容)

2.4.1 需求

随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。

2.4.2 环境准备

  1. 在hadoop104主机上再克隆一台hadoop105主机

  2. 修改IP地址和主机名称

  3. 删除原来 HDFS文件系统留存的文件(/opt/module/hadoop-2.7.2/data和log)

  4. source一下配置文件

    [dwjf321@hadoop105 hadoop-2.7.2]$ source /etc/profile
    

2.4.3 服役新节点具体步骤

  1. 直接启动DataNode,即可关联到集群

    [dwjf321@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
    [dwjf321@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
    

    在这里插入图片描述

  2. 在hadoop105上上传文件

    [dwjf321@hadoop105 hadoop-2.7.2]$ hadoop fs -put /opt/module/hadoop-2.7.2/LICENSE.txt /
    
  3. 如果数据不均衡,可以用命令实现集群的再平衡

    [dwjf321@hadoop102 sbin]$ ./start-balancer.sh
    starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out
    Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved
    

2.5 退役旧数据节点

2.5.1 添加白名单

添加到白名单的主机节点,都允许访问 NameNode,不在白名单的主机节点,都会被退出。

配置白名单的具体步骤如下:

  1. 在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts文件

    [dwjf321@hadoop102 hadoop]$ pwd
    /opt/module/hadoop-2.7.2/etc/hadoop
    [dwjf321@hadoop102 hadoop]$ vim dfs.hosts
    

    添加如下主机名称(不添加hadoop105)

    hadoop102
    hadoop103
    hadoop104
    
  2. 在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性

    <property>
        <name>dfs.hosts</name>
        <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>
    </property>
    
    
  3. 配置文件分发

    [dwjf321@hadoop102 hadoop]$ xsync hdfs-site.xml
    
  4. 刷新NameNode

    [dwjf321@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
    Refresh nodes successful
    
  5. 更新ResourceManager节点

    [atguigu@hadoop102 hadoop-2.7.2]$ yarn rmadmin -refreshNodes
    20/10/16 14:17:11 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.248.103:8033
    
  6. 在web浏览器上查看

    在这里插入图片描述

  7. 如果数据不均衡,可以用命令实现集群的再平衡

    [dwjf321@hadoop102 sbin]$ ./start-balancer.sh
    starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out
    Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved
    

2.5.2 黑名单退役

在黑名单上面的主机都会被强制退出。

  1. 在 NameNode 的 /opt/module/hadoop-2.7.2/etc/hadoop 目录下创建 dfs.hosts.exclude 文件

    [dwjf321@hadoop102 hadoop]$ pwd
    /opt/module/hadoop-2.7.2/etc/hadoop
    [dwjf321@hadoop102 hadoop]$ touch dfs.hosts.exclude
    [dwjf321@hadoop102 hadoop]$ vi dfs.hosts.exclude
    

    添加如下主机名称(要退役的节点)

    hadoop105
    
  2. 在 NameNode 的 hdfs-site.xml 配置文件中增加 dfs.hosts.exclude属性

    <property>
    	<name>dfs.hosts.exclude</name>
        <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude</value>
    </property>
    
  3. 刷新NameNode、刷新ResourceManager

    [dwjf321@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
    Refresh nodes successful
    [dwjf321@hadoop102 hadoop-2.7.2]$ yarn rmadmin -refreshNodes
    20/10/16 14:55:56 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.248.103:8033
    
  4. 检查Web浏览器,退役节点的状态为decommission in progress(退役中),说明数据节点正在复制块到其他节点,如图所示
    在这里插入图片描述

  5. 等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役,如图所示
    在这里插入图片描述

    已退役

    停止 hadoop105 节点服务

    stopping datanode

    [dwjf321@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
    

    stopping nodemanager

    [dwjf321@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager
    
  6. 如果数据不均衡,可以用命令实现集群的再平衡

    [dwjf321@hadoop102 hadoop-2.7.2]$ sbin/start-balancer.sh 
    starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out
    Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved
    

注意:不允许白名单和黑名单中同时出现同一个主机名称。

2.6 Datanode多目录配置

DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本

具体配置如下

hdfs-site.xml

<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>

猜你喜欢

转载自blog.csdn.net/dwjf321/article/details/110196835