Hadoop HDFS分布式文件系统
一、为什么需要分布式存储
之所以需要分布式存储?
- 数据量太大,单机存储能力有上限,需要靠数量来解决问题
说明:分布式不仅仅是解决了能存的问题, 多台服务器协同工作带来的也是性能的横向扩展。三倍的网络传输效率,三倍的磁盘写入效率
- 数量的提升带来的是网络传输、磁盘读写、 CPU 、内存等各方面的
综合提升。 分布式组合在一起可以达到 1+1>2 的效果
二、分布式的基础架构分析
2.1.分布式的基础架构
服务器数量多,在现实生活中往往带来的不是提升,而是:管理上的混乱。那么众多的服务器一起工作,是如何高效、不出问题的工作呢?
- 去中心化模式:没有明确中心,大家协调工作
- 中心化模式:有明确的中心,基于中心节点分配工作
大数据框架,大多数的基础架构上,都是符合:中心化模式的。即:有一个中心节点(服务器)来统筹其它服务器的工作,统一指挥,统一调派,避免混乱。这种模式,也被称之为:一主多从模式,简称主从模式( Master And Slaves )
2.2.主从模式
主从模式( Master-Slaves )就是中心化模式,表示有一个主节点来,作为管理者,管理协调下属一批从节点工作。
主从模式(中心化模式)在现实生活中同样很常见:
- 公司企业管理
- 组织管理
- 行政管理等
Hadoop 框架,就是一个典型的主从模式(中心化模式)架构的技术框架。
三、HDFS 的基础架构
3.1.HDFS
HDFS 是 Hadoop 三大组件 (HDFS 、 MapReduce 、 YARN) 之一
- HDFS全称是: Hadoop Distributed File System ( Hadoop 分布式文件系统)
- HDFS是 Hadoop 技术栈内提供的分布式数据存储解决方案
- HDFS可以在多台服务器上构建存储集群,存储海量的数据
3.2.HDFS的基础架构
HDFS 是一个典型的主从模式架构
HDFS角色说明:
⑴.NameNode :
- HDFS 系统的主角色,是一个独立的进程
- 负责管理 HDFS 整个文件系统
- 负责管理 DataNode
⑵.SecondaryNameNode :
- NameNode 的辅助,是一个独立进程
- 主要帮助 NameNode 完成元数据整理工作(打杂)
⑶.DataNode :
- HDFS 系统的从角色,是一个独立进程
- 主要负责数据的存储,即存入数据和取出数据
3.3.HDFS 集群
一个HDFS 集群,就是由 1 个 DataNode 加若干(至少一个) DataNode 组成
四、HDFS 集群环境部署
4.1.安装包下载
官方网址: https://hadoop.apache.org ,课程使用: 3.3.4 版。
4.2.集群规划
在之前章节,准备了三台云服务器,其硬件配置如下。
服务规划:
Hadoop HDFS 的角色包含:
- NameNode ,主节点管理者
- DataNode ,从节点工作者
- SecondaryNameNode ,主节点辅助
4.3.上传 & 解压
注意:请确认完成前置准备中的服务器创建、固定IP 、防火墙关闭、 Hadoop 用户创建、 SSH 免密、 JDK 部署等操
1.上传Hadoop安装包到node1节点中
2.解压Hadoop安装包到/export/server
tar -zxvf hadoop-3.3.4.tar.gz -C /export/server
3.创建软连接
cd /export/server/ ln -s /export/server/hadoop-3.3.4/ hadoop
4.进入Hadoop 目录
cd hadoop
cd 进入 Hadoop 安装包内,通过 ls -l 命令查看文件夹内部结
各个文件夹含义如下
- bin ,存放 Hadoop 的各类程序(命令)
- etc ,存放 Hadoop 的配置文件
- include , C 语言的一些头文件
- lib ,存放 Linux 系统的动态链接库( .so 文件)
- libexec ,存放配置 Hadoop 系统的脚本文件( .sh和 .cmd )
- licenses-binary ,存放许可证文件
- sbin ,管理员程序( super bin )
- share ,存放二进制源码( Java jar 包)
4.4.修改配置文件,应用自定义设置
配置 HDFS 集群,主要涉及到如下文件的修改:
- workers : 配置从节点( DataNode )有哪些
- hadoop-env.sh : 配置 Hadoop 的相关环境变量
- core-site.xml : Hadoop 核心配置文件
- hdfs-site.xml : HDFS 核心配置文件
这些文件均存在与 $HADOOP_HOME/etc/hadoop 文件夹中。
注意:$HADOOP_HOME 是后续我们要设置的环境变量,其指代 Hadoop 安装文件夹即 /export/server/hadoop
4.4.1.配置workers文件
填入的 node1 、 node2 、 node3表明集群记录了三个从节点( DataNode )
# 进入配置文件目录 cd etc/hadoop # 编辑 workers 文件 vi workers # 填入如下内容 node1 node2 node3
4.4.2.配置hadoop-env.sh文件
通过记录这些环境变量, 来指明上述运行时的重要信息
- JAVA_HOME ,指明 JDK 环境的位置在哪
- HADOOP_HOME ,指明 Hadoop 安装位置
- HADOOP_CONF_DIR ,指明 Hadoop 配置文件目录位置
- HADOOP_LOG_DIR ,指明 Hadoop 运行日志目录位置
# 填入如下内容 export JAVA_HOME=/export/server/jdk export HADOOP_HOME=/export/server/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export HADOOP_LOG_DIR=$HADOOP_HOME/logs
4.4.3.配置core-site.xml文件
配置说明:
下面的配置之间复制即可:
# 在文件内部填入如下内容 <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://node1:8020</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> </configuration>
说明:
- hdfs://node1:8020 为整个HDFS内部的通讯地址,应用协议为hdfs://(Hadoop内置协议)
- 表明DataNode将和node1的8020端口通讯,node1是NameNode所在机器
- 此配置固定了node1必须启动NameNode进程
4.4.4.配置hdfs-site.xml文件
配置 hdfs-site.xml 文件:
# 在文件内部填入如下内容 <configuration> <property> <name>dfs.datanode.data.dir.perm</name> <value>700</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/data/nn</value> </property> <property> <name>dfs.namenode.hosts</name> <value>node1,node2,node3</value> </property> <property> <name>dfs.blocksize</name> <value>268435456</value> </property> <property> <name>dfs.namenode.handler.count</name> <value>100</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/data/dn</value> </property> </configuration>
针对 hdfs-site.xml ,简单分析一下配置文件的内容:
4.5.准备数据目录
根据下属2个配置项创建对应目录:
<property> <name>dfs.namenode.name.dir</name> <value>/data/nn</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/data/dn</value> </property>
说明:
- namenode 数据存放 node1 的 /data/nn
- datanode 数据存放 node1 、 node2 、 node3 的 /data/dn
做如下操作:
- 在node1节点
mkdir -p /data/nn
mkdir -p /data/dn
- 在node2和node3节点
mkdir -p /data/dn
4.6.分发 Hadoop 文件夹
上面已经基本完成 Hadoop 的配置操作,可以从 node1 将 hadoop 安装文件夹远程复制到 node2 、 node3
分发:
# 在 node1 执行如下命令 cd /export/server scp -r hadoop-3.3.4 node2:`pwd`/ scp -r hadoop-3.3.4 node3:`pwd`/
在node2执行,为hadoop配置软链接
# 在 node2 执行如下命令 ln -s /export/server/hadoop-3.3.4 /export/server/hadoop
在node3执行,为hadoop配置软链接
# 在 node3 执行如下命令 ln -s /export/server/hadoop-3.3.4 /export/server/hadoop
配置环境变量
4.7.配置环境变量
为了方便我们操作Hadoop,可以将Hadoop的一些脚本、程序配置到PATH中,方便后续使用。
为了方便我们操作 Hadoop ,可以将 Hadoop 的一些脚本、程序配置到 PATH 中,方便后续使用:
在 Hadoop 文件夹中的 bin 、 sbin 两个文件夹内有许多的脚本和程序,现在来配置一下环境变量
# 打开文件 vi /etc/profile # 添加内容 # 在 /etc/profile 文件底部追加如下内容 export HADOOP_HOME=/export/server/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin # 保存文件 source source /etc/profile
注意:在node2和node3也需要配置同样的环境变量
4.8.授权为 hadoop 用户
hadoop 部署的准备工作基本完成,为了确保安全, hadoop 系统不以 root 用户启动,我们以普通用户 hadoop 来启动整个 Hadoop 服务,所以,现在需要对文件权限进行授权。
注意:请确保已经提前创建好了 hadoop 用户(前面章节中有讲述),并配置好了 hadoop 用户之间的免密登录
以 root 身份,在 node1 、 node2 、 node3 三台服务器上均执行如下命令:
# 以 root 身份,在三台服务器上均执行 chown -R hadoop:hadoop /data chown -R hadoop:hadoop /export
4.9.格式化整个文件系统
前期准备全部完成,现在对整个文件系统执行初始化,注意格式化的时候需要使用hadoop账户初始化,不能使用root账户,切记!!!
- 格式化 namenode
# 确保以 hadoop 用户执行 su hadoop # 格式化 namenode hadoop namenode -format
- 启动
# 一键启动 hdfs 集群 start-dfs.sh # 一键关闭 hdfs 集群 stop-dfs.sh # 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行 /export/server/hadoop/sbin/start-dfs.sh /export/server/hadoop/sbin/stop-dfs.sh
4.8.查看 HDFS WEBUI
启动完成后,可以在浏览器打开:http://node1(或者公网ip):9870 ,即可查看到 hdfs 文件系统的管理网页。
为了方便我们操作Hadoop,可以将Hadoop的一些脚本、程序配置到PATH中,方便后续使用
安装完成后,也可以在机器上查看启动节点服务:
jps
五、HDFS 的 Shell 操作
5.1.进程启停管理
5.1.1.一键启停脚本
Hadoop HDFS 组件内置了 HDFS 集群的一键启停脚本。
⑴.$HADOOP_HOME/sbin/start-dfs.sh ,一键启动 HDFS 集群,执行原理:
- 在执行此脚本的机器上,启动 SecondaryNameNode
- 读取 core-site.xml 内容( fs.defaultFS 项),确认 NameNode 所在机器,启动 NameNode
- 读取 workers 内容,确认 DataNode 所在机器,启动全部 DataNode
⑵.$HADOOP_HOME/sbin/stop-dfs.sh ,一键关闭 HDFS 集群,执行原理:
- 在执行此脚本的机器上,关闭 SecondaryNameNode
- 读取 core-site.xml 内容( fs.defaultFS 项),确认 NameNode 所在机器,关闭 NameNode
- 读取 workers 内容,确认 DataNode 所在机器,关闭全部 NameNode
5.1.2.单进程启停
除了一键启停外,也可以单独控制进程的启停。
1. $HADOOP_HOME/sbin/hadoop-daemon.sh ,此脚本可以单独控制所在机器的进程的启停,用法:
hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
2. $HADOOP_HOME/bin/hdfs ,此程序也可以用以单独控制所在机器的进程的启停,用法:
hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)
5.2.文件系统操作命令
5.2.1.HDFS文件系统基本信息
HDFS作为分布式存储的文件系统,有其对数据的路径表达方式。HDFS同Linux系统一样,均是以/作为根目录的组织形式
上面的路径在Linux和HDFS中表示:
- Linux: /usr/local/file1.txt
- HDFS: /usr/local/file2.txt
如何区分呢?
Linux:file:/// HDFS:hdfs://namenode:port/ 如上路径分别表示为: Linux:file:///usr/local/file1.txt HDFS:hdfs://node1:8020/usr/local/file2.txt
协议头file:/// 或 hdfs://node1:8020/可以省略
- 需要提供Linux路径的参数,会自动识别为file://
- 需要提供HDFS路径的参数,会自动识别为hdfs://
除非你明确需要写或不写会有BUG,否则一般不用写协议头
5.2.2.HDFS文件系统操作命令
关于HDFS文件系统的操作命令,Hadoop提供了2套命令体系:
⑴.hadoop命令(老版本用法),用法:
hadoop fs [generic options]
如下:
⑵.hdfs命令(新版本用法),用法:
hdfs dfs [generic options]
如下:
注意:两者在文件系统操作上,用法完全一致用哪个都可以,某些特殊操作需要选择hadoop命令或hdfs命令
5.2.3.创建文件夹
语法如下:
hadoop fs -mkdir [-p] <path> ...
hdfs dfs -mkdir [-p] <path> ...
参数:
- path为待创建的目录
- -p选项的行为与Linux mkdir -p一致,它会沿着路径创建父目录。
案例如下:
hadoop fs -mkdir -p /hello/bigdata
hadoop fs -mkdir -p /hi/hadoop
5.2.4.查看指定目录下内容
语法:
hadoop fs -ls [-h] [-R] [<path> ...]
hdfs dfs -ls [-h] [-R] [<path> ...]
参数:
- path 指定目录路径
- -h 人性化显示文件size
- -R 递归查看指定目录及其子目录
说明:
5.2.5.上传文件到HDFS指定目录下
这里的上传文件指的是将文件从Linux上传到hdfs语法:
hadoop fs -put [-f] [-p] <localsrc> ... <dst>
hdfs dfs -put [-f] [-p] <localsrc> ... <dst>
参数:
- -f 覆盖目标文件(已存在下)
- -p 保留访问和修改时间,所有权和权限。
- localsrc 本地文件系统(客户端所在机器)
- dst 目标文件系统(HDFS)
案例:
也可以在上传的时候添加协议头
hdfs dfs -put file:///opt/hadoop-3.3.4.tar.gz hdfs://node1:8020/hi/hadoop
5.2.6.查看HDFS文件内容
读取指定文件全部内容,显示在标准输出控制台。语法如下:
hadoop fs -cat <src> ...
hdfs dfs -cat <src> ...
读取大文件可以使用管道符配合more
hadoop fs -cat <src> | more
hdfs dfs -cat <src> | more
案例:
5.2.7.下载HDFS文件
下载也是从HDFS下载到Linux文件,语法:
hadoop fs -get [-f] [-p] <src> ... <localdst>
hdfs dfs -get [-f] [-p] <src> ... <localdst>
参数:
- 下载文件到本地文件系统指定目录,localdst必须是目录
- -f 覆盖目标文件(已存在下)
- -p 保留访问和修改时间,所有权和权限。
案例:
5.2.8.拷贝HDFS文件
语法说明:
hadoop fs -cp [-f] <src> ... <dst>
hdfs dfs -cp [-f] <src> ... <dst>
参数:
- -f 覆盖目标文件(已存在下)
案例:
5.2.9.追加数据到HDFS文件中
这里的追加指的是将一个文件中内容追加到另一个文件,语法:
hadoop fs -appendToFile <localsrc> ... <dst>
hdfs dfs -appendToFile <localsrc> ... <dst>
参数:
- 将所有给定本地文件的内容追加到给定dst文件。
- dst如果文件不存在,将创建该文件。
- 如果<localSrc>为-,则输入为从标准输入中读取。
案例:
5.2.10.HDFS数据移动操作
移动文件到指定文件夹下,可以使用该命令移动数据,重命名文件的名称,语法如下:
hadoop fs -mv <src> ... <dst>
hdfs dfs -mv <src> ... <dst>
案例:
5.2.10.HDFS数据删除操作
语法:
hadoop fs -rm -r [-skipTrash] URI [URI ...]
hdfs dfs -rm -r [-skipTrash] URI [URI ...]
参数
- 删除指定路径的文件或文件夹
- -skipTrash 跳过回收站,直接删除
回收站功能默认关闭,如果要开启需要在core-site.xml内配置:
<property> <name>fs.trash.interval</name> <value>1440</value> </property> <property> <name>fs.trash.checkpoint.interval</name> <value>120</value> </property>
无需重启集群,在哪个机器配置的,在哪个机器执行命令就生效。回收站默认位置在:/user/用户名(hadoop)/.Trash
案例
5.2.11.HDFS shell其他命令
命令官方指导文档
https://hadoop.apache.org/docs/r3.3.4/hadoop-project-dist/hadoop-common/FileSystemShell.html
5.2.12.HDFS WEB浏览
除了使用命令操作HDFS文件系统外,在HDFS的WEB UI上也可以查看HDFS文件系统的内容。
使用WEB浏览操作文件系统,一般会遇到权限问题,(上面点击删除就会出现):
这是因为WEB浏览器中是以匿名用户(dr.who)登陆的,其只有只读权限,多数操作是做不了的。如果需要以特权用户在浏览器中进行操作,需要配置如下内容到core-site.xml并重启集群(切记一定要重启集群)
<property> <name>hadoop.http.staticuser.user</name> <value>hadoop</value> </property>
注意:不推荐这样做,HDFS WEBUI只读权限比较安全的,简单浏览即可,如果给与高权限,会有很大的安全问题,造成数据泄露或丢失。
5.3.HDFS客户端 (Jetbrians产品插件)
Big Data Tools 插件,在 Jetbrains 的产品中,均可以安装插件,其中: Big Data Tools 插件可以帮助我们方便的操作 HDFS ,比如
- IntelliJ IDEA ( Java IDE )
- PyCharm ( Python IDE )
- DataGrip ( SQL IDE )
均可以支持 Bigdata Tool 插件。如果有使用以上几款 IDE ,就可以安装此插件进行 HDFS 操作。下面以 DataGrip ( PyCharm 、 IDEA 均可)进行演示。
5.3.1.Big Data Tools 插件
如图,在设置 ->Plugins (插件) -> Marketplace (市场),搜索 Big Data Tools ,点击 Install 安装即可
5.3.2.配置 Windows
⑴.需要对 Windows 系统做一些基础设置,配合插件使用
解压 Hadoop 安装包到 Windows 系统,如解压到: D:\tools\hadoop-3.3.4,设置 $HADOOP_HOME 环境变量指向: D:\tools\hadoop-3.3.4,如下图:
将%HADOOP_HOME%\bin加入到path里面
⑵.下载
下载两个插件
- hadoop.dll ( https://github.com/steveloughran/winutils/blob/master/hadoop-3.0.0/bin/hadoop.dll )
- winutils.exe ( https://github.com/steveloughran/winutils/blob/master/hadoop-3.0.0/bin/winutils.exe )
将 hadoop.dll 和 winutils.exe 放入 $HADOOP_HOME/bin 中
5.3.3.配置 Big Data Tools 插件
或者如图指定 Windows 上解压的 Hadoop 安装文件夹的 etc/hadoop 目录也可以,会自动读取配置文件连接上HDFS
配置创建连接
连接后可以选择创建文件夹、文件、上传文件
也可以对于文件进行重命名、移动和复制
5.3.4.配置 Big Data Tools 插件指定文件夹连接
除了上面的连接方式,也可以指定 Windows 上解压的 Hadoop 安装文件夹的 etc/hadoop 目录连接,会自动读取配置文件连接上 HDFS,如下:
但是我这里出现了一直在加载的情况,所以建议通过之前的方式进行。
5.4.HDFS Shell 命令权限不足问题解决
想必有同学在实战 Shell 的时候,遇到了:
Permission denied: user=root, access=WRITE,inode="/":hadoop:supergroup:drwxr-xr-x
这种类似问题的原因就是没有权限,那么为什么呢?
5.4.1.HDFS 超级用户
如图所示
HDFS 中,也是有权限控制的,其控制逻辑和 Linux 文件系统的完全一致。但是不同的是,大家的 Superuser 不同(超级用户不同):
- Linux 的超级用户是 root
- HDFS 文件系统的超级用户:是启动 namenode 的用户(也就是之前用的 hadoop 用户)
所以遇到此问题请首先确保你的 HDFS 操作命令是以: hadoop 用户执行的, root 用户在 HDFS 上其实没特权。
5.4.2.修改权限
在 HDFS 中,可以使用和 Linux 一样的授权语句,即: chown 和 chmod
- 修改所属用户和组:
hadoop fs -chown [-R] root:root /xxx.txt
hdfs dfs -chown [-R] root:root /xxx.txt
- 修改权限
hadoop fs -chmod [-R] 777 /xxx.txt hdfs dfs -chmod [-R] 777 /xxx.txt
六、HDFS的存储原理
6.1.存储原理
HDFS 分布式文件采用分布式存储:每个服务器(节点)存储文件的一部分
⑴.问题:采用分布式存储,但是由于文件大小不一,不利于统一管理,怎么解决这个问题?
解决方案:
- 设定统一的管理单位Block 块, 是HDFS 最小存储,单位每个 256MB (可以修改)
- 一个文件分成多个 Block 块,Block 块分三份存入对应服务器
⑵.问题:一个文件如果分成多个Block快存入,如果丢失或损坏了某个 Block 块呢?
丢失一个 Block 块就导致文件不完整了,Block 块越多,损坏的几率越大,通过多个副本(备份)解决,每个 Block 块都有 2 个(可修改)备份,每个副本都复制到其它服务器一份。每个块都有 2 个备份在其它服务器上
6.2.fsck命令
6.2.1.HDFS 副本块数量的配置
在前面说了 HDFS 文件系统的数据安全,是依靠多个副本来确保的。如何设置默认文件上传到 HDFS 中拥有的副本数量呢?可以在 hdfs-site.xml 中配置如下属性:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
这个属性默认是 3 ,一般情况下,我们无需主动配置(除非需要设置非 3 的数值),如果需要自定义这个属性,请修改每一台服务器的 hdfs-site.xml 文件,并设置此属性。
- 除了配置文件外,我们还可以在上传文件的时候,临时决定被上传文件以多少个副本存储。
hadoop fs -D dfs.replication=2 -put test.txt /tmp/
说明:上面命令,就可以在上传 test.txt 的时候,临时设置其副本数为 2
- 对于已经存在 HDFS 的文件,修改 dfs.replication 属性不会生效,如果要修改已存在文件可以通过命令
hadoop fs -setrep [-R] 2 path
说明:
- 如上命令,指定 path 的内容将会被修改为 2 个副本存储。
- -R 选项可选,使用 -R 表示对子目录也生效。
6.2.2.fask命令
fsck 命令检查文件的副本数,同时,我们可以使用 hdfs 提供的 fsck 命令来检查文件的副本数
hdfs fsck path [-files [-blocks [-locations]]]
fsck 可以检查指定路径是否正常
- -files 可以列出路径内的文件状态
- -files -blocks 输出文件块报告(有几个块,多少副本)
- -files -blocks -locations 输出每一个 block 的详情
上传文件,设置block块数量5:
查看上传文件后的block块的信息:
6.2.3.block 配置
可以看到通过 fsck 命令我们验证了:
- 文件有多个副本
- 文件被分成多个块存储在 hdfs
对于块( block ), hdfs 默认设置为 256MB 一个,也就是 1GB 文件会被划分为 4 个 block 存储。块大小可以通过参数:
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
<description> 设置 HDFS 块大小,单位是 b</description>
</property>
如上,设置为256MB
6.3.NameNode元数据
6.3.1.edits 文件
在hdfs中,文件是被划分了一堆堆的 block 块,那如果文件很大、以及文件很多, Hadoop 是如何记录和整理文件,和 block 块的关系呢?答案就在于 NameNode中的内容
注意:NameNode 基于一批 edits 和一个 fsimage 文件的配合完成整个文件系统的管理和维护
edits 文件,是一个流水账文件,记录了 hdfs 中的每一次操作,以及本次操作影响的文件其对应的 block
6.3.2.fsimage 文件
将全部的 edits 文件,合并为最终结果,即可得到一个 FSImage 文件,换言之。
6.3.3.NameNode 元数据管理维护
NameNode 基于 edits 和 FSImage 的配合,完成整个文件系统文件的管理。
⑴.每次对 HDFS 的操作,均被 edits 文件记录
⑵.edits 达到大小上限后,开启新的 edits 记录
⑶.定期进行 edits 的合并操作
- 如当前没有 fsimage 文件, 将全部 edits 合并为第一个 fsimage
- 如当前已存在 fsimage 文件,将全部 edits 和已存在的 fsimage 进行合并,形成新的 fsimage
⑷.重复 123 流程
6.3.4.元数据合并控制参数
对于元数据的合并,是一个定时过程,基于:
- dfs.namenode.checkpoint.period ,默认 3600 (秒)即 1 小时
- dfs.namenode.checkpoint.txns ,默认 1000000 ,即 100W 次事务
只要有一个达到条件就执行。
检查是否达到条件,默认 60 秒检查一次,基于:
- dfs.namenode.checkpoint.check.period ,默认 60 (秒),来决定
6.3.5.SecondaryNameNode 的作用
对于元数据的合并,主要是HDFS 集群有一个辅助角色SecondaryNameNode来实现的:
合并元数据的事情就是SecondaryNameNode做的, SecondaryNameNode会通过 http请求 从 NameNode 拉取数据( edits 和 fsimage )然后合并完成后提供给 NameNode 使用。
6.4.HDFS 数据的读写流程
6.4.1.数据写入流程
流程说明:
- 客户端向 NameNode 发起请求
- NameNode 审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的 DataNode 地址
- 客户端向指定的 DataNode 发送数据包
- 被写入数据的 DataNode 同时完成数据副本的复制工作,将其接收的数据分发给其它 DataNode
- 如上图, DataNode1 复制给 DataNode2 ,然后基于 DataNode2复制给 Datanode3 和 DataNode4
- 写入完成客户端通知 NameNode , NameNode 做元数据记录工作
注意:
- NameNode 不负责数据写入,只负责元数据记录和权限审批
- 客户端直接向 1 台 DataNode 写数据,这个 DataNode 一般是离客户端最近(网络距离)的那一个
- 数据块副本的复制工作,由 DataNode 之间自行完成(构建一个PipLine ,按顺序复制分发,如图 1 给 2, 2 给 3 和 4 )
6.4.2.数据读取流程
流程说明:
- 客户端向 NameNode 申请读取某文件
- NameNode 判断客户端权限等细节后,允许读取,并返回此文件的 block 列表
- 客户端拿到 block 列表后自行寻找 DataNode 读取即可
注意:
- 数据同样不通过 NameNode 提供
- NameNode 提供的 block 列表,会基于网络距离计算
尽量提供离客户端最近的,因为 1 个 block 有 3 份,会尽量找离客户端最近的那一份让其读取
•读取workers内容,确认DataNode所在机器,关闭全部NameNode