IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> HDFS详解 -> 正文阅读

[大数据]HDFS详解

目录

一、HDFS概述

????????1.1 HDFS的定义

????????1.2 HDFS的优缺点

????????1.3 HDFS的组成架构

????????1.4 HDFS文件块的大小

二、HDFS的Shell操作

????????2.1 基本语法

????????2.2 常用命令

?三、HDFS的客户端操作

????????3.1 客户端环境准备

????????3.2 HDFS的API操作

????????3.2.1 HDFS的文件上传(测试优先级)

????????3.2.2 HDFS文件下载

????????3.2.3 HDFS文件夹删除

????????3.2.4 HDFS文件名更改

????????3.2.5 HDFS文件详细信息查看

????????3.2.6 HDFS文件和文件夹判断? ? ? ? ? ? ?

四、HDFS的数据流

????????4.1 HDFS的写流程

????????4.1.1 文件写入流程

????????4.1.2 网络拓扑

????????4.1.3 机架感知

????????4.2 HDFS读数据流程

五、NameNode和Secondary NameNode

????????5.1 NameNode和Secondary NameNode工作机制

????????5.2 Edits和Fsimage解析

????????5.3 CheckPoint时间设置

????????5.4 NameNode故障处理

????????5.5 集群安全模式

????????5.5.1 基本概述

????????5.5.2 基本语法

????????5.6 NameNode多目录配置

六、DateNode

????????6.1 DataNode工作机制

????????6.2 数据完整性

????????6.3 添加黑白名单

????????6.3.1 白名单

????????6.3.2 黑名单

????????6.4 Datanode多目录配置

七、HDFS2.X新特性

????????7.1 集群间数据拷贝

????????7.2 Hadoop存档


一、HDFS概述

????????1.1 HDFS的定义

? ? ? ? ? ? ?HDFS是一种允许文件通过网络在多台主机上分享的文件系统,可以让多台机器上的多个用户分享文件和存储空间。HDFS只是分布式文件管理系统中的一种。

?????????HDFS的适用场景:适合一次写入,多次读出的场景,且不支持文件的修改。?

????????1.2 HDFS的优缺点

????????????????HDFS的优点:

????????????????????????1)高容错性 ----?副本机制

????????????????????????2)适合处理大数据

????????????????????????3)可构建在廉价的机器上

????????????????HDFS的缺点:

????????????????????????1)不适合低延时数据访问

????????????????????????2)无法高效的对大量小文件进行存储

????????????????????????3)不支持并发写入,文件随机修改:①一个文件只能有一个写,不允许多个线程同时写入②只支持数据追加(append),不支持文件的随机修改。

????????1.3 HDFS的组成架构

????????????????1)NameNode:就是Master,它是一个管理者

????????????????????????①管理HDFS的名称空间

????????????????????????②配置副本策略

????????????????????????③管理数据块的映射信息

????????????????????????④处理客户端读写请求

????????????????2)DateNode:就是Slave,NameNode下达命令,DateNode执行实际的操作

????????????????????????①存储实际的数据块

????????????????????????②执行数据块的读/写操作

????????????????3)Secondary NameNode:①辅助NameNode②在紧急情况下,可辅助恢复NameNode

????????1.4 HDFS文件块的大小

????????????????HDFS中的文件在物理上是分块(Block)存储的,可以通过配置参数([hdfs-site.xml文件中的]dfs.blocksize)来设置。hadoop2.x默认是128M(寻址时间大约为10ms,寻址时间为传输时间的1%为最佳(即为10/0.01=1000ms=1s),目前磁盘的传输率普遍为100m/s,块的大小需要是2的n次方,故为128M)

? ? ? ? ? ? ? ? 块的属性:length:指块的实际大小?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?offset:块的偏移量,指块从文件的哪部分开始存储数据

????????????????思考:为什么块的大小不能设置太小,也不能设置太大?

