本文重点
理解分布式文件存储的概念与实现 掌握HDFS分块存储、副本机制等特性 学会shell操作HDFS 掌握HDFS读写流程 理解NameNode元数据管理机制 理解SecondaryNameNode checkpoint机制
内容大纲
#HDFS入门 HDFS介绍 如何模拟实现分布式文件存储系统? 具备哪些特性。 分布式、分块存储、副本机制、元数据管理 HDFS设计目标和重要特性 #HDFS操作 shell command #HDFS原理(重中之重) 工作机制--读写流程 角色之间如何配合的 每个角色承担了什么职责 NN DN角色职责概述总结 #HDFS辅助功能 distcp 跨集群复制数据 Archive 归档文件 处理小文件 Snapshot 快照 #HDFS元数据管理机制 namenode如何管理元数据 secondarynamenode职责 checkpoint机制 #HDFS安全模式 #理清两个东西 数据data 元数据metadata
一、Apache HDFS入门
1.1、HDFS基本概念
- 首先是一个文件系统,就是用来存储文件、存储数据。是大数据最底层一个服务。
- 其次是一个分布式的文件系统。分布式意味着多台机器存储。
如何模拟实现分布式文件系统。
或者说一个成熟的分布式文件系统应该要具备哪些属性、功能呢?
- 分布式多台机器存储
- 记录元数据
- 分块存储
- 副本机制(备份)
1.2、Hadoop团队针对HDFS设计目标
- 具备故障检测和快速恢复的能力(容错)
- 面对海量数据的存储,注重吞吐能力,而不是交互式。(延迟高)
- 支持大文件存储(越大越开心)
- 一次写入多次读取模型 (不支持修改操作)
- 异构存储、可移植性
master|slaves 主从架构
主角色:namenode 管理维护着元数据:目录树结构 文件 大小 副本 备份 位置信息 从角色:datanode 存储着最终的数据块
分块存储
物理上把文件分开了。 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副本。 1+2=3 本身一份 额外两份 最终3副本。
namespace 名字空间 命名空间
#namespace即“命名空间”,也称“名称空间” 层次感结构 兼顾传统对应文件系统的认知 目录树结构 用户可以针对目录树进行文件夹、文件的增删改查。 统一的抽象目录树。
metadata 元数据
元数据:记录数据的数据 描述性数据、解释性数据 对于HDFS来说,目录结构及文件分块位置信息叫做元数据。 元数据是有namenode维护的。
write one read many
hdfs的模式是一次写入多次读取 hdfs没有随机修改编辑的操作 只能对已有的数据进行追加。 设计目标是这么决定的。 侧重于数据吞吐量 不注重实时交互性 意味着hdfs操作延迟很高。
二、HDFS shell操作
2.1、shell 命令解释
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 3 items drwxr-xr-x - root supergroup 0 2023-02-01 21:26 /itcast drwx------ - root supergroup 0 2023-01-31 15:03 /tmp drwxr-xr-x - root supergroup 0 2023-01-31 15:03 /user #默认是谁,取决于参数fs.defaultFS <property> <name>fs.defaultFS</name> <value>hdfs://node1:8020</value> </property> #如果fs.defaultFS没有配置 默认的是file:/// #新旧命令 推荐使用hadoop fs hadoop fs <args> = hdfs dfs <args>
2.2、shell常见命令操作
# 查看指定目录下信息 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 #追加的用途:把本地的小文件上传中合并成为大文件 解决小文件场景的。 #文件内容的查看 cat 适合小文件 tail 将文件的最后一千字节内容显示到stdout -f参数支持实时追踪查看 #权限 拥有者 所属组修改 hdfs在设计的时候 借鉴模仿着linux权限管理模式 也有所谓的读写执行 user group others 777 chgrp 修改所属组 chmod 修改权限 chown 修改拥有者 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正常的读写服务请求。 因此在实际工作中 事先根据数据的重要性在上传之前就决定该文件的备份数是多少 避免线上修改。
三、HDFS工作机制
3.1、namenode、datanode职责
- namenode 管理元数据 维护namespace
- datanode 管理数据
3.2、读写流程图
- 上传文件写数据流程
- HDFS默认3副本机制
- 下载文件读数据流程
3.3、NameNode与DataNode通信机制
- dn启动时
#datanode向nameNode进行注册 并行汇报自己持有数据块信息 注册表示自己启动成功 汇报是高速namenode自己保存了哪些数据块
dn后续工作时
#心跳机制 datanode每隔3S向namenode进行心跳 目的:报活 dfs.heartbeat.interval #数据块汇报机制 blockreport datanode每隔6小时向nameNode进行数据块汇报自己数据块信息 dfs.blockreport.intervalMsec
四、HDFS辅助工具
4.1、跨集群复制数据 distcp(distributed copy)
- 功能:实现在不同的hadoop集群之间进行数据复制同步。
- 用法:
#同一个集群内 复制操作 hadoop fs -cp /zookeeper.out /itcast #跨集群复制操作 hadoop distcp hdfs://node1:8020/1.txt hdfs:node5:8020/itcast
4.2、文件归档工具 archive
- 背景
hdfs的架构设计不适合小文件存储的。 因为小文件不管多小 都需要一定的元数据记录它 元数据保存在内存中的, 如果集群小文件过多 就会造成内存被撑爆。 俗称 小文件吃内存。
- archive功能
- 将一批小文件归档一个档案文件。
- 底层是通过MapReduce程序将小文件进行合并的。启动yarn集群执行mr程序。
- 企业中可以根据时间 定时进行归档,比如一周创建一个档案。
- 使用
#创建档案 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 2023-02-04 00:48 /small/1.txt -rw-r--r-- 3 root supergroup 2 2023-02-04 00:48 /small/2.txt -rw-r--r-- 3 root supergroup 2 2023-02-04 00:48 /small/3.txt
- 注意
- archive没有压缩的功能 就是简单的合二为一的操作 减少小文件个数。
五、HDFS namenode元数据管理机制
5.1、namenode元数据
- 元数据是什么
元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。 #记录数据的数据 描述数据的数据
- hdfs中元数据指的是什么
- 文件系统的元数据(namespace、块的位置)
- datanodes状态信息(健康、磁盘使用率)
- 回想首次启动HDFS集群的时候 进行format操作
- 本质就是初始化操作 初始化namenode工作目录和元数据文件。
- 元数据存储的目录由参数dfs.namenode.name.dir决定 在NN部署机器的本地linux文件系统中
针对课程环境 最终目录 /export/data/hadoopdata/dfs/name
5.2、secondarynamenode功能职责
- 要想成为namenode的备份 需要具备两个东西
- 数据状态要和namenode保持一致。
- 承担和namenode一样的职责
- secondarynamenode根本不是namenode的备份,其主要职责帮助nameNode进行元数据的合并。
六、HDFS 安全模式
- 安全模式(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. #运维人员可以手动进入安全模式 进行集群的维护升级等动作 避免了群起群停浪费时间。
安全模式的注意事项
- 刚启动完hdfs集群之后 等安全模式介绍才可以正常使用文件系统 文件系统服务才是正常可用。
- 后续如果某些软件依赖HDFS工作,必须先启动HDFS且等安全模式结束才可以使用你的软件。
- 启动–>启动成功–>可用(安全模式结束)