大数据框架Hadoop(HDFS)

1. HDFS概述

1.1 HDFS产出背景及定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 HDFS优缺点

在这里插入图片描述
在这里插入图片描述

1.3 HDFS组成架构

在这里插入图片描述
在这里插入图片描述

1.4 HDFS文件块大小(面试重点)

在这里插入图片描述
在这里插入图片描述

2. HDFS的Shell操作(开发重点)

在这里插入图片描述

2.1 命令大全

命令大全

[atguigu@hadoop102 hadoop-2.7.2]$ 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.2 常用命令实操

在这里插入图片描述
yarn需要在指定resourcemanager的那台节点上启动
在这里插入图片描述
在这里插入图片描述
hadoop fs -lsr / 从根目录开始递归查看所有文件和文件夹 , 还有一种写法是hadoop fs -ls -R /也是递归查看
前面那种写法已经过时了, 但是还能用
在这里插入图片描述
-p参数 创建多级目录
在这里插入图片描述

在这里插入图片描述
把本地的文件的内容, 追加到hdfs中文件的末尾
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
-h参数 方便查看的方式展示
-s 查看你指定的那个文件夹占用了多大
在这里插入图片描述
设置指定文件的副本数
在这里插入图片描述
在这里插入图片描述

3. HDFS客户端操作(开发重点)

3.1 HDFS客户端环境准备

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.8.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-common</artifactId>
			<version>2.7.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-client</artifactId>
			<version>2.7.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-hdfs</artifactId>
			<version>2.7.2</version>
		</dependency>
		<dependency>
			<groupId>jdk.tools</groupId>
			<artifactId>jdk.tools</artifactId>
			<version>1.8</version>
			<scope>system</scope>
			<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
		</dependency>
</dependencies>

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

3.2 HDFS的API操作

3.2.1 HDFS文件上传(测试参数优先级)

  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拷贝到项目的根目录下

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
	<property>
		<name>dfs.replication</name>
        <value>1</value>
	</property>
</configuration>

3.参数优先级

在这里插入图片描述

3.2.2 HDFS文件下载

@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();
}

3.2.3 HDFS文件夹删除

@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 执行删除, 后面的boolean型参数的意思是, 如果前面是个文件夹, 后面是true,就会递归删除它下面的所有, 如果是false的话, 如果文件夹下有东西就报错.  如果要删除的是文件, 设置成true还是false都可以
	fs.delete(new Path("/0508/"), true);
		
	// 3 关闭资源
	fs.close();
}

3.2.4 HDFS文件名更改

@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();
}

3.2.5 HDFS文件详情查看

@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<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
		
	while(listFiles.hasNext()){
		LocatedFileStatus status = listFiles.next();
			
		// 输出详情
		// 文件名称
		System.out.println(status.getPath().getName());
		// 长度
		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();
}

3.2.6 HDFS文件和文件夹判断

@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();
}

3.3 HDFS的I/O流操作

在这里插入图片描述

3.3.1 HDFS文件上传

在这里插入图片描述

@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();
}

3.3.2 HDFS文件下载

在这里插入图片描述

// 文件下载
@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();
}

3.3.3 定位文件读取

在这里插入图片描述

  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();
}

  1. 下载第二块
@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);
}

在这里插入图片描述

4. HDFS的数据流(面试重点)

4.1 HDFS写数据流程

4.1.1 剖析文件写入

在这里插入图片描述

值得注意的是, 客户端向datanode写数据是以流的形式, 发送一个一个packet. 比如先发送到datanode1, datanode1先缓存到内存中, 然后它会通过队列发送到datanode2一份,并把自己的那份写入磁盘, datanode2监听队列收到数据, 也先缓存到内存, 并通过队列给datanode3发送一份并写进磁盘. datanode3写入磁盘后给datanode2相应应答, 应答依次传递给datanode1并依次把内存中的数据清除, 然后返回给客户端

在这里插入图片描述

4.1.2 网络拓扑-节点距离计算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.1.3 机架感知(副本存储节点选择)

  1. 官方ip地址
    机架感知说明
    http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication
    在这里插入图片描述
    Hadoop2.7.2是这样选择的
    在这里插入图片描述

4.2 HDFS读数据流程

在这里插入图片描述
需要注意的是, 如果是分为block1和block2两个块,存储同一个文件的话, 先读取block1, 然后不关闭流, 接着读取block2 . 他是串行读取的.
如果两个块都在同一个节点上, 那么它就直接读取两个块, 然后一起返回
在这里插入图片描述

5. NameNode和SecondaryNameNode(面试开发重点)

5.1 NN和2NN工作机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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中。

5.2 Fsimage和Edits解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
通过seen_txid来读取需要合并的Edits的编号.

5.3 CheckPoint时间设置

checkPoint就是2nn合并fsimage 和 Edits的操作
checkPoint触发条件一个是定时时间到(默认1小时)二是Edits中的数据满了(大约100W条)

