文章目录
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
如果服役的节点数小于等于配置中的副本数,说明节点不够备份用,不允许退役,此时需要修改副本数才能退役成功