HDFS 分布式文件系统
HDFS分布式文件系统
一、课前准备
1. 安装VMware 15虚拟化软件
2. 安装Centos 7虚拟机3个
3. 安装3节点的hadoop2.X集群
4. 某台虚拟机节点安装IDEA
二、课堂主题
本堂课主要围绕HDFS进行讲解,主要包括三方面
1. 架构原理
2. 核心概念
3. HDFS命令行
4. HDFS编程
三、课堂目标
1. 理解分布式思想
2. 理解并描述HDFS工作原理
3. 会搭建高可用集群
4. 理解HDFS如何解决大量小文件存储问题
四、知识要点
1. Hadoop是什么
1.1 Hadoop结构
HDFS (hadoop distributed file system)
hadoop由三个模块组成:分布式存储HDFS、分布式计算MapReduce、资源调度引擎Yarn
1.4 HDFS是什么
Hadoop分布式文件系统
适合存储大文件,不适合存储小文件
{ 数据量小,单台服务器可存储下来
数据量大,分散存储在不同的服务器中;单个文件100T;
将文件分成一个个block,分散存储在不同的服务器
一、分布式文件系统
HDFS
大量的文件可以分散的存储在不同的服务器上边
单个文件比较大,单块存盘存不下,可以切分成很多小的block块,分散存储在不同的服务器上边
(各服务器通过网路连接,造成一个整体)
二、HDFS使用命令-命令行方式
查看目录
hdfs dfs -ls /hdfs
上传文件
hdfs dfs -put /本地文件 /hdfs目录
下载文件
hdfs dfs -get /hdfs文件 /本地目录
创建目录
hdfs dfs -mkdir /bg0630
删除文件
hdfs dfs -rm -r /1.txt
向文件中追加内容
hdfs dfs -appendToFile part-r-000 /fs.txt
...
三、启动集群
start-dfs.sh 启动hdfs集群(主节点、管理节点运行)
不要在从节点运行start-all.sh 或者start-dfs.sh
四、HDFS原理
分块存储 -> block -> 128M
每个文件的最后一个block可能小于128M,但是存储时,不会占据128M
3副本;hdfs-site.xml
官网的配置
机架存储策略(是hdfs自动决策,不需要人工干预)
可通过命令设置文件的副本数
}
3. 核心概念block
3.1 数据块block
3.1.1 HDFS block块
- HDFS3.x上的文件,是按照128M为单位,切分成一个个block,分散的存储在集群的不同数据节点
datanode上
- 问:HDFS中一个44M大小的块会不会占据128M的空间?
- 问:这样存储有没有问题?
3.2 block副本
保证数据的可用及容错
- replication=3默认值,最大值512
- hdfs-site.xml
3.3 机架存储策略
3.4 block的一些操作
- 设置文件副本数,有什么用?
hdfs dfs -setrep -R 4 /path
- 查看文件的块信息?
hdfs dfs /02-041-0029.mp4 -files -blocks -locations
4. HDFS体系架构(主从架构,一主多从)
hdfs是主从架构Master/Slave、管理节点/工作节点
4.1 NameNode
- fs文件系统、用来存储、读取数据
- 读文件->找到文件->在哪+叫啥?
- window->虚拟机说明.txt
HDFS也是fs,它也有metadata;由NameNode存储在其内存中
1.管理节点,负责管理文件系统和命名空间,存放了HDFS的元数据
2. 元数据、文件系统树、所有的文件和目录、每个文件的块列表、块所在的datanode等
3. 文件、block、目录占用大概150Byte字节的元数据;所以HDFS适合存储大文件,不适合存储小文件
4. 元数据信息以命名空间镜像文件fsimage和编辑日志(edits log)的方式保存
fsimage:元数据镜像文件,保存了文件系统目录数据信息以及文件和块的对应关系
edits log:日志文件,保存文件系统的更改记录
/data/cache1/dfs/nn/
4.2 DataNode
存储block,以及block元数据包括数据块的长度、块数据的校验和、时间戳
4.3 SeconddaryNameNode
问:
1. 为什么元数据存储在NameNode在内存中? 快
2. 这样做有什么问题? 丢数据
3. 怎么解决?
它一般部署在另外一台节点上,因为它需要占用大量的CPU时间,并需要与namenode一样多的
内存,来执行合并操作
双缓存策略
checkpoint定时策略 1h同步一次或者其他时间同步一次
5. HDFS机制
5.1 心跳机制
工作原理:
1. master启动的时候,会开一个ipc server在那里
2. slave启动,连接master,每隔3秒钟向master发送一个 "心跳",携带状态信息
3. master通过这个心跳的返回值,向slave节点传达指令
作用:
1. Namenode全权管理数据块的赋值,它周期性地从集群中的每个Datanode接收心跳信号和状态报告
(Blockreport),接收到心跳信号意味着该Datanode节点工作正常。块状态报告包含了一个
该Datanode上所有数据块的列表。
2. DataNode启动后想NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的
块的列表;每3秒想NameNode发一次心跳,返回NameNode给该DataNode的命令;
如果复制块数据到另一台机器,或删除某个数据块。如果NameNode超过10分钟没有收到
某个DataNode的心跳,则认为该接待您不可用。
3. hadoop集群刚开始启动时,会进入安全模式(99.9%),就用到了心跳机制
5.2 负载均衡
什么原因会有可能造成不均衡?
增加新节点,增加新磁盘,存储不均衡
为什么需要均衡?
增加性能,增加利用率 ,存储均衡,读写均衡
如何均衡?
(NameNode知道每个磁盘(DataNode)的利用率,进行计算)
$HADOOP_HOME/sbin/start-balance.sh -t 5%
6. HDFS读写流程
6.1 数据读流程
6.1.1 基本流程
- 客户端与NameNode通讯获取文件的块位置信息,其中包括了块的所有冗余备份的位置信息:DataNode的列表
- 客户端获取文件位置信息后直接同有文件的DataNode通讯,读取文件
- 如果第一个DataNode无法连接,客户端自动联系下一个DataNode
- 如果块数据的校验值出错,则客户端需要向NameNode报告,并自动联系下一个DataNode
6.1.2容错
- 如果client从datanode读取block时吗,网络中断怎么办?
读的过程网络中断,(3份),找到另外几个副本,去另外几个节点上读取
并记录这个datanode,不会从该节点读取数据
恢复:网络自动恢复、如果节点挂了,其他节点同步副本数
- client如何保证读取的数据量是完整的?
存的时候含有checksum校验和(CRC32-),读取的时候也会读取checksum,并读取的时候计算一个值,并对比两个值是否相等
如果不相等,哪个节点的block块有问题,则换一个节点读取,并告诉namenode哪个节点block块有问题,并从其他节点复制一份数据到该节点
- 如果client读取的数据不完整,怎么办?
如果不相等,哪个节点的block块有问题,则换一个节点读取,并告诉namenode哪个节点block块有问题,并从其他节点复制一份数据到该节点
6.2 数据写流程
1. HDFS client 向NameNode联系,告诉客户端block存储在哪些节点上
namenode做的事情
1.1 判断nn是否正常
1.2 判断文件是否存在
1.3 判断client是否有权限
1.4 向 edits.log写日志
2. 写的过程包含checksum
先把数据写到 chunk 512Byte + 4 Byte校验值===>516字节
把chunk放到package 54KB
package满之后放入 data queue
从 queue里拿出package 写到 datanode
写的过程同时,把package 放到ack queue 队列,data queue就没有了
当package传输失败(校验chunk异常),就会把ack queue队列里的package重新放到data queue,重新传输
如果传输成功,就直接把ack queue里的package删除掉
包括副本传完之后,校验返回,不是传完一个校验一个
副本同步过程中,一个副本中断
1 关闭pipeline
2 id,version更新
3 告诉namenode新的id,version
4 namenode去datanode删除旧版数据
5 构建一个新的pipeline(不包含坏掉数据的节点)
6
6.3 源码剖析
7. Hadoop高可用
要花时间恢复原数据metadata
zkfc进程,查看Active NN是否存活,
告知Standby NN是否需要启动
8. Hadoop联邦
8.1 为什么需要高可用与联邦
- 集群的元数据保存在namenode内存中
- 每个文件、目录、block占用约150字节
- 对于一个拥有大量文件的超大集群来说,内存将成为限制系统横向扩展的瓶颈
- 扩展性、吞吐量、隔离性
(集群规模达到几千台的规模)
8.2 联邦
NN-1 命名空间,与之对应的文件名块
NN-2
NN-3
多个NN管理元数据信息等操作
9 HDFS编程
10 存储大量小文件
10.1 有没有问题
- NameNode存储着文件系统的元数据,每个文件、目录、块大概有150字节的元数据
- 因此文件数量的限制也由NN内存大小决定,如果小文件过多测绘造成NN的压力过大
10.2 如何解决
1. HAR文件方案(本质启动mr程序,所以需要启动yarn)
是个命令
#创建archive文件
hadoop archive -archiveName test.har -p /testhar -r 3 th1 th2 /outhar
test.har 合并之后的文件名
-p 多级目录
-r 副本
th1 子路径
th2 子路径
/outhar 保存的路径
#查看archive文件
hdfs dfs -ls -R har:///outhar/test.har
#解压archive文件
hdfs dfs -cp har:///outhar/test.har/th1 hdfs:/unarchivef
hdfs dfs -ls /unarchivef #顺序
hadoop distcp har://outhar/test.har/th1 hdfs:/unarchivef2 #并行,启动MR
2. Sequence Files方案
其和兴是以文件名为key,文件内容为value组织小文件。10000个100kb的小文件,可以
编写程序将这些文件放到一个SequenceFile文件,然后就以数据流的方式处理这些文件,
也可以使用MapReduce进行处理。一个SequenceFile是可分割的,所以MapReduce
可将文件切分成块,每一个块独立操作。不像HAR,SequenceFile支持压缩。
在大多数情况下,以block为单位进行压缩是最好的选择,因为一个block包含多条记录,
压缩作用在block上,比reduce压缩方式(一条一条记录进行压缩)的压缩比高,
把已有的数据转存为SequenceFile比较慢。比起先写小文件,再将小文件写入SequenceFile
一个更好的选择是直接将数据写入一个SequenceFile文件,省去小文件作为中间媒介。
五、拓展点
1. HDFS存储地位
2. block块为什么设置的比较大
- 磁盘块
- 为了最小化寻址开销;从磁盘传输数据的时间明显大于定位这个快开始位置所需的时间
- 问:快的大小是不是设置的越大越好呢?
寻址时间要远远小于读取时间