在这里插入图片描述
在这里插入图片描述

5.4 NameNode故障处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改完配置文件需要分发给所有节点
在这里插入图片描述

第4步需要导入成这样, 然后进入namesecondary中删除in_use.lock文件, 第4步见下
在这里插入图片描述
第5步等待的时间就是上面配置的检查点时间, 上面配置了120, 我们等待2分钟
在这里插入图片描述

5.5 集群安全模式

NameNode启动时加载Fsimage以及Edits信息时会进入安全模式
集群启动时DataNode启动向NameNode汇报块信息时会进入安全模式
当满足最小副本条件后30秒, NameNode会推出安全模式
最小副本条件是, 有99.9%的块都最少有一个副本了. 就满足该条件
在这里插入图片描述

对安全模式的操作如下
在这里插入图片描述
等待安全模式操作是, 等结束安全模式后,就操作数据

在这里插入图片描述
在这里插入图片描述

5.6 NameNode多目录配置

在这里插入图片描述

因为操作了NameNode, 所以需要清除全部data和logs的内容, 重启集群
修改完配置文件需要分发给所有节点
在这里插入图片描述
在这里插入图片描述

5.7 刷新namenode, 让namenode重新读取hdfs-site.xml文件

hdfs dfsadmin -refreshNodes

6. DataNode(面试开发重点)

6.1 DataNode工作机制

在这里插入图片描述
在这里插入图片描述
认为datanode挂掉的时间点是10分钟+30秒

6.2 数据完整性

在这里插入图片描述
简单的奇偶校验, 基本用不上. 通过数1的个数来验证
在这里插入图片描述
crc加密算法,分为16位, 32位, 64位, 128位, 严格程度依次递增
在这里插入图片描述

6.3 掉线时限参数设置

在这里插入图片描述
在这里插入图片描述

6.4 服役新数据节点(动态添加datanode)

需要配置文件等与原集群保持一致
删除新的节点105上的data和log文件夹, 其他节点上的不要删. 如果不删除这个节点上的data和log文件夹, 会出现幽灵现象, 因为105是由104克隆过来的, 所以会出现,在控制台web端中看到一会104连接上, 一会105连接上. 这是因为104和105的data和log文件夹内的数据相同

不配置ssh和xsync, 集群启动时就不会带上这个新的机器了

需要再配置一下ssh
修改xsync的shell脚本
不需要重新格式化, 也不需要重新启动集群, 只需要单独启动datanode即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.5 退役旧数据节点

考虑一个问题, 如果能随便添加datanode, 我只要知道你的namenode的ip地址, 我就可以拿我的电脑连接你的集群, 然后你上传的文件有可能会保存再我的电脑上, 有一种方式, 可以提升可靠性. 添加datanode的白名单

6.5.1 添加白名单

在这里插入图片描述

注意, 再dfs.hosts文件中不允许有空行或空格
在这里插入图片描述
刷新namenode , 让namenode重新读取hdfs-site.xml
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
白名单适合刚开始搭建集群的时候就配置好

6.5.2 黑名单退役

在这里插入图片描述
在这里插入图片描述
这里执行的退出是单节点退出
在这里插入图片描述
在这里插入图片描述

6.6 Datanode多目录配置

相当于把数据分开存储, 而不是保存的数据的副本(与namenode保存元数据副本不一样)
修改hdfs-site.xml, 进行xsync分发
停止集群
清除集群中的data和log目录
格式化集群
启动集群
在这里插入图片描述

7. HDFS 2.X新特性

7.1 集群间数据拷贝

在这里插入图片描述
在这里插入图片描述

7.2 小文件存档

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.3 回收站

在这里插入图片描述
注意fs.trash.interval和fs.trash.checkpoint.interval的单位都是分钟

在这里插入图片描述
在这里插入图片描述
下面这个集群指的是hdfs集群
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.4 快照管理

在这里插入图片描述
创建快照时如果没有起名字的话, 会用创建快照时的系统时间作为名字
hdfs lsSnapshottableDir列出当前用户已经创建了的快照
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意: snapshotDiff不仅能比较快照和实际目录, 也可以比较快照和快照之间的差异
中间有个 . 作为分隔符. 一定要注意那个 .
在这里插入图片描述
这个表示, 后面的快照比前面的目录 少了一个zaiyiqi.txt -代表少东西

8. HDFS HA高可用(后面补上)

8.1 HA概述

8.2 HDFS-HA工作机制

8.2.1 HDFS-HA工作要点

8.2.2 HDFS-HA自动故障转移工作机制

8.3 HDFS-HA集群配置

8.3.1 环境准备

8.3.2 规划集群

8.3.3 配置Zookeeper集群

8.3.4 配置HDFS-HA集群

8.3.5 启动HDFS-HA集群

8.3.6 配置HDFS-HA自动故障转移

8.4 YARN-HA配置

8.4.1 YARN-HA工作机制

8.4.2 配置YARN-HA集群

8.5 HDFS Federation架构设计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值