理解分布式文件存储的概念与实现
掌握HDFS分块存储、副本机制等特性
学会shell操作HDFS
掌握HDFS读写流程
理解NameNode元数据管理机制
理解SecondaryNameNode checkpoint机制
#HDFS入门
HDFS介绍
如何模拟实现分布式文件存储系统? 具备哪些特性。
分布式、分块存储、副本机制、元数据管理
HDFS设计目标和重要特性
#HDFS操作
shell command
#HDFS原理(重中之重)
工作机制--读写流程 角色之间如何配合的 每个角色承担了什么职责
NN DN角色职责概述总结
#HDFS辅助功能
distcp 跨集群复制数据
Archive 归档文件 处理小文件
#HDFS元数据管理机制
namenode如何管理元数据
secondarynamenode职责
checkpoint机制
#HDFS安全模式
#理清两个东西 数据data 元数据metadata
元数据:data about data关于数据的数据 描述性的数据
大数据场景下,传统文件系统如何才能支撑海量数据存储?
场景互动:如何模拟实现分布式文件系统。
或者说一个成熟的分布式文件系统应该要具备哪些属性、功能呢?
主角色:namenode 管理维护着元数据:目录树结构 文件 大小 副本 备份 位置信息
从角色:datanode 存储着最终的数据块
(2)分块存储
物理上把文件分开了。
block size =128M 134217728 hadoop2.x (hadoop1.x 64M)
e.g:
1.txt 300M
blk-1 0–128
blk-2 128-256
blk-3 256-300
2.txt 100M
blk-4 0–100
(3)副本机制
默认是3副本。
1+2=3 本身一份 额外两份 最终3副本。
namespace 名字空间 命名空间
namespace即“命名空间”,也称“名称空间”
层次感结构 兼顾传统对应文件系统的认知 目录树结构
用户可以针对目录树进行文件夹、文件的增删改查。
统一的抽象目录树。
(4)metadata 元数据
元数据:记录数据的数据 描述性数据、解释性数据
对于HDFS来说,目录结构及文件分块位置信息叫做元数据。
元数据是有namenode维护的。
(5)write one read many
hdfs的模式是一次写入多次读取
hdfs没有随机修改编辑的操作 只能对已有的数据进行追加。
设计目标是这么决定的。
侧重于数据吞吐量 不注重实时交互性 意味着hdfs操作延迟很高。
hadoop fs <args> 文件系统的路径
#hadoop fs可以操作的文件系统不仅仅有HDFS,还包括本地文件系统、GFS、TFS。
#如何区分操作访问的是什么文件系统呢? 根据文件系统协议
hadoop fs -ls hdfs://node1:8020/
hadoop fs -ls file:///
hadoop fs -ls gfs://
#如果不写协议 直接/目录 操作访问的是谁?
[root@node1 ~]# hadoop fs -ls /
Found 4 items
drwxr-xr-x - root supergroup 0 2021-05-23 16:49 /itcast
drwx------ - root supergroup 0 2021-05-23 16:12 /tmp
drwxr-xr-x - root supergroup 0 2021-05-23 16:12 /user
drwxr-xr-x - root supergroup 0 2021-05-23 16:16 /wc
#默认是谁,取决于参数fs.defaultFS
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
#如果fs.defaultFS没有配置 默认的是file:///
#新旧命令 推荐使用hadoop fs
hadoop fs <args> = hdfs dfs <args>
# 查看指定目录下信息
hadoop fs -ls [-h] [-R] <args>
-h 人性化显示
-R 递归显示
#创建文件夹
hadoop fs -mkdir [-p] <paths>
-p 创建父目录
#上传文件
hadoop fs -put src dst
将单个 src 或多个 srcs 从本地文件系统复制到目标文件系统
#src代表的是本地目录 所谓的本地指的是客户端所在的机器
#dst代表的是HDFS
-p:保留访问和修改时间,所有权和权限。
-f:覆盖目的地(如果已经存在)
hadoop fs -put file:///root/itcast.txt hdfs://node1:8020/itcast
hadoop fs -put itcast.txt /itcast
#下载文件
hadoop fs -get src localdst
#将文件复制到本地文件系统。
hadoop fs -get hdfs://node1:8020/itcast/itcast.txt file:///root/
hadoop fs -get /itcast/itcast.txt ./
#追加内容到文件尾部 appendToFile
[root@node3 ~]# echo 1 >> 1.txt
[root@node3 ~]# echo 2 >> 2.txt
[root@node3 ~]# echo 3 >> 3.txt
[root@node3 ~]# hadoop fs -put 1.txt /
[root@node3 ~]# hadoop fs -cat /1.txt
1
[root@node3 ~]# hadoop fs -appendToFile 2.txt 3.txt /1.txt
[root@node3 ~]# hadoop fs -cat /1.txt
1
2
3
[root@node3 ~]#
#追加的用途:把本地的小文件上传中合并成为大文件 解决小文件场景的。
#文件内容的查看
cat 适合小文件
tail 将文件的最后一千字节内容显示到stdout -f参数支持实时追踪查看
#权限 拥有者 所属组修改
hdfs在设计的时候 借鉴模仿着linux权限管理模式
也有所谓的读写执行 user group others 777
chgrp 修改所属组
chmod 修改权限
cgown 修改拥有者
hadoop fs -chmod 755 /1.txt
#文件移动 复制 删除
mv cp
rm -r递归删除
#合并下载 getmerge
合并下载多个文件 其功能和appendToFile相反的动作
[root@node3 ~]# hadoop fs -mkdir /small
[root@node3 ~]# hadoop fs -put *.txt /small
[root@node3 ~]# hadoop fs -getmerge /small/* ./merge.txt
[root@node3 ~]# cat merge.txt
#统计HDFS可用空间 指定目录大小
[root@node3 ~]# hadoop fs -df -h /
Filesystem Size Used Available Use%
hdfs://node1:8020 111.1 G 5.0 M 98.3 G 0%
#修改文件的副本数
hadoop fs -setrep -w N -R N就是修改之后的副本数
-w wait等待 修改副本客户端是否等待修改完毕再推出
[root@node3 ~]# hadoop fs -setrep 2 /small/1.txt
Replication 2 set: /small/1.txt
[root@node3 ~]# hadoop fs -setrep -w 2 /small/2.txt
Replication 2 set: /small/2.txt
Waiting for /small/2.txt ...
WARNING: the waiting time may be long for DECREASING the number of replications.
. done
#企业中避免使用setrep修改文件的副本数。
副本的修改操作可能会影响hdfs正常的读写服务请求。
因此在实际工作中 事先根据数据的重要性在上传之前就决定该文件的备份数是多少 避免线上修改。
上传文件流程:
(1)客户端RPC请求NN上传文件、NN校验通过,返回可以上传
(2)客户端请求NN上传第一个block(连带副本),NN根据3副本策略返回3台DN位置
(3) 客户端跟返回的DN列表建立pipeline管道(client–>DN1–>DN4–>DN666)
(4)客户端以packet(64k)往pipeline中发送数据
(5)pipeline传输的反方向上进行ack校验
(6)如果本次上传的文件还有其他的block,重复2-5
(7)上传完毕,client向NN汇报上传情况,只要每个block有一个副本成功,就算成功
下载文件流程:
(1)客户端RPC请求NN下载文件、NN校验通过,视情况分批返回块的位置信息
(2)返回的副本位置信息是排序好的,离客户端近的靠前(所谓的近是网络拓扑中的远近 不是空间上的)
(3)客户端连接到第一个block读取数据,在块读取完毕连结到第二个block
(4)如果还有剩余批次,继续请求NN返回块位置信息
(5)把所有数据块读取到本地 按顺序拼接成为文件的最终样子 CRC循环冗余码校验
11.1 DN启动时
datanode向nameNode进行注册 并行汇报自己持有数据块信息
注册表示自己启动成功 汇报是告诉namenode自己保存了哪些数据块
11.2 DN后续工作时
(1) 心跳机制
datanode每隔3S向namenode进行心跳 目的:报活 dfs.heartbeat.interval
(2)数据块汇报机制 blockreport
datanode每隔6小时向nameNode进行数据块汇报自己数据块信息
dfs.blockreport.intervalMsec
12.1 跨集群复制数据 distcp(distributed copy)
功能:实现在不同的hadoop集群之间进行数据复制同步。
用法:
#同一个集群内 复制操作
hadoop fs -cp /zookeeper.out /itcast
#跨集群复制操作
hadoop distcp hdfs://node1:8020/1.txt hdfs:node5:8020/itcast
12.2 文件归档工具 archive
背景
hdfs的架构设计不适合小文件存储的。
因为小文件不管多小 都需要一定的元数据记录它 元数据保存在内存中的,
如果集群小文件过多 就会造成内存被撑爆。 俗称 小文件吃内存。
archive功能
使用
#创建档案
hadoop archive -archiveName test.har -p /small /outputdir
基于自己的需求 删除小文件 减少对内存的消耗
hadoop fs -rm /small/*
#查看档案文件 --归档之后的样子
[root@node1 ~]# hadoop fs -ls hdfs://node1:8020/outputdir/test.har
Found 4 items
hdfs://node1:8020/outputdir/test.har/_SUCCESS
hdfs://node1:8020/outputdir/test.har/_index
hdfs://node1:8020/outputdir/test.har/_masterindex
hdfs://node1:8020/outputdir/test.har/part-0
#查看档案文件 --归档之前的样子
[root@node1 ~]# hadoop fs -ls har://hdfs-node1:8020/outputdir/test.har
Found 3 items
har://hdfs-node1:8020/outputdir/test.har/1.txt
har://hdfs-node1:8020/outputdir/test.har/2.txt
har://hdfs-node1:8020/outputdir/test.har/3.txt
#从档案文件中提取文件
[root@node1 ~]# hadoop fs -cp har://hdfs-node1:8020/outputdir/test.har/* /small/
[root@node1 ~]# hadoop fs -ls /small
Found 3 items
-rw-r--r-- 3 root supergroup 2 2021-05-24 17:58 /small/1.txt
-rw-r--r-- 3 root supergroup 2 2021-05-24 17:58 /small/2.txt
-rw-r--r-- 3 root supergroup 2 2021-05-24 17:58 /small/3.txt
注意
安全模式(safe mode)是HDFS集群处于一种保护状态,文件系统只可以读,不可以写
安全模式如何进入离开的?
自动进入离开
#在HDFS集群刚启动时候 会自动进入 为了演示方便 使用单个进程逐个启动方式
#step1:启动namenode
hadoop-daemon.sh start namenode
#step2: 执行事务性操作 报错
[root@node1 ~]# hadoop fs -mkdir /aaaa
mkdir: Cannot create directory /aaaa. Name node is in safe mode.
Safe mode is ON. The reported blocks 0 needs additional 52 blocks to reach the threshold 0.9990 of total blocks 52. The number of live datanodes 0 has reached the minimum number 0. Safe mode will be turned off automatically once the thresholds have been reached.
#1、条件1:已经汇报的block达到总数据块的 0.999
#2、条件2:存活的dn数量大于等于0 说明这个条件不严格
#step3:依次手动启动datanode
hadoop-daemon.sh start datanode
Safe mode is ON. The reported blocks 52 has reached the threshold 0.9990 of total blocks 52. The number of live datanodes 2 has reached the minimum number 0. In safe mode extension. Safe mode will be turned off automatically in 25 seconds.
#3、条件3:满足12条件的情况下 持续30s 结束自动离开安全模式
Safemode is off.
#为什么集群刚启动的时候 要进入安全模式
文件系统元数据不完整 无法对外提供可高的文件服务 属于内部的元数据汇报、校验、构建的过程。
手动进入离开
hdfs dfsadmin -safemode enter
hdfs dfsadmin -safemode leave
Safe mode is ON. It was turned on manually. Use "hdfs dfsadmin -safemode leave" to turn safe mode off.
#运维人员可以手动进入安全模式 进行集群的维护升级等动作 避免了群起群停浪费时间。
安全模式的注意事项
(1)元数据
元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
记录数据的数据 描述数据的数据
(2)hdfs中元数据
文件系统的元数据(namespace、块的位置)
datanodes状态信息(健康、磁盘使用率)
(3)hdfs文件系统元数据存储位置
内存中元数据
磁盘上元数据文件(fsimage edits log)
回想首次启动HDFS集群的时候 进行format操作
本质就是初始化操作 初始化namenode工作目录和元数据文件。
元数据存储的目录由参数dfs.namenode.name.dir决定 在NN部署机器的本地linux文件系统中
- secondarynamenode要想成为namenode的备份 需要具备两个东西
数据状态要和namenode保持一致。
承担和namenode一样的职责
secondarynamenode根本不是namenode的备份,其主要职责帮助nameNode进行元数据的合并。