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.数据写入

流程说明:

  1. 客户端向 NameNode 发起请求
  2. NameNode 审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的 DataNode 地址
  3. 客户端向指定的 DataNode 发送数据包
  4. 被写入数据的 DataNode 同时完成数据副本的复制工作,将其接收的数据分发给其它 DataNode
  5. 如上图, DataNode1 复制给 DataNode2 ,然后基于 DataNode2复制给 Datanode3 和 DataNode4
  6. 写入完成客户端通知 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
posted @ 2019-10-28 11:58  酒剑仙*  阅读(414)  评论(0编辑  收藏  举报