HDFS组成架构

NameNode:

  • 管理HDFS名称空间
  • 配置副本策略
  • 管理数据块Block的映射信息
  • 处理客户端读写请求

SecondaryNameNode:

  • 辅助NameNode,定期合并Fsimage和Edits,推送给NameNode
  • 紧急情况辅助恢复NameNode

DateNode:

  • 存储实际的数据块
  • 执行数据块的读、写操作

Client:

  • 文件切分。文件上传HDFS时,文件切为一个个Block,然后上传
  • 与NameNode交互,获得文件的位置信息
  • 与DataNode交互,读取或者写入数据
  • 提供命令管理HDFS,比如NameNode格式化
  • 通过命令访问HDFS,比如CRUDx操作

HDFS的Shell操作

文件上传下载

上传

# 复制 当前目录下的文件或者当前文件 目标文件夹

hadoop fs -putFromLocal dangqian /mubiao

-copyFromLocal

# 剪切

-moveFromLocal

练习:

cd /opt/module/hadoop

vim anqila.txt

hadoop fs -put anqila.txt /

追加

追加一个文件到已有文件的末尾

hadoop fs -appendToFile dangqian /mubiao/xxx.txt

把peopleKing中的内容追加到anqila中

hadoop fs -appendToFile peopleKing.txt /anqila.txt

整活:

下载

-copyToLocal

-get //已存在默认不下载 java api中可覆盖

当前没有zhaoyun.txt

把/xiyou下的zhaoyun.txt下载到本地

hadoop fs -get /xiyou/zhaoyun.txt ./

直接操作

hadoop fs -ls /

hadoop fs -cat /mubiao/xxx.txt

-charp 所属组

-chmod 权限

-chown 所有者 所属组

删除

不能-rf

hadoop fs -rm -r -f /mubiao

统计目录信息

第一列文件大小,第二列总副本数大小

-du -h 切换单位 -s 汇总当前大文件夹

改副本数

-setrep

操作hdfs-api的windows环境准备:

配hadoop环境变量

hadoop.dll winutils.exe 复制到system32

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读数据流程

(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。

(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。

(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。

(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

NN和2NN工作机制

1)第一阶段:NameNode启动

(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

(2)客户端对元数据进行增删改的请求。

(3)NameNode记录操作日志,更新滚动日志。

(4)NameNode在内存中对元数据进行增删改。

2)第二阶段:Secondary NameNode工作

(1)SecondaryNameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。

(2)SecondaryNameNode请求执行CheckPoint。

(3)NameNode滚动正在写的Edits日志。

(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。

(5)SecondaryNameNode加载编辑日志和镜像文件到内存,并合并。

(6)生成新的镜像文件fsimage.chkpoint。

(7)拷贝fsimage.chkpoint到NameNode。

(8)NameNode将fsimage.chkpoint重新命名成fsimage。

DataNode保证数据完整性

(1)当DataNode读取Block的时候,它会计算CheckSum。

(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。

(3)Client读取其他DataNode上的Block。

(4)常见的校验算法crc(32),md5(128),sha1(160)。

(5)DataNode在其文件创建后周期验证CheckSum。

DataNode工作机制

(1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

(2)DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息。

DN向NN汇报当前解读信息的时间间隔,默认6小时;

<property>
 <name>dfs.blockreport.intervalMsec</name>
   <value>21600000</value>
   <description>Determinesblock reporting interval in milliseconds.</description>
</property>

DN扫描自己节点块信息列表的时间,默认6小时。

<property>
 <name>dfs.datanode.directoryscan.interval</name>
   <value>21600s</value>
   <description>Intervalin seconds for Datanode to scan data directories and reconcile the differencebetween blocks in memory and on the disk.
   Support multiple time unitsuffix(case insensitive), as described
   in dfs.heartbeat.interval.
   </description>
</property>

(3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。

(4)集群运行中可以安全加入和退出一些机器。

服役新数据节点

从104克隆出来一台105,需要删除105上104原有的data和logs数据,然后在105上单点启动hdfs和yarn服务即可

如果数据不均衡,可以用以下命令实现集群的再平衡:

[atguigu@hadoop102 sbin]$ ./start-balancer.sh

starting balancer, logging to /opt/module/hadoop-3.1.3/logs/hadoop-atguigu-balancer-hadoop102.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved

退役新数据节点

添加黑名单和白名单

白名单和黑名单:在白名单内的节点都可以访问NN,不在白名单的节点不允许访问NN,添加到黑名单的节点也不允许访问NN,并在数据迁移后下线

白名单whitelist的内容与works一致,但是需要配置白名单的路径到配置文件,并分发到所有节点

黑名单blacklist也需要配置,并分发到所有节点

将以下内容添加到hdfs-site.xml,并用xsync脚本分发到所有节点

<!-- 白名单 -->
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>
</property>
<!-- 黑名单 -->
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>
</property>

此时需要重启集群,由于105没有配到workers,还是需要单节点重启

黑名单退役

将105(要退役的节点)添加到blackilst,并把blacklist分发到所有节点

刷新NN、刷新ResourceManager:

[atguigu@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes

[atguigu@hadoop102 hadoop-3.1.3]$ yarn rmadmin -refreshNodes

如果服役的节点数小于等于配置中的副本数,说明节点不够备份用,不允许退役,此时需要修改副本数才能退役成功