????????????????????????(1)HDFS的块设置太小,会增加寻址时间
?? ??? ??? ??? ??? ??? ?(2)HDFS的块比磁盘的块大,目的是为了最小化寻址开销
?? ??? ??? ??? ??? ??? ?(3)HDFS的块如果设置的太大,在一次上传时,如果发生异常,需要重新传输,造成网络IO资源的浪费。
?? ??? ??? ??? ?在随机读取某部分内容时,不够灵活
?? ??? ??? ??? ??? ??? ? ?总结:HDFS块大小的设置主要取决于磁盘的传输效率

二、HDFS的Shell操作

????????2.1 基本语法

????????????????hadoop fs 具体命令
?? ??? ??? ??? ?hdfs dfs 具体命令 ? ? dfs是fs的实现类

????????2.2 常用命令

注释命令
启动集群命令start-dfs.sh
start-yarn.sh
帮助 -helphadoop ?fs ?-help ?rm
显示目录信息 -ls ?
递归查看 ?-lsr
hadoop fs -ls /
在HDFS上创建目录 -mkdir -p?递归创建hadoop fs -mkdir -p /hdfs/fs
从本地剪切粘贴到HDFS -moveFromLocalhadoop fs -moveFromLocal ?源文件 目标位置
追加文件到已存在的文件末尾 ?-appendToFilehadoop fs -appendToFile ?源文件 ?目标文件
显示文件内容 ?-cathadoop fs -cat 文件
修改权限hadoop fs -chmod ?777 ?/log.txt
从本地文件系统中拷贝到HDFS ? -copyFromLocal ?
等同于 ?-put
hadoop fs -copyFromLocal ?本地文件 ? HDFS路径
hadoop fs -put 本地文件 HDFS路径
从HDFS拷贝到本地 ?-copyToLocal ?
等同于 ?-get
hadoop fs -copyToLocal ?HDFS文件 ?本地路径
hadoop fs -get ?HDFS文件 ?本地路径
从HDFS的路径拷贝到另一个路径 ?-cphadoop fs -cp ?原路径文件 ?拷贝路径文件
在HDFS中移动文件 ?-mvhadoop fs -mv 文件 目标路径
合并下载多个文件,如HDFS /logs目录下有多个log文件 ?-getmergehadoop fs -getmerge /logs/* ?./merge.txt
显示文件的末尾 ?-tailhadoop fs -tail ?/hadoop1/abc.log
删除文件或文件夹 ?-rm? 删除目录需要指定-r参数
删除空目录 ?-rmdir
hadoop fs -rm 文件/文件夹
hadoop fs -rmdir ?空目录
统计文件夹的大小信息 ?-duhadoop fs -du ?文件夹
设置HDFS中副本数量 ?-setrephadoop fs -setrep 8 ?/pf/spa.txt ?
----副本数量设置为8,这里的副本数为最大值

?三、HDFS的客户端操作

????????3.1 客户端环境准备

? ? ? ? ? ? ? ? 服务端:启动NN,DN

? ? ? ? ? ? ? ? 客户端:shell客户端:hadoop fs?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?java客户端

????????????????1.根据自己电脑的操作系统拷贝对应的编译后的hadoop jar包到非中文路径

????????????????2.配置HADOOP_HOME环境变量

????????????????3.?配置Path环境变量

????????????????4.创建一个Maven工程

????????????????5.导入相应的依赖坐标+日志添加

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

? ? ? ? ? ?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.执行程序:运行时需要配置用户名称,如图

????????????????

????????3.2 HDFS的API操作

????????3.2.1 HDFS的文件上传(测试优先级)

????????????????????????①编写源代码

@Test
public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException{
	// 1.获取文件系统
	Configuration conf = new Configuration();
	// 设置副本数
	conf.set("dfs.replication",2);
	FileSystem fs = FileSystem.get(new URI("hdfs://bigdata01:9000"),conf,"gaozj");
	// 2.上传文件
	fs.copyFromLocalFile(new Path("e:/bigdata.txt"),new Path("/bigdata.txt"));
	// 3.关闭资源
	fs.close();
	System.out.println("over");
}

? ? ? ? ? ? ? ? ? ? ? ? ②将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>

? ? ? ? ? ? ? ? ? ? ? ? ③参数优先级

????????????????????????参数优先级排序:①客户端代码中设置的值---->②ClassPath下用户自定义的配置文件---->③服务器的默认配置

????????3.2.2 HDFS文件下载

? ? ? ? ? ? ? ? ? ? ? ? 代码

@Test
public void testCopyToLocalFile() throws IOException, InterruptedException, URISyntaxException{
	// 1.获取文件系统
	Configuration conf = new Configuration();
	FileSystem fs = FileSystem.get(new URI("hdfs:/bigdata01:9000"),conf,"gaozj");
	// 2.执行下载操作
	// 第①个参数--是否将原文件删除,第②个参数--要下载的文件路径,第③个参数--将文件下载到的路径,第④个参数--是否开启
	fs.copyToLocal(false,new Path("/bigdata.txt"),new Path("e:/bigdata.txt"),true);
	// 3.关闭资源
	fs.close()
}

????????3.2.3 HDFS文件夹删除

public void testDelete() throws IOException, InterruptedException, URISyntaxException{
	// 1.获取文件系统
	Configuration conf = new Configuration();
	FileSystem fs = FileSystem.get(new URI("hdfs://bigdata01:9000"),conf,"gaozj");
	// 2.执行删除
	fs.delete(new Path("/bigdata/"),true);
	// 3.关闭资源
	fs.close();
}

????????3.2.4 HDFS文件名更改

public void testReName() throws IOException, InterruptedException, URISyntaxException{
	// 1.获取文件系统
	Configuration conf = new Configuration();
	FileSystem fs = FileSystem.get(new URI("hdfs://bigdata01:9000"),conf,"gaozj");
	// 2.修改文件名称
	fs.rename(new Path("/bigdata.txt"), new Path("/newbigdata.txt"));
	// 3.关闭资源
	fs.close();
}

????????3.2.5 HDFS文件详细信息查看

????????????????????????查看文件名称、权限、长度、块信息

public void testListFiles() throws IOException, InterruptedException, URISyntaxException{
	// 1/获取文件系统
	Configuration conf = new Configuration();
	FileSystem fs = FileSystem.get(new URI("hdfs://bigdata01:9000"),conf,"gaozj");
	// 2.获取文件信息
	RemoteIterator<LocaltedFileStatus> listFiles = fs.listFiles(new Path("/"),true);
	while(listFiles.hasNext()){
		LocaltedFileStatus 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 b : blocklocations){
			// 获取块存储的主节点信息
			String[] hosts = b.getHosts();
			for(String h : hosts){
				System.out.println(h);
			}
		}
	}
	// 关闭资源
	fs.close();
}

????????3.2.6 HDFS文件和文件夹判断? ? ? ? ? ? ?

public void testFileStatus() throws IOException, InterruptedException, URISyntaxException{
	// 1.获取文件系统
	Configuration conf = new Configuration();
	FileSystem fs = FileSystem.get(new URI("hdfs://bigdata01:9000"),conf,"gaozj");
	// 2.判断是文件还是文件夹
	FileStatus[] listStatus = fs.listStatus("/");
	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();
}

四、HDFS的数据流

????????4.1 HDFS的写流程

????????4.1.1 文件写入流程

?????????????????具体流程:
?? ??? ??? ??? ?①客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode收到请求后会进行校验:①校验是否有写权限②校验路径下是否有同名文件
?? ??? ??? ??? ?②NameNode返回是否可以上传(如果校验失败,会直接报错。如果成功会给客户端返回一个信号,表示可以上传)
?? ??? ??? ??? ?③客户端请求第一个Block块上传到哪几个DataNode节点上。
?? ??? ??? ??? ?④NameNode返回3个DataNode节点,dn1,dn2,dn3
?? ??? ??? ??? ?⑤客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
?? ??? ??? ??? ?⑥dn1、dn2、dn3逐级应答客户端。
?? ??? ??? ??? ?⑦客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
?? ??? ??? ??? ?⑧当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

????????4.1.2 网络拓扑

????????????????????????节点距离:两个节点到达最近的共同祖先的距离总和。

????????4.1.3 机架感知

????????????????????????Hadoop2.7.2副本节点选择
?? ??? ??? ??? ?????????第一个副本在Client所处的节点上,如果客户端在集群外,随机选择一个
?? ??? ??? ??? ?????????第二个副本和第一个副本位于相同机架,随机节点上。
?? ??? ??? ??? ?????????第三个副本位于不同机架,随机节点上。

????????4.2 HDFS读数据流程

????????????????HDFS读数据流程:

?????????????????具体流程:
?? ??? ??? ?????????①客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据信息,获取文件块所在的DataNode节点地址
?? ??? ??? ?????????②挑选一台DataNode服务器(就近原则),请求读取数据
?? ??? ??? ?????????③DataNode开始传输数据给客户端(从磁盘里读取 数据输入流,以Packet为单位来做校验)
?? ??? ??? ?????????④客户端以Packet为单位接受,先在本地缓存,然后写入目标文件

五、NameNode和Secondary NameNode

????????5.1 NameNode和Secondary NameNode工作机制

????????1.第一阶段
?? ??? ??? ??? ?(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:记录客户端中更新元数据信息的每一步操作。
?? ??? ??? ?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是否需要CheckPoint检查结果。SecondaryNameNode执行CheckPoint操作,首先会让NameNode滚动edits,并生成一个新的edits.inprogress文件,其他未合并的edits和fsimage会拷贝到SecondaryNameNode的本地,然后将拷贝的edits和fsimage加载到内存中进行合并,生成fsimage.checkpoint,然后将fsimage.checkpoint拷贝到NameNode,重命名为fsimage,并替换原来的fsimage文件。
?? ??? ??? ?NameNode在重新加载的时候只需要加载之前未合并的edits和fsimage即可。因为合并过的edits中的元数据信息已经被记录到fsimage。

????????5.2 Edits和Fsimage解析

????????????1.NameNode被格式化后,将在/opt/module/hadoop-2.7.2/data/tmp/dfs/name/current目录中产生如下文件:
?? ??? ??? ??? ??? ??? ?fsimage_00000000000000
?? ??? ??? ??? ??? ??? ?fsimage_00000000000000.md5
?? ??? ??? ??? ??? ??? ?seen_txid
?? ??? ??? ??? ??? ??? ?VERSION
?? ??? ??? ?(1)fsimage文件:HDFS文件系统元数据的一个永久性的检查点。其中包含HDFS文件系统的所有目录和文件idnode的序列化信息
?? ??? ??? ?(2)edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端中执行的所有写操作首先会被记录到edits文件中
?? ??? ??? ?(3)seen_txid文件:保存的是一个数字,就是最后一个edits_的数字
?? ??? ??? ?(4)每次NameNode启动的时候,都会将fsimage文件读入内存,加载edits里面的更行操作,保证内存中的元数据是最新的、同步的,可以看出NameNode启动的时候就将edits和fsimage进行了合并。
?? ??? ??? ?2.oiv查看fsimage文件
?? ??? ??? ??? ??? ?hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
?? ??? ??? ?3,oev查看Edits文件
?? ??? ??? ??? ??? ?hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径

????????5.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 >

????????5.4 NameNode故障处理

????????????????NameNode故障后,可以采用如下两种方法恢复数据:
?? ??? ??? ?方法一:将SecondaryNameNode中数据拷贝到NameNode存储数据的目录
?? ??? ??? ??? ?1. kill -9 NameNode进程
?? ??? ??? ??? ?2. 删除NameNode存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)
?? ??? ??? ??? ?3. 拷贝SecondaryNameNode中数据到原NameNode存储数据目录
?? ??? ??? ??? ?4. 重新启动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-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)

rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*

????????????????4. 如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件

scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary ./
rm -rf in_use.lock

????????????????5. 导入检查点数据(等待一会ctrl+c结束掉)

hdfs namenode -importCheckpoint

????????????????6. 启动NameNode

hadoop-daemon.sh start namenode

????????5.5 集群安全模式

????????5.5.1 基本概述

????????????????????????NameNode启动:首先将fsimage加载如内存,并执行编辑文件edits中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage和空的编辑日志edits。此时,NameNode开始监听DataNode请求,这个过程中NameNode一直运行安全模式,即NameNode的文件系统对客户端来说只是可读的。
?? ??? ??? ??? ?DataNode启动:系统中的数据块的位置并不是由NameNode维护的,而是以块的列表形式存储在DataNode中。
?? ??? ??? ??? ?安全模式退出:如果满足"最小副本条件",NameNode会在30s后退出安全模式。

????????5.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?? ??? ?(功能描述:等待安全模式状态)

????????5.6 NameNode多目录配置

????????????????1.?? ?NameNode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性
?? ??? ??? ?????2.?? ?具体配置如下
?? ??? ??? ??? ?(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中所有数据
?? ??? ??? ??? ?(3)格式化集群并启动

六、DateNode

????????6.1 DataNode工作机制

????????DataNode工作机制如图:

? ? ? ? ? ? (1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
?? ??? ??? ?(2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息
?? ??? ??? ?(3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用
?? ??? ??? ?(4)集群运行中可以安全加入和退出一些机器

????????6.2 数据完整性

? ? ? ? ? ? 1)当DataNode读取Block的时候,它会计算CheckSum
?? ??? ??? ?2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏
?? ??? ??? ?3)Client读取其他DataNode上的Block
?? ??? ??? ?4)DataNode在其文件创建后周期验证CheckSum

????????6.3 添加黑白名单

????????6.3.1 白名单

????????????????????????添加到白名单的主机,都允许访问NameNode,不在白名单的主机,都会被退出。
?? ??? ??? ??? ?????????配置白名单的具体步骤如下:
?? ??? ??? ??? ?????????(1)在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts文件

vi dfs.hosts

????????????????????????添加主机名称:bigdata01,bigdata03
?? ??? ??? ??? ?????????(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)配置文件分发
?????????? ??? ??? ??? ?(4)刷新NameNode

hdfs dfsadmin -refreshNodes

????????????????????????(5)更新ResourceManager节点

yarn rmadmin -refreshNodes

????????????????????????(6)在web浏览器上查看

????????6.3.2 黑名单

????????????????????????在黑名单上面的主机都会被强制退出
?? ??? ??? ??? ?????????1.在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts.exclude文件
?? ??? ??? ??? ??? ??? ?添加主机名:bigdata02
?? ??? ??? ??? ?????????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、刷新ResourceManage

hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes

????????????????????????4.? 检查Web浏览器

????????????????????????5.?? ?等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役
????????????????????????6.?? ?如果数据不均衡,可以用命令实现集群的再平衡

sbin/start-balancer.sh

????????????????????????注意:不允许黑白名单中出现同一台主机名

????????6.4 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>

七、HDFS2.X新特性

????????7.1 集群间数据拷贝

????????????????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集群之间的递归数据复制

bin/hadoop distcp
hdfs://haoop102:9000/user/atguigu/hello.txt hdfs://hadoop103:9000/user/atguigu/hello.txt

????????7.2 Hadoop存档

????????????????1, HDFS存储小文件弊端:
?? ??? ??? ??? ?每个文件均按块存储,每个块的元数据存储在NameNode的内存中,因此Hadoop存储小文件会非常低效。大量的小文件会耗尽NameNode中大量的内存。但注意,存储小文件所需要的磁盘容量和数据块的大小无关。
????????????????2. 解决存储小文件的办法之一:
?? ??? ??? ??? ?Hadoop存档文件或HAR文件,是一个更高效的文件存档工具。它将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明访问。具体来说,Hadoop存档文件对内还是一个个独立文件,对NameNode而言却是一个整体,减少了NameNode的内存使用。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:22:15  更:2021-07-16 11:22:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 1:14:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码