参考:《尚硅谷》大数据学习,日常总结。
版本:Apache Hadoop 2.7.2
hdfs-default.xml:http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
集群配置情况:https://blog.csdn.net/qq_40794973/article/details/86681941#t7
第1章 HDFS概述
1.1 HDFS产出背景及定义
1.2 HDFS优缺点
1.3 HDFS组成架构
1.4 HDFS文件块大小(面试重点)
第2章 HDFS的Shell操作(开发重点)
1.基本语法
2.命令大全
3.常用命令实操
第3章 HDFS客户端操作(开发重点)
3.1 HDFS客户端环境准备
3.2 HDFS的API操作
3.3 HDFS的I/O流操作
第4章 HDFS的数据流(面试重点)
4.1 HDFS写数据流程
4.2 HDFS读数据流程
第5章 NameNode和SecondaryNameNode(面试开发重点)
5.1 NN和2NN工作机制
5.2 Fsimage和Edits解析
5.3 CheckPoint时间设置
5.4 NameNode故障处理
5.5 集群安全模式
5.6 NameNode多目录配置
第6章 DataNode(面试开发重点)
6.1 DataNode工作机制
6.2 数据完整性
6.3 掉线时限参数设置
6.4 服役新数据节点
6.5 退役旧数据节点
6.6 Datanode多目录配置
第7章 HDFS 2.X新特性
7.1 集群间数据拷贝
7.2 小文件存档
7.3 回收站
7.4 快照管理
bin/hadoop fs 具体命令
或者
bin/hdfs dfs 具体命令
dfs是fs的实现类:
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfs
Usage: hadoop fs [generic options]
[-appendToFile... ]
[-cat [-ignoreCrc]...]
[-checksum...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R]PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l]... ]
[-copyToLocal [-p] [-ignoreCrc] [-crc]... ]
[-count [-q] [-h]...]
[-cp [-f] [-p | -p[topax]]... ]
[-createSnapshot[ ]]
[-deleteSnapshot]
[-df [-h] [...]]
[-du [-s] [-h]...]
[-expunge]
[-find... ...]
[-get [-p] [-ignoreCrc] [-crc]... ]
[-getfacl [-R]]
[-getfattr [-R] {-n name | -d} [-e en]]
[-getmerge [-nl]]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [...]]
[-mkdir [-p]...]
[-moveFromLocal... ]
[-moveToLocal]
[-mv... ]
[-put [-f] [-p] [-l]... ]
[-renameSnapshot]
[-rm [-f] [-r|-R] [-skipTrash]...]
[-rmdir [--ignore-fail-on-non-empty]...]
[-setfacl [-R] [{-b|-k} {-m|-x} ]|[--set ]]
[-setfattr {-n name [-v value] | -x name}]
[-setrep [-R] [-w]...]
[-stat [format]...]
[-tail [-f]]
[-test -[defsz]]
[-text [-ignoreCrc]...]
[-touchz...]
[-truncate [-w]...]
[-usage [cmd ...]]Generic options supported are
-confspecify an application configuration file
-Duse value for given property
-fsspecify a namenode
-jtspecify a ResourceManager
-filesspecify comma separated files to be copied to the map reduce cluster
-libjarsspecify comma separated jar files to include in the classpath.
-archivesspecify comma separated archives to be unarchived on the compute machines. The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions][atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs
Usage: hadoop fs [generic options]
[-appendToFile... ]
[-cat [-ignoreCrc]...]
[-checksum...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R]PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l]... ]
[-copyToLocal [-p] [-ignoreCrc] [-crc]... ]
[-count [-q] [-h]...]
[-cp [-f] [-p | -p[topax]]... ]
[-createSnapshot[ ]]
[-deleteSnapshot]
[-df [-h] [...]]
[-du [-s] [-h]...]
[-expunge]
[-find... ...]
[-get [-p] [-ignoreCrc] [-crc]... ]
[-getfacl [-R]]
[-getfattr [-R] {-n name | -d} [-e en]]
[-getmerge [-nl]]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [...]]
[-mkdir [-p]...]
[-moveFromLocal... ]
[-moveToLocal]
[-mv... ]
[-put [-f] [-p] [-l]... ]
[-renameSnapshot]
[-rm [-f] [-r|-R] [-skipTrash]...]
[-rmdir [--ignore-fail-on-non-empty]...]
[-setfacl [-R] [{-b|-k} {-m|-x} ]|[--set ]]
[-setfattr {-n name [-v value] | -x name}]
[-setrep [-R] [-w]...]
[-stat [format]...]
[-tail [-f]]
[-test -[defsz]]
[-text [-ignoreCrc]...]
[-touchz...]
[-truncate [-w]...]
[-usage [cmd ...]]Generic options supported are
-confspecify an application configuration file
-Duse value for given property
-fsspecify a namenode
-jtspecify a ResourceManager
-filesspecify comma separated files to be copied to the map reduce cluster
-libjarsspecify comma separated jar files to include in the classpath.
-archivesspecify comma separated archives to be unarchived on the compute machines. The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions][atguigu@hadoop102 hadoop-2.7.2]$
注: hadoop fs 是 dfs 的父类,两个都差不多。
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs
[-appendToFile
... ]
[-cat [-ignoreCrc]...]
[-checksum...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R]PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p]... ]
[-copyToLocal [-p] [-ignoreCrc] [-crc]... ]
[-count [-q]...]
[-cp [-f] [-p]... ]
[-createSnapshot[ ]]
[-deleteSnapshot]
[-df [-h] [...]]
[-du [-s] [-h]...]
[-expunge]
[-get [-p] [-ignoreCrc] [-crc]... ]
[-getfacl [-R]]
[-getmerge [-nl]]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [...]]
[-mkdir [-p]...]
[-moveFromLocal... ]
[-moveToLocal]
[-mv... ]
[-put [-f] [-p]... ]
[-renameSnapshot]
[-rm [-f] [-r|-R] [-skipTrash]...]
[-rmdir [--ignore-fail-on-non-empty]...]
[-setfacl [-R] [{-b|-k} {-m|-x} ]|[--set ]]
[-setrep [-R] [-w]...]
[-stat [format]...]
[-tail [-f]]
[-test -[defsz]]
[-text [-ignoreCrc]...]
[-touchz...]
[-usage [cmd ...]]
(0)启动Hadoop集群(方便后续的测试)
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
(1)-help:输出这个命令参数
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -help rm
(2)-ls: 显示目录信息
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -ls /
(3)-mkdir:在HDFS上创建目录
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir -p /sanguo/shuguo
(4)-moveFromLocal:从本地剪切粘贴到HDFS
[atguigu@hadoop102 hadoop-2.7.2]$ touch kongming.txt
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -moveFromLocal ./kongming.txt /sanguo/shuguo
(5)-appendToFile:追加一个文件到已经存在的文件末尾
[atguigu@hadoop102 hadoop-2.7.2]$ touch liubei.txt
[atguigu@hadoop102 hadoop-2.7.2]$ vi liubei.txt
输入
san gu mao lu
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
(6)-cat:显示文件内容
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -cat /sanguo/shuguo/kongming.txt
(7)-chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -chmod 666 /sanguo/shuguo/kongming.txt
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -chown atguigu:atguigu /sanguo/shuguo/kongming.txt
(8)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -copyFromLocal README.txt /
(9)-copyToLocal:从HDFS拷贝到本地
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -copyToLocal /sanguo/shuguo/kongming.txt ./
(10)-cp :从HDFS的一个路径拷贝到HDFS的另一个路径
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -cp /sanguo/shuguo/kongming.txt /zhuge.txt
(11)-mv:在HDFS目录中移动文件
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -mv /zhuge.txt /sanguo/shuguo/
(12)-get:等同于copyToLocal,就是从HDFS下载文件到本地
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -get /sanguo/shuguo/kongming.txt ./
(13)-getmerge:合并下载多个文件,比如HDFS的目录 /user/atguigu/test下有多个文件:log.1, log.2,log.3,...
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -getmerge /user/atguigu/test/* ./zaiyiqi.txt
(14)-put:等同于copyFromLocal
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -put ./zaiyiqi.txt /user/atguigu/test/
(15)-tail:显示一个文件的末尾
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -tail /sanguo/shuguo/kongming.txt
(16)-rm:删除文件或文件夹
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -rm /user/atguigu/test/jinlian2.txt
删除目录:
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -rm -R /user/atguigu/test
不进入回收站(配置过回收站)直接删除
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -rm -r -skipTrash /user/atguigu/test
(17)-rmdir:删除空目录
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir /test
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -rmdir /test
(18)-du统计文件夹的大小信息
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -du -s -h /user/atguigu/test
2.7 K /user/atguigu/test[atguigu@hadoop102 hadoop-2.7.2]$ 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
(19)-setrep:设置HDFS中文件的副本数量
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt
注:这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。
1.根据自己电脑的操作系统拷贝对应的编译后的hadoop jar包到非中文路径(例如:D:\Develop\hadoop-2.7.2)。
2.配置HADOOP_HOME环境变量。HADOOP_HOME=安装路径
3. 配置Path环境变量。%HADOOP_HOME%\bin
4.创建一个Maven工程HdfsClientDemo
注:只需要填写前面两个即可。
5.导入相应的依赖坐标+日志添加
junit
junit
RELEASE
org.apache.logging.log4j
log4j-core
2.8.2
org.apache.hadoop
hadoop-common
2.7.2
org.apache.hadoop
hadoop-client
2.7.2
org.apache.hadoop
hadoop-hdfs
2.7.2
jdk.tools
jdk.tools
1.8
system
${JAVA_HOME}/lib/tools.jar
注意:如果Eclipse/Idea打印不出日志,在控制台上只显示
1.log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
2.log4j:WARN Please initialize the log4j system properly.
3.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
需要在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”,在文件中填入
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
6.创建包名:com.atguigu.hdfs
7.创建HdfsClient类
public class HdfsClient{
@Test
public void testMkdirs() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
// 配置在集群上运行
configuration.set("fs.defaultFS", "hdfs://hadoop102:9000");
FileSystem fs = FileSystem.get(configuration);
//FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 创建目录
fs.mkdirs(new Path("/1108/daxian/banzhang"));
// 3 关闭资源
fs.close();
}
}
8.执行程序
运行时需要配置用户名称
客户端去操作HDFS时,是有一个用户身份的。默认情况下,HDFS客户端API会从JVM中获取一个参数来作为自己的用户身份:-DHADOOP_USER_NAME=atguigu,atguigu为用户名称。
/**
* 这样运行的时候需要通过配置方式来启动
* -DHADOOP_USER_NAME=atguigu
* 不然会报错
* org.apache.hadoop.security.AccessControlException: Permission denied: user=yuanyu, access=WRITE, inode="/0528/dashen/banzhang":atguigu:supergroup:drwxr-xr-x
* at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:319)
* at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:292)
* at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:213)
* @throws IOException
* @throws InterruptedException
* @throws URISyntaxException
*/
@Test
public void test() throws IOException, InterruptedException, URISyntaxException {
//System.setProperty("hadoop.home.dir", "D:/programming software/hadoop-2.7.2");
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://hadoop102:9000");
//1、获取 hdfs 客户端对象
FileSystem fs = FileSystem.get(conf);
//2、在 hdfs 上创建路径
fs.mkdirs(new Path("/0529/dashen/banzhang"));
//3、关闭资源
fs.close();
System.out.println("HDFSClient.test2()");
}
//运行项目不需要添加配置信息,直接点击运行即可
@Test
public void test2() throws IOException, InterruptedException, URISyntaxException {
//System.setProperty("hadoop.home.dir", "D:/programming software/hadoop-2.7.2");//配置了 HADDOOP_HOME 后可以不用这句话
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "atguigu");//指定 创建文件的用户名
//2、在 hdfs 上创建路径
fs.mkdirs(new Path("/0529/dashen/banzhang"));
//3、关闭资源
fs.close();
System.out.println("HDFSClient.test()");
}
1.编写源代码
@Test
public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {
// 1 获取文件系统
Configuration configuration = new Configuration();
configuration.set("dfs.replication", "2");
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 上传文件
fs.copyFromLocalFile(new Path("e:/banzhang.txt"), new Path("/banzhang.txt"));
// 3 关闭资源
fs.close();
System.out.println("over");
}
2.将 hdfs-site.xml 拷贝到resources目录下
dfs.replication
1
3.参数优先级
参数优先级排序:(1)客户端代码中设置的值 >(2)ClassPath下的用户自定义配置文件 >(3)然后是服务器的默认配置
@Test
public void testCopyToLocalFile() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 执行下载操作
// boolean delSrc 指是否将原文件删除
// Path src 指要下载的文件路径
// Path dst 指将文件下载到的路径
// boolean useRawLocalFileSystem 是否开启文件校验
fs.copyToLocalFile(false, new Path("/banzhang.txt"), new Path("e:/banhua.txt"), true);
// 3 关闭资源
fs.close();
}
@Test
public void testDelete() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 执行删除
fs.delete(new Path("/0508/"), true);
// 3 关闭资源
fs.close();
}
@Test
public void testRename() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 修改文件名称
fs.rename(new Path("/banzhang.txt"), new Path("/banhua.txt"));
// 3 关闭资源
fs.close();
}
查看文件名称、权限、长度、块信息
@Test
public void testListFiles() throws IOException, InterruptedException, URISyntaxException{
// 1获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 获取文件详情
RemoteIterator listFiles = fs.listFiles(new Path("/"), true);
while(listFiles.hasNext()){
LocatedFileStatus status = listFiles.next();
// 输出详情
// 文件名称
System.out.println("文件名称: "+status.getPath().getName());
// 路径
System.out.println("路径: "+status.getPath());
// 长度
System.out.println("长度: "+status.getLen());
// 权限
System.out.println("权限: "+status.getPermission());
// 分组
System.out.println("分组: "+status.getGroup());
// 获取存储的块信息
BlockLocation[] blockLocations = status.getBlockLocations();
for (BlockLocation blockLocation : blockLocations) {
// 获取块存储的主机节点
String[] hosts = blockLocation.getHosts();
for (String host : hosts) {
System.out.println("存储的主机节点: "+host);
}
}
System.out.println("-----------班长的分割线----------");
}
// 3 关闭资源
fs.close();
}
@Test
public void testListStatus() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件配置信息
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 判断是文件还是文件夹
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : listStatus) {
// 如果是文件
if (fileStatus.isFile()) {
System.out.println("f:"+fileStatus.getPath().getName());
}else {
System.out.println("d:"+fileStatus.getPath().getName());
}
}
// 3 关闭资源
fs.close();
}
上面我们学的API操作HDFS系统都是框架封装好的。那么如果我们想自己实现上述API的操作该怎么实现呢?
我们可以采用IO流的方式实现数据的上传和下载。
1.需求:把本地e盘上的banhua.txt文件上传到HDFS根目录
2.编写代码
@Test
public void putFileToHDFS() throws IOException, InterruptedException, URISyntaxException {
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 创建输入流
FileInputStream fis = new FileInputStream(new File("e:/banhua.txt"));
// 3 获取输出流
FSDataOutputStream fos = fs.create(new Path("/banhua.txt"));
// 4 流对拷
IOUtils.copyBytes(fis, fos, configuration);
// 5 关闭资源
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
fs.close();
}
1.需求:从HDFS上下载banhua.txt文件到本地e盘上
2.编写代码
// 文件下载
@Test
public void getFileFromHDFS() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 获取输入流
FSDataInputStream fis = fs.open(new Path("/banhua.txt"));
// 3 获取输出流
FileOutputStream fos = new FileOutputStream(new File("e:/banhua.txt"));
// 4 流的对拷
IOUtils.copyBytes(fis, fos, configuration);
// 5 关闭资源
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
fs.close();
}
1.需求:分块读取HDFS上的大文件,比如根目录下的/hadoop-2.7.2.tar.gz
2.编写代码
(1)下载第一块
@Test
public void readFileSeek1() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 获取输入流
FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));
// 3 创建输出流
FileOutputStream fos = new FileOutputStream(new File("e:/hadoop-2.7.2.tar.gz.part1"));
// 4 流的拷贝
byte[] buf = new byte[1024];
for(int i =0 ; i < 1024 * 128; i++){
fis.read(buf);
fos.write(buf);
}
// 5关闭资源
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
fs.close();
}
(2)下载第二块
@Test
public void readFileSeek2() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), configuration, "atguigu");
// 2 打开输入流
FSDataInputStream fis = fs.open(new Path("/hadoop-2.7.2.tar.gz"));
// 3 定位输入数据位置
fis.seek(1024*1024*128);
// 4 创建输出流
FileOutputStream fos = new FileOutputStream(new File("e:/hadoop-2.7.2.tar.gz.part2"));
// 5 流的对拷
IOUtils.copyBytes(fis, fos, configuration);
// 6 关闭资源
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
}
(3)合并文件
在Window命令窗口中进入到目录E:\,然后执行如下命令,对数据进行合并
type hadoop-2.7.2.tar.gz.part2 >> hadoop-2.7.2.tar.gz.part1
前后比对 hadoop-2.7.2.tar.gz.part1 文件的大小,合并完成后,将hadoop-2.7.2.tar.gz.part1重新命名为hadoop-2.7.2.tar.gz。解压发现该tar包非常完整。
HDFS写数据流程:
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为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8)当一个 Block 传输完成之后,客户端再次请求 NameNode上传第二个Block的服务器。(重复执行3-7步)。
在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。那么这个最近距离怎么计算呢?
节点距离:两个节点到达最近的共同祖先的距离总和。
例如,假设有数据中心 d1 机架 r1 中的节点 n1。该节点可以表示为 /d1/r1/n1 。利用这种标记,这里给出四种距离描述,如下图所示。
大家算一算每两个节点之间的距离,如图3-10所示。
1. 官方ip地址
机架感知说明
http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication
For the common case, when the replication factor is three, HDFS’s placement policy is to put one replica on one node in the local rack, another on a different node in the local rack, and the last on a different node in a different rack.
2. Hadoop2.7.2副本节点选择
解释:首先第一个考虑的问题是 IO 传输的距离最短,为了快速的备份。另一个考虑的问题是安全性,如何前面那个机架崩了,我另一个机架上还有一个。首先考虑速度,其次考虑安全。
老版本:IO 传输高速度慢,但是可靠性更高。
HDFS的读数据流程,如图3-13所示。
1)客户端通过 Distributed FileSystem向NameNode 请求下载文件,NameNode 通过查询元数据,找到文件块所在的 DataNode地址。
2)挑选一台 DataNode(就近原则,然后随机)服务器,请求读取数据。
3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
思考:NameNode中的元数据是存储在哪里的?
首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的 FsImage(镜像文件)。
这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新 FsImage ,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入 Edits 文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦 NameNode 节点断电,可以通过 FsImage 和 Edits的合并,合成元数据。(内存中的内容=FsImage +Edits)
但是,如果长时间添加数据到 Edits 中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行 FsImage 和 Edits 的合并,如果这个操作由 NameNode 节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于 FsImage 和 Edits 的合并。
NN和2NN工作机制,如图3-14所示。
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。
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. 概念
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs
Usage: hdfs [--config confdir] [--loglevel loglevel] COMMAND
where COMMAND is one of:
dfs run a filesystem command on the file systems supported in Hadoop.
classpath prints the classpath
namenode -format format the DFS filesystem
secondarynamenode run the DFS secondary namenode
namenode run the DFS namenode
journalnode run the DFS journalnode
zkfc run the ZK Failover Controller daemon
datanode run a DFS datanode
dfsadmin run a DFS admin client
haadmin run a DFS HA admin client
fsck run a DFS filesystem checking utility
balancer run a cluster balancing utility
jmxget get JMX exported values from NameNode or DataNode.
mover run a utility to move block replicas across
storage types
oiv apply the offline fsimage viewer to an fsimage
oiv_legacy apply the offline fsimage viewer to an legacy fsimage
oev apply the offline edits viewer to an edits file
fetchdt fetch a delegation token from the NameNode
getconf get config values from configuration
groups get the groups which users belong to
snapshotDiff diff two snapshots of a directory or diff the
current directory contents with a snapshot
lsSnapshottableDir list all snapshottable dirs owned by the current user
Use -help to see options
portmap run a portmap service
nfs3 run an NFS version 3 gateway
cacheadmin configure the HDFS cache
crypto configure HDFS encryption zones
storagepolicies list/get/set block storage policies
version print the version
Most commands print help when invoked w/o parameters.
[atguigu@hadoop102 hadoop-2.7.2]$
2. 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)案例实操
NameNode:
[atguigu@hadoop102 current]$ jps
2580 DataNode
3268 Jps
2917 NodeManager
2463 NameNode
[atguigu@hadoop102 hadoop-2.7.2]$ tree data/
data/
└── tmp
├── dfs
│ ├── data
│ │ ├── current
│ │ │ ├── BP-132169342-192.168.19.102-1548944709783
│ │ │ │ ├── current
│ │ │ │ │ ├── dfsUsed
│ │ │ │ │ ├── finalized
│ │ │ │ │ │ └── subdir0
│ │ │ │ │ │ └── subdir0
│ │ │ │ │ │ ├── blk_1073741825
│ │ │ │ │ │ ├── blk_1073741825_1001.meta
│ │ │ │ │ │ ├── blk_1073741826
│ │ │ │ │ │ ├── blk_1073741826_1002.meta
│ │ │ │ │ │ ├── blk_1073741827
│ │ │ │ │ │ ├── blk_1073741827_1003.meta
│ │ │ │ │ │ ├── blk_1073741829
│ │ │ │ │ │ ├── blk_1073741829_1005.meta
│ │ │ │ │ │ ├── blk_1073741830
│ │ │ │ │ │ ├── blk_1073741830_1006.meta
│ │ │ │ │ │ ├── blk_1073741832
│ │ │ │ │ │ ├── blk_1073741832_1008.meta
│ │ │ │ │ │ ├── blk_1073741833
│ │ │ │ │ │ ├── blk_1073741833_1009.meta
│ │ │ │ │ │ ├── blk_1073741836
│ │ │ │ │ │ └── blk_1073741836_1012.meta
│ │ │ │ │ ├── rbw
│ │ │ │ │ └── VERSION
│ │ │ │ ├── scanner.cursor
│ │ │ │ └── tmp
│ │ │ └── VERSION
│ │ └── in_use.lock
│ └── name
│ ├── current
│ │ ├── edits_0000000000000000001-0000000000000000020
│ │ ├── edits_0000000000000000021-0000000000000000021
│ │ ├── edits_0000000000000000022-0000000000000000032
│ │ ├── edits_0000000000000000033-0000000000000000069
│ │ ├── edits_0000000000000000070-0000000000000000070
│ │ ├── edits_0000000000000000071-0000000000000000086
│ │ ├── edits_0000000000000000087-0000000000000000092
│ │ ├── edits_0000000000000000093-0000000000000000095
│ │ ├── edits_0000000000000000096-0000000000000000097
│ │ ├── edits_inprogress_0000000000000000098
│ │ ├── fsimage_0000000000000000095
│ │ ├── fsimage_0000000000000000095.md5
│ │ ├── fsimage_0000000000000000097
│ │ ├── fsimage_0000000000000000097.md5
│ │ ├── seen_txid
│ │ └── VERSION
│ └── in_use.lock
└── nm-local-dir
├── filecache
├── nmPrivate
└── usercache17 directories, 38 files
[atguigu@hadoop102 current]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current//SecondaryNameNode 没有 edits_inprogress_0000000000000000098
----------------------------------------------------------------------------------------------------------------------------
SecondaryNameNode:
[atguigu@hadoop104 current]$ jps
2324 DataNode
3229 Jps
2415 SecondaryNameNode
2559 NodeManager[atguigu@hadoop104 hadoop-2.7.2]$ cd data/tmp/dfs/namesecondary/current/
[atguigu@hadoop104 current]$ ll
总用量 44
-rw-rw-r-- 1 atguigu atguigu 1647 1月 31 23:22 edits_0000000000000000001-0000000000000000020
-rw-rw-r-- 1 atguigu atguigu 705 2月 1 06:33 edits_0000000000000000022-0000000000000000032
-rw-rw-r-- 1 atguigu atguigu 2862 2月 1 07:33 edits_0000000000000000033-0000000000000000069
-rw-rw-r-- 1 atguigu atguigu 1051 2月 2 06:26 edits_0000000000000000071-0000000000000000086
-rw-rw-r-- 1 atguigu atguigu 110 2月 3 00:35 edits_0000000000000000093-0000000000000000095
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 01:36 edits_0000000000000000096-0000000000000000097
-rw-rw-r-- 1 atguigu atguigu 1151 2月 3 00:35 fsimage_0000000000000000095
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 00:35 fsimage_0000000000000000095.md5
-rw-rw-r-- 1 atguigu atguigu 1151 2月 3 01:36 fsimage_0000000000000000097
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 01:36 fsimage_0000000000000000097.md5
-rw-rw-r-- 1 atguigu atguigu 206 2月 3 01:36 VERSION
NameNode:
[atguigu@hadoop102 current]$ ll
总用量 4148
-rw-rw-r-- 1 atguigu atguigu 1647 1月 31 23:21 edits_0000000000000000001-0000000000000000020
-rw-rw-r-- 1 atguigu atguigu 1048576 1月 31 23:21 edits_0000000000000000021-0000000000000000021
-rw-rw-r-- 1 atguigu atguigu 705 2月 1 06:33 edits_0000000000000000022-0000000000000000032
-rw-rw-r-- 1 atguigu atguigu 2862 2月 1 07:33 edits_0000000000000000033-0000000000000000069
-rw-rw-r-- 1 atguigu atguigu 1048576 2月 1 07:33 edits_0000000000000000070-0000000000000000070
-rw-rw-r-- 1 atguigu atguigu 1051 2月 2 06:26 edits_0000000000000000071-0000000000000000086
-rw-rw-r-- 1 atguigu atguigu 1048576 2月 2 06:37 edits_0000000000000000087-0000000000000000092
-rw-rw-r-- 1 atguigu atguigu 110 2月 3 00:35 edits_0000000000000000093-0000000000000000095
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 01:36 edits_0000000000000000096-0000000000000000097
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 02:36 edits_0000000000000000098-0000000000000000099
-rw-rw-r-- 1 atguigu atguigu 1048576 2月 3 02:36 edits_inprogress_0000000000000000100
-rw-rw-r-- 1 atguigu atguigu 1151 2月 3 01:36 fsimage_0000000000000000097
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 01:36 fsimage_0000000000000000097.md5
-rw-rw-r-- 1 atguigu atguigu 1151 2月 3 02:36 fsimage_0000000000000000099
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 02:36 fsimage_0000000000000000099.md5
-rw-rw-r-- 1 atguigu atguigu 4 2月 3 02:36 seen_txid
-rw-rw-r-- 1 atguigu atguigu 206 2月 2 23:41 VERSION
[atguigu@hadoop102 current]$ cat seen_txid
100
-----------------------------------------------------------------------------------------------------------------------------------------
SecondaryNameNode:
[atguigu@hadoop104 current]$ ll
总用量 44
-rw-rw-r-- 1 atguigu atguigu 1647 1月 31 23:22 edits_0000000000000000001-0000000000000000020
-rw-rw-r-- 1 atguigu atguigu 705 2月 1 06:33 edits_0000000000000000022-0000000000000000032
-rw-rw-r-- 1 atguigu atguigu 2862 2月 1 07:33 edits_0000000000000000033-0000000000000000069
-rw-rw-r-- 1 atguigu atguigu 1051 2月 2 06:26 edits_0000000000000000071-0000000000000000086
-rw-rw-r-- 1 atguigu atguigu 110 2月 3 00:35 edits_0000000000000000093-0000000000000000095
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 01:36 edits_0000000000000000096-0000000000000000097
-rw-rw-r-- 1 atguigu atguigu 1151 2月 3 00:35 fsimage_0000000000000000095
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 00:35 fsimage_0000000000000000095.md5
-rw-rw-r-- 1 atguigu atguigu 1151 2月 3 01:36 fsimage_0000000000000000097
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 01:36 fsimage_0000000000000000097.md5
-rw-rw-r-- 1 atguigu atguigu 206 2月 3 01:36 VERSION
[atguigu@hadoop104 current]$
[atguigu@hadoop102 current]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current[atguigu@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml
[atguigu@hadoop102 current]$ cat /opt/module/hadoop-2.7.2/fsimage.xml
将显示的xml文件内容拷贝到Eclipse中创建的xml文件中,并格式化。部分显示结果如下。
16386
DIRECTORY
user
1512722284477
atguigu:supergroup:rwxr-xr-x
-1
-1
16387
DIRECTORY
atguigu
1512790549080
atguigu:supergroup:rwxr-xr-x
-1
-1
16389
FILE
wc.input
3
1512722322219
1512722321610
134217728
atguigu:supergroup:rw-r--r--
1073741825
1001
59
思考:可以看出,Fsimage中没有记录块所对应DataNode,为什么?
在集群启动后,要求DataNode上报数据块信息,并间隔一段时间后再次上报。
3. oev查看Edits文件
(1)基本语法
hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
(2)案例实操
[atguigu@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
[atguigu@hadoop102 current]$ cat /opt/module/hadoop-2.7.2/edits.xml
将显示的xml文件内容拷贝到Eclipse中创建的xml文件中,并格式化。显示结果如下。
-63
OP_START_LOG_SEGMENT
129
OP_ADD
130
0
16407
/hello7.txt
2
1512943607866
1512943607866
134217728
DFSClient_NONMAPREDUCE_-1544295051_1
192.168.1.5
true
atguigu
supergroup
420
908eafd4-9aec-4288-96f1-e8011d181561
0
OP_ALLOCATE_BLOCK_ID
131
1073741839
OP_SET_GENSTAMP_V2
132
1016
OP_ADD_BLOCK
133
/hello7.txt
1073741839
0
1016
-2
OP_CLOSE
134
0
0
/hello7.txt
2
1512943608761
1512943607866
134217728
false
1073741839
25
1016
atguigu
supergroup
420
思考:NameNode如何确定下次开机启动的时候合并哪些Edits?
seen_txid 记录了最新的 Edits,当前哪一个是最新的。以前合并的它就不在加载了。
演示:格式化集群后,创建一个目录 /user/atguigu/input 上传文件 xiaopan.txt 到 /user/atguigu/input 目录中
1、停止 NameNode 和 DataNode,使用 jps 确认成功
2、删除 data 和 logs rm -rf data/ logs/ ,注意每个节点都要去执行
3、格式化 NameNode
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format
4、格式化之后这个时候还没有 DataNode,还没有编辑日志,只有一个空的 fs 镜像文件
[atguigu@hadoop102 hadoop-2.7.2]$ tree data/
data/
└── tmp
└── dfs
└── name
└── current
├── fsimage_0000000000000000000
├── fsimage_0000000000000000000.md5
├── seen_txid
└── VERSION4 directories, 4 files
5、启动 hdfs
[atguigu@hadoop102 ~]$ cd /opt/module/hadoop-2.7.2/
[atguigu@hadoop102 hadoop-2.7.2]$ jps
5758 Jps
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh................省略................
[atguigu@hadoop102 hadoop-2.7.2]$ jps
6032 DataNode
5894 NameNode
6271 Jps
6、查看
[atguigu@hadoop102 hadoop-2.7.2]$ tree data/
data/
└── tmp
└── dfs
├── data
│ ├── current
│ │ ├── BP-265186074-192.168.19.102-1549143814464
│ │ │ ├── current
│ │ │ │ ├── finalized
│ │ │ │ ├── rbw
│ │ │ │ └── VERSION
│ │ │ ├── scanner.cursor
│ │ │ └── tmp
│ │ └── VERSION
│ └── in_use.lock
└── name
├── current
│ ├── edits_0000000000000000001-0000000000000000002
│ ├── edits_inprogress_0000000000000000003
│ ├── fsimage_0000000000000000000
│ ├── fsimage_0000000000000000000.md5
│ ├── fsimage_0000000000000000002
│ ├── fsimage_0000000000000000002.md5
│ ├── seen_txid
│ └── VERSION
└── in_use.lock11 directories, 13 files
7、创建目录 /user/atguigu/input 上传文件 xiaopan.txt 到 /user/atguigu/input 目录中
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir -p /user/atguigu/input
[atguigu@hadoop102 hadoop-2.7.2]$ ls
bin etc input libexec logs output sbin wcinput
data include lib LICENSE.txt NOTICE.txt README.txt share xiaopan.txt
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -put xiaopan.txt /user/atguigu/input
[atguigu@hadoop102 hadoop-2.7.2]$
8、网页查看 http://hadoop102:50070/explorer.html#/user/atguigu/input
9、查看镜像文件中的内容
[atguigu@hadoop102 hadoop-2.7.2]$ cd data/tmp/dfs/name/current/
[atguigu@hadoop102 current]$ ll
总用量 1052
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 05:52 edits_0000000000000000001-0000000000000000002
-rw-rw-r-- 1 atguigu atguigu 1048576 2月 3 05:58 edits_inprogress_0000000000000000003
-rw-rw-r-- 1 atguigu atguigu 354 2月 3 05:43 fsimage_0000000000000000000
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 05:43 fsimage_0000000000000000000.md5
-rw-rw-r-- 1 atguigu atguigu 354 2月 3 05:52 fsimage_0000000000000000002
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 05:52 fsimage_0000000000000000002.md5
-rw-rw-r-- 1 atguigu atguigu 2 2月 3 05:52 seen_txid
-rw-rw-r-- 1 atguigu atguigu 205 2月 3 05:43 VERSION
hdfs oiv -p XML fsimage_0000000000000000002 -i fsimage_0000000000000000002 -o fs.xml[atguigu@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000000 -o fs.xml
[atguigu@hadoop102 current]$ cat fs.xml
1000 1000 0 1073741824 0
16385 16385 DIRECTORY 0 atguigu:supergroup:rwxr-xr-x 9223372036854775807 -1
0
16385
0 0 1
[atguigu@hadoop102 current]$ rm -rf fs.xml
[atguigu@hadoop102 current]$
[atguigu@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000002 -o fs.xml
[atguigu@hadoop102 current]$ ll
总用量 1056
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 05:52 edits_0000000000000000001-0000000000000000002
-rw-rw-r-- 1 atguigu atguigu 1048576 2月 3 05:58 edits_inprogress_0000000000000000003
-rw-rw-r-- 1 atguigu atguigu 354 2月 3 05:43 fsimage_0000000000000000000
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 05:43 fsimage_0000000000000000000.md5
-rw-rw-r-- 1 atguigu atguigu 354 2月 3 05:52 fsimage_0000000000000000002
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 05:52 fsimage_0000000000000000002.md5
-rw-rw-r-- 1 atguigu atguigu 992 2月 3 06:06 fs.xml
-rw-rw-r-- 1 atguigu atguigu 2 2月 3 05:52 seen_txid
-rw-rw-r-- 1 atguigu atguigu 205 2月 3 05:43 VERSION
[atguigu@hadoop102 current]$ cat fs.xml
1000 1000 0 1073741824 2
16385 16385 DIRECTORY 0 atguigu:supergroup:rwxr-xr-x 9223372036854775807 -1
0
16385
0 0 1
10、复制上面的 xml 文件,用 eclipse 打开后格式化即可
1000
1000
0
1073741824
0
16385
16385
DIRECTORY
0
atguigu:supergroup:rwxr-xr-x
9223372036854775807
-1
0
16385
0
0
1
1000
1000
0
1073741824
2
16385
16385
DIRECTORY
0
atguigu:supergroup:rwxr-xr-x
9223372036854775807
-1
0
16385
0
0
1
我创建了目录,上传了文件,查看文件我们发现里面什么都没有,说明只在内存中修改了还没有合并Fsimage。
11、查看编辑日志
[atguigu@hadoop102 current]$ ll
总用量 1052
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 05:52 edits_0000000000000000001-0000000000000000002
-rw-rw-r-- 1 atguigu atguigu 1048576 2月 3 05:58 edits_inprogress_0000000000000000003
-rw-rw-r-- 1 atguigu atguigu 354 2月 3 05:43 fsimage_0000000000000000000
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 05:43 fsimage_0000000000000000000.md5
-rw-rw-r-- 1 atguigu atguigu 354 2月 3 05:52 fsimage_0000000000000000002
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 05:52 fsimage_0000000000000000002.md5
-rw-rw-r-- 1 atguigu atguigu 2 2月 3 05:52 seen_txid
-rw-rw-r-- 1 atguigu atguigu 205 2月 3 05:43 VERSION
[atguigu@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000001-0000000000000000002 -o ed.xml
[atguigu@hadoop102 current]$ cat ed.xml
-63
OP_START_LOG_SEGMENT
1
OP_END_LOG_SEGMENT
2
[atguigu@hadoop102 current]$ hdfs oev -p XML -i edits_inprogress_0000000000000000003 -o ed2.xml
[atguigu@hadoop102 current]$ cat ed2.xml
-63
OP_START_LOG_SEGMENT
3
OP_MKDIR
4
0
16386
/user
1549144684817
atguigu
supergroup
493
OP_MKDIR
5
0
16387
/user/atguigu
1549144684827
atguigu
supergroup
493
OP_MKDIR
6
0
16388
/user/atguigu/input
1549144684827
atguigu
supergroup
493
OP_ADD
7
0
16389
/user/atguigu/input/xiaopan.txt._COPYING_
3
1549144736207
1549144736207
134217728
DFSClient_NONMAPREDUCE_872970592_1
192.168.19.102
true
atguigu
supergroup
420
ce5a449a-ae85-43c4-aeaf-980dbec2d6a1
3
OP_ALLOCATE_BLOCK_ID
8
1073741825
OP_SET_GENSTAMP_V2
9
1001
OP_ADD_BLOCK
10
/user/atguigu/input/xiaopan.txt._COPYING_
1073741825
0
1001
-2
OP_CLOSE
11
0
0
/user/atguigu/input/xiaopan.txt._COPYING_
3
1549144738833
1549144736207
134217728
false
1073741825
15
1001
atguigu
supergroup
420
OP_RENAME_OLD
12
0
/user/atguigu/input/xiaopan.txt._COPYING_
/user/atguigu/input/xiaopan.txt
1549144738842
ce5a449a-ae85-43c4-aeaf-980dbec2d6a1
9
[atguigu@hadoop102 current]$
-63
OP_START_LOG_SEGMENT
3
OP_MKDIR
4
0
16386
/user
1549144684817
atguigu
supergroup
493
OP_MKDIR
5
0
16387
/user/atguigu
1549144684827
atguigu
supergroup
493
OP_MKDIR
6
0
16388
/user/atguigu/input
1549144684827
atguigu
supergroup
493
OP_ADD
7
0
16389
/user/atguigu/input/xiaopan.txt._COPYING_
3
1549144736207
1549144736207
134217728
DFSClient_NONMAPREDUCE_872970592_1
192.168.19.102
true
atguigu
supergroup
420
ce5a449a-ae85-43c4-aeaf-980dbec2d6a1
3
OP_ALLOCATE_BLOCK_ID
8
1073741825
OP_SET_GENSTAMP_V2
9
1001
OP_ADD_BLOCK
10
/user/atguigu/input/xiaopan.txt._COPYING_
1073741825
0
1001
-2
OP_CLOSE
11
0
0
/user/atguigu/input/xiaopan.txt._COPYING_
3
1549144738833
1549144736207
134217728
false
1073741825
15
1001
atguigu
supergroup
420
OP_RENAME_OLD
12
0
/user/atguigu/input/xiaopan.txt._COPYING_
/user/atguigu/input/xiaopan.txt
1549144738842
ce5a449a-ae85-43c4-aeaf-980dbec2d6a1
9
(1)通常情况下,SecondaryNameNode每隔一小时执行一次。
[hdfs-default.xml]
dfs.namenode.checkpoint.period
3600
(2)一分钟检(默认)查一次操作次数,3当操作次数达到1百万次(默认),SecondaryNameNode 执行一次。
dfs.namenode.checkpoint.txns
1000000
操作动作次数
dfs.namenode.checkpoint.check.period
60
1分钟检查一次操作次数
注释:如何检查达到1百万次,通过时刻的去查看,通过设置 dfs.namenode.checkpoint.check.period 设置多长时间去检查一次。
需要自定义在 hdfs-site.xml 配置即可
NameNode故障后,可以采用如下两种方法恢复数据。
方法一:将SecondaryNameNode中数据拷贝到 NameNode 存储数据的目录;
NameNode 和 SecondaryNameNode 几乎一致,只是 NameNode 多了一个edits_inprogress_*
[atguigu@hadoop102 hadoop-2.7.2]$ cd data/tmp/dfs/name/current/
[atguigu@hadoop102 current]$ ll
总用量 1060
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 07:40 edits_0000000000000000001-0000000000000000002
-rw-rw-r-- 1 atguigu atguigu 881 2月 3 07:40 edits_0000000000000000003-0000000000000000013
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 07:53 edits_0000000000000000014-0000000000000000015
-rw-rw-r-- 1 atguigu atguigu 1048576 2月 3 07:53 edits_inprogress_0000000000000000016
-rw-rw-r-- 1 atguigu atguigu 638 2月 3 07:40 fsimage_0000000000000000013
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 07:40 fsimage_0000000000000000013.md5
-rw-rw-r-- 1 atguigu atguigu 638 2月 3 07:53 fsimage_0000000000000000015
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 07:53 fsimage_0000000000000000015.md5
-rw-rw-r-- 1 atguigu atguigu 3 2月 3 07:53 seen_txid
-rw-rw-r-- 1 atguigu atguigu 205 2月 3 07:40 VERSION
-------------------------------------分割线--------------------------------------
[atguigu@hadoop104 current]$ cd /opt/module/hadoop-2.7.2/
[atguigu@hadoop104 hadoop-2.7.2]$ cd data/tmp/dfs/namesecondary/current/
[atguigu@hadoop104 current]$ ll
总用量 32
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 05:52 edits_0000000000000000001-0000000000000000002
-rw-rw-r-- 1 atguigu atguigu 881 2月 3 06:52 edits_0000000000000000003-0000000000000000013
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 07:53 edits_0000000000000000014-0000000000000000015
-rw-rw-r-- 1 atguigu atguigu 638 2月 3 06:52 fsimage_0000000000000000013
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 06:52 fsimage_0000000000000000013.md5
-rw-rw-r-- 1 atguigu atguigu 638 2月 3 07:53 fsimage_0000000000000000015
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 07:53 fsimage_0000000000000000015.md5
-rw-rw-r-- 1 atguigu atguigu 205 2月 3 07:53 VERSION
1. kill -9 NameNode进程号
[atguigu@hadoop102 current]$ jps
6032 DataNode
7106 Jps
5894 NameNode
6958 NodeManager
[atguigu@hadoop102 current]$ kill -9 5894
[atguigu@hadoop102 current]$ jps
6032 DataNode
5894 -- process information unavailable
7127 Jps
6958 NodeManager
2. 删除 NameNode 存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)
[atguigu@hadoop102 hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
3. 拷贝 SecondaryNameNode 中数据到原 NameNode 存储数据目录
[atguigu@hadoop104 hadoop-2.7.2]$ cd data/tmp/dfs/namesecondary/current/
[atguigu@hadoop104 current]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/current
[atguigu@hadoop104 current]$ ll
总用量 28
-rw-rw-r-- 1 atguigu atguigu 42 2月 3 05:52 edits_0000000000000000001-0000000000000000002
-rw-rw-r-- 1 atguigu atguigu 881 2月 3 06:52 edits_0000000000000000003-0000000000000000013
-rw-rw-r-- 1 atguigu atguigu 354 2月 3 05:52 fsimage_0000000000000000002
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 05:52 fsimage_0000000000000000002.md5
-rw-rw-r-- 1 atguigu atguigu 638 2月 3 06:52 fsimage_0000000000000000013
-rw-rw-r-- 1 atguigu atguigu 62 2月 3 06:52 fsimage_0000000000000000013.md5
-rw-rw-r-- 1 atguigu atguigu 205 2月 3 06:52 VERSION
[atguigu@hadoop102 dfs]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs
[atguigu@hadoop102 dfs]$ ll
总用量 8
drwx------ 3 atguigu atguigu 4096 2月 3 05:51 data
drwxrwxr-x 2 atguigu atguigu 4096 2月 3 07:37 name
[atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/
scp: /opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* : No such file or directory
[atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/
edits_0000000000000000001-0000000000000000002 100% 42 0.0KB/s 00:00
fsimage_0000000000000000002.md5 100% 62 0.1KB/s 00:00
fsimage_0000000000000000013 100% 638 0.6KB/s 00:00
fsimage_0000000000000000002 100% 354 0.4KB/s 00:00
fsimage_0000000000000000013.md5 100% 62 0.1KB/s 00:00
edits_0000000000000000003-0000000000000000013 100% 881 0.9KB/s 00:00
VERSION 100% 205 0.2KB/s 00:00
in_use.lock 100% 14 0.0KB/s 00:00
[atguigu@hadoop102 dfs]$ ll
总用量 8
drwx------ 3 atguigu atguigu 4096 2月 3 05:51 data
drwxrwxr-x 3 atguigu atguigu 4096 2月 3 07:40 name
[atguigu@hadoop102 dfs]$ tree name/
name/
├── current
│ ├── edits_0000000000000000001-0000000000000000002
│ ├── edits_0000000000000000003-0000000000000000013
│ ├── fsimage_0000000000000000002
│ ├── fsimage_0000000000000000002.md5
│ ├── fsimage_0000000000000000013
│ ├── fsimage_0000000000000000013.md5
│ └── VERSION
└── in_use.lock1 directory, 8 files
4. 重新启动 NameNode
[atguigu@hadoop102 dfs]$ cd /opt/module/hadoop-2.7.2/
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-namenode-hadoop102.out
[atguigu@hadoop102 hadoop-2.7.2]$ jps
6032 DataNode
7299 NameNode
7349 Jps
6958 NodeManager
前面无法访问的网站又可以访问了
方法二:使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中。
[atguigu@hadoop102 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[atguigu@hadoop102 hadoop]$ vi hdfs-site.xml
dfs.namenode.checkpoint.period
120
dfs.namenode.name.dir
/opt/module/hadoop-2.7.2/data/tmp/dfs/name
分发:
[atguigu@hadoop102 hadoop-2.7.2]$ pwd
/opt/module/hadoop-2.7.2
[atguigu@hadoop102 hadoop-2.7.2]$ xsync etc/hadoop/
2. kill -9 NameNode进程
[atguigu@hadoop102 hadoop-2.7.2]$ jps
6032 DataNode
7299 NameNode
7445 Jps
6958 NodeManager
[atguigu@hadoop102 hadoop-2.7.2]$ kill -9 7299
[atguigu@hadoop102 hadoop-2.7.2]$ jps
6032 DataNode
7465 Jps
6958 NodeManager
3. 删除NameNode存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)
[atguigu@hadoop102 hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
[atguigu@hadoop102 hadoop-2.7.2]$ ls data/tmp/dfs/name/
[atguigu@hadoop102 hadoop-2.7.2]$
4. 如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件
[atguigu@hadoop102 dfs]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs
[atguigu@hadoop102 dfs]$ ll
总用量 8
drwx------ 3 atguigu atguigu 4096 2月 3 05:51 data
drwxrwxr-x 2 atguigu atguigu 4096 2月 3 08:09 name
[atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary ./
....................................省略....................................
[atguigu@hadoop102 dfs]$ ll
总用量 12
drwx------ 3 atguigu atguigu 4096 2月 3 05:51 data
drwxrwxr-x 2 atguigu atguigu 4096 2月 3 08:09 name
drwxrwxr-x 3 atguigu atguigu 4096 2月 3 08:18 namesecondary[atguigu@hadoop102 dfs]$ cd namesecondary/
[atguigu@hadoop102 namesecondary]$ ll
总用量 8
drwxrwxr-x 2 atguigu atguigu 4096 2月 3 08:18 current
-rw-rw-r-- 1 atguigu atguigu 14 2月 3 08:18 in_use.lock
[atguigu@hadoop102 namesecondary]$ rm -rf in_use.lock
[atguigu@hadoop102 namesecondary]$ cd ..
[atguigu@hadoop102 dfs]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs
[atguigu@hadoop102 dfs]$ ls
data name namesecondary
5. 导入检查点数据(等待一会ctrl+c结束掉)
[atguigu@hadoop102 namesecondary]$ jps
6032 DataNode
7546 Jps
6958 NodeManager
[atguigu@hadoop102 namesecondary]$ cd /opt/module/hadoop-2.7.2/
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -importCheckpoint
6. 启动NameNode
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
[atguigu@hadoop102 hadoop-2.7.2]$ jps
6032 DataNode
7681 Jps
6958 NodeManager
1. 概述
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 (功能描述:等待安全模式状态)
3. 案例
模拟等待安全模式
(1)查看当前模式
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -safemode get
Safe mode is OFF
(2)先进入安全模式
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs dfsadmin -safemode enter
(3)创建并执行下面的脚本
在/opt/module/hadoop-2.7.2路径上,编辑一个脚本safemode.sh
[atguigu@hadoop102 hadoop-2.7.2]$ touch safemode.sh
[atguigu@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 /
[atguigu@hadoop102 hadoop-2.7.2]$ chmod 777 safemode.sh
[atguigu@hadoop102 hadoop-2.7.2]$ ./safemode.sh
(4)再打开一个窗口,执行
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs dfsadmin -safemode leave
(5)观察
(a)再观察上一个窗口
Safe mode is OFF
(b)HDFS集群上已经有上传的数据了。
1. NameNode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性
2. 具体配置如下
(1)在hdfs-site.xml文件中增加如下内容
dfs.namenode.name.dir
file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2
分发脚本:
[atguigu@hadoop102 hadoop-2.7.2]$ xsync etc/hadoop
(2)停止集群,删除data和logs中所有数据。
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/stop-dfs.sh
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/stop-yarn.sh
[atguigu@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/
[atguigu@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/
[atguigu@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/
(3)格式化集群并启动。
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode –format
[atguigu@hadoop102 hadoop-2.7.2]$ 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
注:这里只是保证了数据有两份,并不能 一个 NameNode 挂掉,马上启动另一个。
DataNode工作机制,如图3-15所示。
1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令,如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器。
思考:如果电脑磁盘里面存储的数据是控制高铁信号灯的红灯信号(1)和绿灯信号(0),但是存储该数据的磁盘坏了,一直显示是绿灯,是否很危险?同理DataNode节点上的数据损坏了,却没有发现,是否也很危险,那么如何解决呢?
如下是DataNode节点保证数据完整性的方法。
1)当DataNode读取Block的时候,它会计算CheckSum。
2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
3)Client读取其他DataNode上的Block。
4)DataNode在其文件创建后周期验证CheckSum,如图3-16所示。
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。
dfs.namenode.heartbeat.recheck-interval
300000
This time decides the interval to check for expired datanodes.
With this value and dfs.heartbeat.interval, the interval of
deciding the datanode is stale or not is also calculated.
The unit of this configuration is millisecond.
dfs.heartbeat.interval
3
Determines datanode heartbeat interval in seconds.
dfs.namenode.heartbeat.recheck-interval
300000
dfs.heartbeat.interval
3
0. 需求
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
1. 环境准备
(1)在hadoop104主机上再克隆一台hadoop105主机
(2)修改IP地址和主机名称
(3)删除原来HDFS文件系统留存的文件(/opt/module/hadoop-2.7.2/data和log)
(4)source一下配置文件
[atguigu@hadoop105 hadoop-2.7.2]$ source /etc/profile
2. 服役新节点具体步骤
(1)直接启动DataNode,即可关联到集群
[atguigu@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[atguigu@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
http://hadoop102:50070/dfshealth.html#tab-overview
(2)在hadoop105上上传文件
[atguigu@hadoop105 hadoop-2.7.2]$ hadoop fs -put /opt/module/hadoop-2.7.2/LICENSE.txt /
(3)如果数据不均衡,可以用命令实现集群的再平衡
[atguigu@hadoop102 sbin]$ pwd
/opt/module/hadoop-2.7.2/sbin[atguigu@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
添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被退出。
配置白名单的具体步骤如下:
(1)在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts文件
[atguigu@hadoop102 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[atguigu@hadoop102 hadoop]$ touch dfs.hosts
[atguigu@hadoop102 hadoop]$ vi dfs.hosts
添加如下主机名称(不添加hadoop105)!不允许空行空格
hadoop102
hadoop103
hadoop104
(2)在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性
dfs.hosts
/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts
(3)配置文件分发
[atguigu@hadoop102 hadoop]$ xsync hdfs-site.xml
(4)刷新NameNode
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
(5)更新ResourceManager节点
[atguigu@hadoop102 hadoop-2.7.2]$ yarn rmadmin -refreshNodes
17/06/24 14:17:11 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
(6)在web浏览器上查看
4. 如果数据不均衡,可以用命令实现集群的再平衡
[atguigu@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
退出了105后,上面的文件没有让103马上了替代105,命令实现集群的再平衡在会让103存储这个文件。
注释:白名单适用于刚刚搭建主机的时候,允许哪些主机访问。
在黑名单上面的主机都会被强制退出。
删除上面为白名单配置的信息,让105从新回到集群
刷新NameNode
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
启动105
[atguigu@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[atguigu@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
1.在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建 dfs.hosts.exclude 文件
[atguigu@hadoop102 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[atguigu@hadoop102 hadoop]$ touch dfs.hosts.exclude
[atguigu@hadoop102 hadoop]$ vi dfs.hosts.exclude
添加如下主机名称(要退役的节点)
hadoop105
2.在NameNode的hdfs-site.xml配置文件中增加dfs.hosts.exclude属性
dfs.hosts.exclude
/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude
分发:
[atguigu@hadoop102 hadoop]$ xsync hdfs-site.xml
3.刷新NameNode、刷新ResourceManager
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
[atguigu@hadoop102 hadoop-2.7.2]$ yarn rmadmin -refreshNodes
17/06/24 14:55:56 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
4. 检查Web浏览器,退役节点的状态为decommission in progress(退役中),说明数据节点正在复制块到其他节点,如图3-17所示
图3-17 退役中
5. 等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役,如图3-18所示
图3-18 已退役
[atguigu@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
stopping datanode
[atguigu@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager
stopping nodemanager
6. 如果数据不均衡,可以用命令实现集群的再平衡
[atguigu@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
注意:不允许白名单和黑名单中同时出现同一个主机名称。
1. DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本
2.具体配置如下
hdfs-site.xml
dfs.datanode.data.dir
file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2
分发:
[atguigu@hadoop102 hadoop]$ xsync hdfs-site.xml
关闭集群:
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/stop-dfs.sh
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/stop-dfs.sh
[atguigu@hadoop102 hadoop-2.7.2]$ jps
4496 Jps
[atguigu@hadoop103 hadoop-2.7.2]$ jps
6735 Jps
[atguigu@hadoop104 ~]$ jps
3389 Jps
删除 data 和 logs :
[atguigu@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/
[atguigu@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/
[atguigu@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/
格式化 NameNode
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format
启动节点:
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
https://blog.csdn.net/qq_40794973/article/details/86681941#t7
[atguigu@hadoop102 hadoop-2.7.2]$ cd /opt/module/hadoop-2.7.2/data/tmp/dfs/
[atguigu@hadoop102 dfs]$ ll
总用量 12
drwx------ 3 atguigu atguigu 4096 2月 21 19:07 data1
drwx------ 3 atguigu atguigu 4096 2月 21 19:07 data2
drwxrwxr-x 3 atguigu atguigu 4096 2月 21 19:07 name
测试:上传文件
[atguigu@hadoop102 dfs]$ hadoop fs -put /opt/module/hadoop-2.7.2/xiaopan.txt /
每个目录存储的内容都不一样, 只是分了一个路径而已,并没有吧内容进行完全的备份。要和 namenode 多目录区分开。
[atguigu@hadoop102 dfs]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs
[atguigu@hadoop102 dfs]$ tree
.
├── data1
│ ├── current
│ │ ├── BP-1528532229-192.168.19.102-1550747197324
│ │ │ ├── current
│ │ │ │ ├── finalized
│ │ │ │ │ └── subdir0
│ │ │ │ │ └── subdir0
│ │ │ │ │ ├── blk_1073741825
│ │ │ │ │ └── blk_1073741825_1001.meta
│ │ │ │ ├── rbw
│ │ │ │ └── VERSION
│ │ │ ├── scanner.cursor
│ │ │ └── tmp
│ │ └── VERSION
│ └── in_use.lock
├── data2
│ ├── current
│ │ ├── BP-1528532229-192.168.19.102-1550747197324
│ │ │ ├── current
│ │ │ │ ├── finalized
│ │ │ │ ├── rbw
│ │ │ │ └── VERSION
│ │ │ ├── scanner.cursor
│ │ │ └── tmp
│ │ └── VERSION
│ └── in_use.lock
└── name
├── current
│ ├── edits_0000000000000000001-0000000000000000002
│ ├── edits_inprogress_0000000000000000003
│ ├── fsimage_0000000000000000000
│ ├── fsimage_0000000000000000000.md5
│ ├── fsimage_0000000000000000002
│ ├── fsimage_0000000000000000002.md5
│ ├── seen_txid
│ └── VERSION
└── in_use.lock18 directories, 19 files
//我们发现第二个目录根本没有文件的存在。
1.scp实现两个远程主机之间的文件复制
scp -r hello.txt root@hadoop103:/user/atguigu/hello.txt // 推 push
scp -r root@hadoop103:/user/atguigu/hello.txt hello.txt // 拉 pull
scp -r root@hadoop103:/user/atguigu/hello.txt root@hadoop104:/user/atguigu //是通过本地主机中转实现两个远程主机的文件复制;如果在两个远程主机之间ssh没有配置的情况下可以使用该方式。
2.采用distcp命令实现两个Hadoop集群之间的递归数据复制
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop distcp
hdfs://haoop102:9000/user/atguigu/hello.txt hdfs://hadoop103:9000/user/atguigu/hello.txt
3.案例实操
(1)需要启动YARN进程
[atguigu@hadoop102 hadoop-2.7.2]$ start-yarn.sh
(2)归档文件
把/user/atguigu/input目录里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件存储到/user/atguigu/output路径下。
[atguigu@hadoop102 hadoop-2.7.2]$ ls
bin etc input libexec logs output safemode.sh share xiaopan.txt
data include lib LICENSE.txt NOTICE.txt README.txt sbin wcinput
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir -p /user/atguigu/input
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -put xiaopan.txt README.txt LICENSE.txt /user/atguigu/input
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop
Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]........................省略..........................
archive -archiveName NAME -p* create a hadoop archive
........................省略..........................
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop archive -archiveName input.har –p /user/atguigu/input /user/atguigu/output
注释:output 文件是事先没有的。
(3)查看归档
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -lsr /user/atguigu/output/input.har
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -lsr har:///user/atguigu/output/input.har
注释:har:// 为一个协议。
注释:归档之前的那个三个小文件还在。
(4)解归档文件
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -cp har:///user/atguigu/output/input.har/* /user/atguigu
开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。
1.回收站参数设置及工作机制
2.启用回收站
修改core-site.xml,配置垃圾回收时间为1分钟。
fs.trash.interval
1
群发:
[atguigu@hadoop102 hadoop]$ xsync core-site.xml
从新启动集群:
删除文件:
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -rm /user/atguigu/input/xiaopan.txt
19/02/21 23:50:16 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://hadoop102:9000/user/atguigu/input/xiaopan.txt' to trash at: hdfs://hadoop102:9000/user/atguigu/.Trash/Current
3.查看回收站
回收站在集群中的路径:/user/atguigu/.Trash/….
4.修改访问垃圾回收站用户名称
进入垃圾回收站用户名称,默认是 dr.who,修改为atguigu用户
[core-site.xml]
hadoop.http.staticuser.user
atguigu
5. 通过程序删除的文件不会经过回收站,需要调用moveToTrash()才进入回收站
Trash trash = New Trash(conf);
trash.moveToTrash(path);
6. 恢复回收站数据
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -mv /user/atguigu/.Trash/Current/user/atguigu/input /user/atguigu/input
7. 清空回收站(跟Windows里面的不一样,它是打包,文件名为时间戳,时间到了依然删除)
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -expunge
官方说明:https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html
注释:禁用指定目录的快照功能,需要删除这个目录里面的快照。
2.案例实操
(1)开启/禁用指定目录的快照功能
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -allowSnapshot /user/atguigu/input
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -disallowSnapshot /user/atguigu/input
(2)对目录创建快照
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfs -createSnapshot /user/atguigu/input
Created snapshot /user/atguigu/input/.snapshot/s20190222-002249.68
通过web访问hdfs://hadoop102:50070/user/atguigu/input/.snapshot/s…..// 快照和源文件使用相同数据
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfs -lsr /user/atguigu/input/.snapshot/
hdfs dfs -createSnapshot
[ ]
path The path of the snapshottable directory. snapshotName 快照名字。如果没有指定,会用时间戳生成一个默认的名字格式是"'s'yyyyMMdd-HHmmss.SSS", 例如 "s20130412-151029.033".
(3)指定名称创建快照
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfs -createSnapshot /user/atguigu/input miao170508
(4)重命名快照
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfs -renameSnapshot /user/atguigu/input/ miao170508 atguigu170508
(5)列出当前用户所有可快照目录
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs lsSnapshottableDir
drwxr-xr-x 0 atguigu supergroup 0 2019-02-22 00:22 1 65536 /user/atguigu/input
(6)比较两个快照目录的不同之处
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs snapshotDiff /user/atguigu/input . .snapshot/s20190222-002249.686
Difference between current directory and snapshot s20190222-002249.686 under directory /user/atguigu/input:
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -put /opt/module/hadoop-2.7.2/xiaopan.txt /user/atguigu/input
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs snapshotDiff /user/atguigu/input . .snapshot/s20190222-002249.686
Difference between current directory and snapshot s20190222-002249.686 under directory /user/atguigu/input:
M .
- ./xiaopan.txt
注释:- ./xiaopan.txt 快照相对于文件少了一个xiaopan.txt。
(7)恢复快照
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfs -cp /user/atguigu/input/.snapshot/s20190222-002249.686 /user
其他参考:https://blog.csdn.net/Amber_amber/article/details/47021841