学习日志【 hadoop(HDFS)】
该文章为自己学习整理总结内容
一、HDFS概述
1.1 HDFS的产出背景及其定义
-
HDFS产出背景
随着数据量的越来越大,在一个操作系统存不下所有数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护
迫切的需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理中的一种。 -
HDFS定义:
HDFS,是一个文件系统,用于存储文件,通过目录树来定位文件;其次,他是分布式的,有很多服务器联合起来实现功能
集群中的服务器各自有各自的角色。
HDFS的使用场景:适合一次写入多次写出的场景,且不支持文件的修改。适合用来做数据分析。
1.2 HDFS优缺点
-
优点:
(1)高容错性 1.数据自动保存多个副本,它通过增加副本的形式,提高容错性。 2.某一个副本丢失之后,它可以自动恢复。 (2)适合处理大数据 1.数据规模:能够处理数据规模达到GB,TB,甚至PB级的数据 2.文件规模:能够处理百万规模以上的文件数量,数量相当之大。 (3)可构建在廉价机器上,通过多副本机制,来提高可靠性。
-
缺点:
(1)不适合做低延迟的数据访问,比如毫秒级的存储数据,是做不到的 (2)无法高效的对大量小文件进行存储。 1.存储大量文件的话,他会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,毕竟NN的内存也是有限的。 2.小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。 3.存储文件的数据块,会在NN上创建一个索引,所以在存储大量小文件时会创建大量索引,影响效率。 (3)不支持并发写入,文件随机修改 1.一个文件只能有一个写,不能多个线程同时写 2.仅支持数据追加,不支持文件的随机修改。
1.3 HDFS组成架构
- NameNode(NN):就是Master,它是一个主管,管理者。
1.管理DHFS的名称空间。
2.配置副本策略。
3.管理数据块(Block)映射信息。
4.处理客户端读写请求。 - DataNode:就是Slave。NameNode下达命令,DataNode就是执行实际的操作。
1.存储实际的数据块
2.执行数据块的读/写的操作 - Client:就是客户端
1.文件切分。文件上传HDFS时,Client会将文件切分成一个一个的Block,然后进行上传。
2.与NameNode进行交互,获取文件的位置信息。
3.与DataNode进行交互,读取或者写入数据。
4.Client提供一些命令来管理HDFS,比如NameNode格式化。
5.Client可以通过一些命令来访问HDFS,比如对HDFS的增删改查。 - Secondary NameNode:辅助其他的组件工作。
1.辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给 NameNode;
2.在紧急情况下,可以辅助恢复NameNode。
1.4 HDFS文件块大小
HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小是在HADOOP 2.X中
是128M,老版本是64M
- 文件块大小
1. 如果寻址时间约为10ms,即查找到目标数据块的时间为10ms
2. 寻址时间为传输时间的1%时,则为最佳状态。因此传输时间=10ms/0.01=1000ms=1s
3. 而目前磁盘的传输速率普遍为100MB/S
4. BLOCK=1S*100MB/S=100MB
- 为什么块的大小不能设置太大也不能设置太小?
1. HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置;
2. 如果块设置的太大,从磁盘传输数据的时间会明显大于定位在这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。
总结:HDFS块的大小设置主要取决于磁盘的传输速率。
二、HDFS的shell操作
HDFS的命令操作跟在linux环境中的操作类似。
2.1 HDFS命令基本语法
hadoop fs 具体命令 OR hdfs dfs 具体命令
2.2 HDFS命令总结
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hadoop fs
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] <localsrc> ... <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] <path> ...]
[-cp [-f] [-p] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-usage [cmd ...]]
2.3 HDFS常用命令
-
准备工作
(1)启动Hadoop集群(方便后续的测试)
[atguigu@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh [atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
(2)-help:输出这个命令参数
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -help rm
-
上传
(1)-moveFromLocal:从本地剪切粘贴到HDFS[atguigu@hadoop102 hadoop-3.1.3]$ touch kongming.txt [atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -moveFromLocal ./kongming.txt /sanguo/shuguo
(2)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal README.txt /
(3)-appendToFile:追加一个文件到已经存在的文件末尾
[atguigu@hadoop102 hadoop-3.1.3]$ touch liubei.txt [atguigu@hadoop102 hadoop-3.1.3]$ vi liubei.txt 输入 san gu mao lu [atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
(4)-put:等同于copyFromLocal
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -put ./liubei.txt /user/atguigu/test/
-
下载
1)-copyToLocal:从HDFS拷贝到本地[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal/sanguo/shuguo/kongming.txt ./
(2)-get:等同于copyToLocal,就是从HDFS下载文件到本地
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -get /sanguo/shuguo/kongming.txt./
(3)-getmerge:合并下载多个文件,比如HDFS的目录 /user/atguigu/test下有多个文件:log.1, log.2,log.3,…
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -getmerge /user/atguigu/test/* ./zaiyiqi.txt
4.HDFS直接操作
1)-ls: 显示目录信息[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /
2)-mkdir:在HDFS上创建目录
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir -p /sanguo/shuguo
3)-cat:显示文件内容
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /sanguo/shuguo/kongming.txt
4)-chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 666 /sanguo/shuguo/kongming.txt [atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -chown atguigu:atguigu /sanguo/shuguo/kongming.txt
5)-cp :从HDFS的一个路径拷贝到HDFS的另一个路径
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /sanguo/shuguo/kongming.txt /zhuge.txt
6)-mv:在HDFS目录中移动文件
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /zhuge.txt /sanguo/shuguo/
7)-tail:显示一个文件的末尾1kb的数据
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /sanguo/shuguo/kongming.txt
8)-rm:删除文件或文件夹
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -rm /user/atguigu/test/jinlian2.txt
9)-rmdir:删除空目录
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /test [atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -rmdir /test
10)-du统计文件夹的大小信息
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -du -s -h /user/atguigu/test 2.7 K /user/atguigu/test [atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -du -h /user/atguigu/test 1.3 K /user/atguigu/test/README.txt 15 /user/atguigu/test/jinlian.txt 1.4 K /user/atguigu/test/zaiyiqi.txt
11)-setrep:设置HDFS中文件的副本数量
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt
这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。
三、HDFS的数据流
3.1 HDFS写数据流程
3.1.1 剖析文件写入
(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
(2)NameNode返回是否可以上传。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet(64kb)为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
-
简单问答:
-
HDFS根据请求返回DataNode的节点的策略?-- 机架感知
– 如果当前Client所在机器有DataNode节点,那就返回当前机器DN1,否则从集群中随机一台。
– 根据第一台机器的位置,然后再其他机架上随机一台,在第二台机器所在机架上再随机一台。
– 以上策略的缘由:为了提高数据的可靠性,同时一定程度也保证数据传输的效率! -
客户端建立传输通道的时候如何确定和哪一台DataNode先建立连接?-- 网络拓扑
– 找离client最近的一台机器先建立通道。 -
Client为什么是以串行的方式建立通道?
– 本质上就是为了降低client的IO开销 -
数据传输的时候如何保证数据成功?(了解)
– 采用了ack回执的策略保证了数据完整成功上传。数据流解析:
- FSDataoutputStream:
当我们要上传一个128M的文件时,它会将这128M的文件化解成packet(64k),然后再转换成chunk(512字节),当一个packet上传完成后,会将此文件放在一个 dataqueue 的队列里,然后再从dataqueue 放在通道里发送,并在 dataqueue 中移除,然后再发送到 ackqueue 队列中,再从ackqueue 通道传输到 DataNode 中,最后由多个chunk组成一个完整的数据块,如果发生错误,chunk还会在ackqueue中,等待传输链接修复再上传。
- FSDataoutputStream:
3.1.2 网络拓扑-节点距离计算
- 节点距离:两个节点到达最近的共同祖先的距离总和。
3.1.3 机架感知(副本存储节点选择)
- Hadoop3.1.3副本节点选择
4.2 HDFS读数据流程
(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
四、NameNode和SecondaryNameNode
4.1 NN和2NN工作机制
-
元数据信息要保存在哪?
- 1.1 保存到磁盘
– 不足:读写速度慢 效率低! - 1.2 保存内存
– 不足:数据不安全 - 1.3 最终的解决方案: 磁盘 + 内存
- 1.1 保存到磁盘
-
内存中的元数据和磁盘中的元数据如何进行同步。(元数据的维护策略)
当我们对元数据进行操作的时候,首先在内存进行合并,其次还要把相关
操作记录追加到edits编辑日志文件中,在满足一定条件下,将edits文件中的
记录合并到元数据信息文件中 fsimage 。
- FsImage文件:是HDFS文件系统中的一个永久检查点,其中包含HDFS文件系统中所有的目录和文件inode额序列化信息
- Edits文件:存放HDFS文件系统中的所有更新操作的路径,文件系统客户端执行的所有有写操作首先都会被记录到Edits文件中。
- seen_txid文件:保存的是一个数字,就是最后一个edits_的数字
- 每次NameNode启动的时间都会将FsImage文件读入内存,加载Edits里边的更新操作,保证内存中的元数据信息是最新的,同步的,可以看成NameNode启动的时候就将FsImage文件与Edits文件进行合并。
- 谁负责对NN的元数据信息进行合并?
2NN主要负责对NN的元数据进行合并,当满足一定条件的下,2NN会监测本地时间,每隔一个小时会主动对NN的edits文件和fsimage文件进行一次合并。合并的时候,首先会通知NN,这时候NN就会停止对正在使用的edits文件的追加,同时会新建一个新的edits编辑日志文件,保证NN的正常工作。接下来 2NN会把NN本地的fsimage文件和edits编辑日志拉取2NN的本地,在内存中对二者进行合并,最后产生最新fsimage文件。把最新的fsimage文件再发送给NN的本地。注意还有一个情况,当NN的edits文件中的操作次数累计达到100万次,即便还没到1小时,2NN(每隔60秒会监测一次NN方的edits文件的操作次数)也会进行合并。 2NN 也会自己把最新的fsimage文件备份一份。
- Edits文件:
(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。存放HDFS文件系统中的所有更新操作的路径,文件系统客户端执行的所有有写操作首先都会被记录到Edits文件中。 - FsImage文件:
如果元数据存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。
4.2 Fsimage和Edits解析
-
oiv查看Fsimage文件
(1)查看oiv和oev命令[atguigu@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)案例实操
[atguigu@hadoop102 current]$ pwd /opt/module/hadoop-3.1.3/data/dfs/name/current [atguigu@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml [atguigu@hadoop102 current]$ cat /opt/module/hadoop-3.1.3/fsimage.xml
-
oev查看Edits文件
(1)基本语法hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
(2)案例实操
[atguigu@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000012- 0000000000000000013 -o /opt/module/hadoop-3.1.3/edits.xml [atguigu@hadoop102 current]$ cat /opt/module/hadoop-3.1.3/edits.xml
4.3 CheckPoint时间设置
-
通常情况下,SecondaryNameNode每隔一小时执行一次。
[hdfs-default.xml] <property> <name>dfs.namenode.checkpoint.period</name> <value>3600s</value> </property>
-
一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次。
<property> <name>dfs.namenode.checkpoint.txns</name> <value>1000000</value> <description>操作动作次数</description> </property> <property> <name>dfs.namenode.checkpoint.check.period</name> <value>60s</value> <description> 1分钟检查一次操作次数</description> </property >
4.4 NameNode故障处理(扩展)
NameNode故障后,可以采用如下两种方法恢复数据(学习前提,切勿在生产尝试)
-
将SecondaryNameNode中数据拷贝到NameNode存储数据的目录;
(1)kill -9 NameNode进程
(2)删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/tmp/dfs/name)[atguigu@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop-3.1.3/data/dfs/name/*
(3)拷贝SecondaryNameNode中数据到原NameNode存储数据目录
[atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-3.1.3/data/dfs/namesecondary/* ./name/
(4)重新启动NameNode
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode
-
使用-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-3.1.3/data/dfs/name</value> </property>
(2)kill -9 NameNode进程
(3)删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/dfs/name)[atguigu@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop- 3.1.3/data/dfs/name/*
(4)如果SecondaryNameNode不和NameNode在一个主机节点上,需要将 SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除 in_use.lock文件
[atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-3.1.3/data/dfs/namesecondary ./ [atguigu@hadoop102 namesecondary]$ rm -rf in_use.lock [atguigu@hadoop102 dfs]$ pwd /opt/module/hadoop-3.1.3/data/dfs [atguigu@hadoop102 dfs]$ ls data name namesecondary
(5)导入检查点数据(等待一会ctrl+c结束掉)
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs namenode -importCheckpoint
(6)启动NameNode
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode
4.5 集群安全模式
集群安全模式
- NameNode启动
NameNode启动时,首先将镜像文件(FsImage)载入内存,并执行编辑日志(Edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode一直在运行安全模式,即NameNode的文件系统对于客户端来说是只读的。 - DataNode启动
系统中的数据块的位置并不是由NameNode来维护的,而是以块列表的形式存储在DataNode中。在系统正常操作期间,NameNode 会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode 发送最新的块列表信息,NameNode 了解到足够多的块位置之后,即可高效运行文件系统。 - 安全模式退出判断
如果满足“最小副本条件”,NameNode会在30秒钟以后就安全退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min = 1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NameNode不进入安全模式。
-
基本语法
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态) -
案例
模拟等待安全模式 -
查看当前模式
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -safemode get Safe mode is OFF
-
先进入安全模式
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode enter
-
创建并执行下面的脚本
在/opt/module/hadoop-3.1.3路径上,编辑一个脚本safemode.sh[atguigu@hadoop102 hadoop-3.1.3]$ touch safemode.sh [atguigu@hadoop102 hadoop-3.1.3]$ vim safemode.sh #!/bin/bash hdfs dfsadmin -safemode wait hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt / [atguigu@hadoop102 hadoop-3.1.3]$ chmod 777 safemode.sh [atguigu@hadoop102 hadoop-3.1.3]$ ./safemode.sh
-
再打开一个窗口,执行
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode leave
-
观察
-
再观察上一个窗口
Safe mode is OFF
-
HDFS集群上已经有上传的数据了。
4.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中所有数据。
[atguigu@hadoop102 hadoop-3.1.3]$ rm -rf data/ logs/ [atguigu@hadoop103 hadoop-3.1.3]$ rm -rf data/ logs/ [atguigu@hadoop104 hadoop-3.1.3]$ rm -rf data/ logs/
(3)格式化集群并启动。
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs namenode –format [atguigu@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
(4)查看结果
[atguigu@hadoop102 dfs]$ ll 总用量 12 drwx------. 3 atguigu atguigu 4096 12月 11 08:03 data drwxrwxr-x. 3 atguigu atguigu 4096 12月 11 08:03 name1 drwxrwxr-x. 3 atguigu atguigu 4096 12月 11 08:03 name2
五、DataNode
5.1 DataNode工作机制
(1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
(2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
(3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
(4)集群运行中可以安全加入和退出一些机器。
5.2 数据完整性
在Hadoop中如何保持数据完整性:通过一定的算法,把内部数据加工成一个密文(一个新的文件,此文件为你的校验文件),校验文件的作用就是等你再次操作这个文件时,他还会加工出一个密文,两个密文进行比对,如果一致,则说明文件是没有变化的,如果不一致,副本机制会删掉的这个不一致的副本文件,等到DN向NN发送数据块信息时,NN监测到备份数据少了一个的时候,NN会再把这个副本补充上。
如下是DataNode节点保证数据完整性的方法。
(1)当DataNode读取Block的时候,它会计算CheckSum。
(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
(3)Client读取其他DataNode上的Block。
(4)常见的校验算法 crc(32),md5(128),sha1(160)
(5)DataNode在其文件创建后周期验证CheckSum。
5.3 掉线时限参数设置
- 需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。
<property> <name>dfs.namenode.heartbeat.recheck-interval</name> <value>300000</value> </property> <property> <name>dfs.heartbeat.interval</name> <value>3</value> </property>
5.4 服役新数据节点
-
需求
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。 -
环境准备
(1)在hadoop104主机上再克隆一台hadoop105主机
(2)修改IP地址和主机名称
(3)删除原来HDFS文件系统留存的文件(/opt/module/hadoop-3.1.3/data和logs)
(4)source一下配置文件[atguigu@hadoop105 hadoop-3.1.3]$ source /etc/profile
-
服役新节点具体步骤
(1)直接启动DataNode,即可关联到集群[atguigu@hadoop105 hadoop-3.1.3]$ hdfs --daemon start datanode [atguigu@hadoop105 hadoop-3.1.3]$ yarn --daemon start nodemanager
(2)在hadoop105上上传文件[atguigu@hadoop105 hadoop-3.1.3]$ hadoop fs -put /opt/module/hadoop-3.1.3/LICENSE.txt /
(3)如果数据不均衡,可以用命令实现集群的再平衡
[atguigu@hadoop102 sbin]$ ./start-balancer.sh starting balancer, logging to /opt/module/hadoop-3.1.3/logs/hadoop-atguigu- balancer-hadoop102.out Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
(4)如果服务器不稳定104 105互相调换,可以把105上的data/logs删掉,然后重启105的服务。
5.5 退役旧数据节点
5.5.1 添加白名单和黑名单
- 白名单和黑名单是hadoop管理集群主机的一种机制。
- 添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被退出。添加到黑名单的主机节点,不允许访问NameNode,会在数据迁移后退出。
- 实际情况下,白名单用于确定允许访问NameNode的DataNode节点,内容配置一般与workers文件内容一致。 黑名单用于在集群运行过程中退役DataNode节点。
配置白名单和黑名单的具体步骤如下:
-
在NameNode节点的/opt/module/hadoop-3.1.3/etc/hadoop目录下分别创建whitelist 和blacklist文件
[atguigu@hadoop102 hadoop]$ pwd /opt/module/hadoop-3.1.3/etc/hadoop [atguigu@hadoop102 hadoop]$ touch whitelist [atguigu@hadoop102 hadoop]$ touch blacklist
在whitelist中添加如下主机名称,假如集群正常工作的节点为102 103 104 105
hadoop102 hadoop103 hadoop104 hadoop105
黑名单暂时为空。
-
在hdfs-site.xml配置文件中增加dfs.hosts和 dfs.hosts.exclude配置参数
<!-- 白名单 --> <property> <name>dfs.hosts</name> <value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value> </property> <!-- 黑名单 --> <property> <name>dfs.hosts.exclude</name> <value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value> </property>
-
分发配置文件whitelist,blacklist,hdfs-site.xml (注意:105节点也要发一份)
[atguigu@hadoop102 etc]$ xsync hadoop/ [atguigu@hadoop102 etc]$ rsync -av hadoop/ atguigu@hadoop105:/opt/module/hadoop-3.1.3/etc/hadoop/
-
重新启动集群(注意:105节点没有添加到workers,因此要单独起停)
[atguigu@hadoop102 hadoop-3.1.3]$ stop-dfs.sh [atguigu@hadoop102 hadoop-3.1.3]$ start-dfs.sh [atguigu@hadoop105 hadoop-3.1.3]$ hdfs –daemon start datanode
-
在web浏览器上查看目前正常工作的DN节点
5.5.2 黑名单退役
-
编辑/opt/module/hadoop-3.1.3/etc/hadoop目录下的blacklist文件
[atguigu@hadoop102 hadoop] vim blacklist 添加如下主机名称(要退役的节点) hadoop105
-
分发blacklist到所有节点
[atguigu@hadoop102 etc]$ xsync hadoop/ [atguigu@hadoop102 etc]$ rsync -av hadoop/ atguigu@hadoop105:/opt/module/hadoop-3.1.3/etc/hadoop/
-
刷新NameNode、刷新ResourceManager
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes Refresh nodes successful [atguigu@hadoop102 hadoop-3.1.3]$ yarn rmadmin -refreshNodes 17/06/24 14:55:56 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
-
检查Web浏览器,退役节点的状态为decommission in progress(退役中),说明数据节点正在复制块到其他节点
-
等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役
[atguigu@hadoop105 hadoop-3.1.3]$ hdfs --daemon stop datanode
stopping datanode
[atguigu@hadoop105 hadoop-3.1.3]$ yarn --daemon stop nodemanager
stopping nodemanager
-
如果数据不均衡,可以用命令实现集群的再平衡
[atguigu@hadoop102 hadoop-3.1.3]$ sbin/start-balancer.sh starting balancer, logging to /opt/module/hadoop-3.1.3/logs/hadoop-atguigu- balancer-hadoop102.out Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
注意:不允许白名单和黑名单中同时出现同一个主机名称,既然使用了黑名单blacklist成功退役了hadoop105节点,因此要将白名单whitelist里面的hadoop105去掉。
5.6 DataNode多目录配置
-
DataNode可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本
-
具体配置如下
(1)在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>
(2)停止集群,删除三台节点的data和logs中所有数据。
[atguigu@hadoop102 hadoop-3.1.3]$ rm -rf data/ logs/ [atguigu@hadoop103 hadoop-3.1.3]$ rm -rf data/ logs/ [atguigu@hadoop104 hadoop-3.1.3]$ rm -rf data/ logs/
(3)格式化集群并启动。
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs namenode –format [atguigu@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
(4)查看结果
[atguigu@hadoop102 dfs]$ ll 总用量 12 drwx------. 3 atguigu atguigu 4096 4月 4 14:22 data1 drwx------. 3 atguigu atguigu 4096 4月 4 14:22 data2 drwxrwxr-x. 3 atguigu atguigu 4096 12月 11 08:03 name1 drwxrwxr-x. 3 atguigu atguigu 4096 12月 11 08:03 name2