HDFS 分布式文件系统
Posted hanchaoyue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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删除掉
6.3 源码剖析
========================================================
8-2 hdfs 下 01:24:00
以上是关于HDFS 分布式文件系统的主要内容,如果未能解决你的问题,请参考以下文章