HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上。它所具有的高容错、高可靠性、高可扩展性、高获得性、高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集(Large Data Set)的应用处理带来了很多便利。
设计思想
分而治之(安全性):将大文件、大批量文件,分布式的存放在大量服务器上
存储方式
存放数据的单位是块。 2.0以后,块的默认大小:128M
主从架构
1.client 客户端
文件切分,文件上传HDFS的时候,client将文件切分成一个一个的block
与NameNode交互,获取文件的位置信息
与DataNode交互,读取或写入数据
Client提供一些命令来管理HDFS,比如启动或关闭HDFS
Client可以通过一些命令来访问HDFS
2.NameNode
就是master,是一个主管、管理者。管理HDFS的名称空间。主节点仅存放元数据信息(文件大小、位置、块索引)。配置副本策略,处理客户端读写请求,分配client去访问哪个从节点
3.DataNode
就是slave,从节点存放真实文件(实际文件)即实际的数据块,执行数据块的读写操作。
namenode下达命令,datanode执行实际的操作。
client客户端发起读取数据的请求,namenode接到请求后会通过元数据信息得到数据位置,最后由datanode将数据最后输出给client客户端
架构内容
1.数据块:默认128M,datanode通过数据块存储。存放在hadoopdata目录下
2.心跳机制:主从节点间通过心跳机制确定互相之间的关系每3秒发送一次
3.元数据管理
4.负载均衡:存储数据时,由namenode进行分配存在位置
5.副本存放策略:每个块都有两个副本
6.机架感知:datanode机架感知互相联系
优点
1.高容错性:
数据自动保存多个副本(默认有三个)
当某一个副本丢失后,它可以自动恢复,这是HDFS的内部机制
2.适合处理超大文件
可以批处理,是通过移动计算而不是移动数据
处理数据GB、TB、甚至PB级数据百万规模以上的文件数量
3.流式文件访问
一次性写入,像流水一样,一点点流出来的多次读取,保证数据一致性
能保留历史文件,不能任意修改hdfs文件,但是可以追加
4.可创建在廉价机器上
通过多副本提高可靠性,提供了容错和恢复机制
缺点
1.低延迟数据访问
适合低延迟与高吞吐率,就是在某一时间写入大量的数据,但是在低延时的情况下是不行的,比如毫秒级以内读取数据,是很难做到的
2.小文件存取
占用namenode大量内存:存储大量小文件(这里的小文件是指小于HDFS系统的Block大小的文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的
3.并发写入、文件随机修改
一个文件只能有一个写,不允许多个线程同时写
仅支持append(追加),不支持文件的随即修改
相关特性
高容错、可扩展性及可配置性强
跨平台
Shell命令接口
机架感知功能
负载均衡
web界面
设计目标
1.可以检测和快速恢复硬件故障,故障的检测和快速自动恢复是HDFS的一个核心目标
2.流式数据访问
设计成适合进行批量处理,重视数据吞吐量,而不是数据访问的反应速度
3.大规模数据集:支持大文件的存储
4.移动计算代价比移动数据代价低
一个应用请求的计算,离他操作的数据越近就越高效,这在数据达到海量级别的时候更是如此
5.可移植性
HDFS在设计时就考虑到平台的可移植性,这种特性方便了HDFS作为大规模数据应用平台的推广
核心设计
1.心跳机制
2.安全模式
3.副本存放策略
4.负载均衡
心跳机制
1.master中有NameNode和ResourceManager,slave中有DataNode和NodeManager
Master 启动的时候会启动一个 IPC(Inter-Process Comunication,进程间通信) Server 服务,等待 Slave 的链接;
Slave 启动时,会主动链接 Master 的 IPC Server 服务,并且每隔 3 秒链接一次 Master,这个间隔时间是可以调整的,参数为 dfs.heartbeat.interval,这个每隔一段时间去链接一次的机制,我们形象地称为心跳。 Slave 通过心跳汇报自己的信息给 Master, Master 也通过心跳给 Slave 下达命令
2.NameNode 通过心跳得知 DataNode 的状态,ResourceManager 通过心跳得知NodeManager 的状态;
如果 Master 长时间都没有收到 Slave 的心跳,就认为该 Slave 挂掉了
3.死亡时间计算:
NameNode 感知到DataNode掉线死亡的时长计算:
HDFS 默认的超时时间为 10 分钟+30 秒,这里暂且定义超时时间为 timeout。
计算公式为:
timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval
默认的 heartbeat.recheck.interval 大小为 5 分钟,dfs.heartbeat.interval 默认的大小为 3 秒。
需 要 注 意 的 是 hdfs-site.xml 配 置 文 件 中 的 heartbeat.recheck.interval 的 单位 为 毫 秒,dfs.heartbeat.interval 的单位为秒。
- 如果 heartbeat.recheck.interval 设置为 5000(毫秒), dfs.heartbeat.interval设置为 3(秒,默认),则总的超时时间为 40 秒。
<property>
<name>heartbeat.recheck.interval</name>
<value>5000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
安全模式
1.safemode 是 NameNode 的一种状态(active/standby/safemode 安全模式)
2.NameNode 进入安全模式的原理:
NameNode 发现集群中的 block 丢失率达到一定比例时(0.1%), NameNode 就会进入安全模式,在安全模式下,不允许客户端进行任何修改文件的操作,包括上传文件、删除文件、重命名等操作,只能查看元数据信息(比如 ls)。这个丢失率是可以手动配置的,默认是在配置文件hdfs-default.xml 中定义了最小的副本率为dfs.safemode.threshold.pct=0.999f 。
在 HDFS 集群正常冷启动时, NameNode 也会在 safemode 状态下维持相当长的一段时间,此时你不需要去理会,等待它自动退出安全模式即可 。
在刚运行命令start-dfs.sh时,50070页面显示的信息:
3.安全模式常用操作命令:
hdfs dfsadmin -safemode leave //强制 NameNode 退出安全模式
hdfs dfsadmin -safemode enter //进入安全模式
hdfs dfsadmin -safemode get //查看安全模式状态
hdfs dfsadmin -safemode wait //等待,一直到安全模式结束
副本存放策略
1.副本的作用
数据分块存储和副本的存放,是保证可靠性和高性能的关键 。
2.副本存储方法
将每个文件的数据进行分块存储, 每一个数据块又保存有多个副本, 这些数据块副本分布在不同的机器节点上
3.副本存放策略
1)第一个 block 副本存放在 client 所在的 node 中(如果 client 不在集群范围内,则第一个 node是随机选取的,系统会尝试不选择那些太满或者太忙的 node);
2)第二个副本放置在与第一个 node相同的机架的不同 node 中(近乎随机选择,系统会尝试不选择那些太满或者太忙的 node);
3)第三个副本和放在与第二个不同的机架上,随机放在不同的 node 中。
4)其他副本随即存放
4.修改副本数(将副本数修改为1)
第一种方式
修改集群文件 hdfs-site.xml
<property> //修改项开始
<name>dfs.replication</name>
<value>1</value>
</property> //修改项结束
第二种方式
命令设置
hadoop fs -setrep -R 1 /
负载均衡
1.数据不平衡原因
机器与机器之间磁盘利用率不平衡是 HDFS 集群非常容易出现的情况
情况一:在 DataNode 节点出现故障
情况二:在现有的集群上增添新的 DataNode 的时候
2.HDFS数据自动平衡方法
影响Balancer的几个参数:
-
threshold
默认设置:10,参数取值范围:0-100
参数含义:判断集群是否平衡的阈值。理论上,该参数设置的越小,整个集群就越平衡。 -
dfs.balance.bandwidthPerSec
默认设置:1048576(1M/S)
参数含义:Balancer运行时允许占用的带宽
3.HDFS数据自动平衡方法
命令:
启动数据均衡,默认阈值为 10%
sbin/start-balancer.sh
启动数据均衡,阈值 5%
sbin/start-balancer.sh –threshold 5
停止数据均衡
sbin/stop-balancer.sh
自动进行均衡非常慢, 一天能移动的数据量在 10G-10T 的级别,很难满足超大集群的需求。
原因: HDFS 集群默认不允许 balance 操作占用很大的网络带宽,这个带宽是可以调整的。
4.HDFS数据自动平衡方法
调整带宽:
(1)命令
hdfs dfsadmin -setBalanacerBandwidth 10485760
该数值的单位是字节,上面的配置是 10M/s,默认是 1M/s
(2) 在hdfs-site.xml 中设置:
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>10485760</value>
</property>
HDFS READ
1.客户端向NN发出请求,与NN发生交互
调用FileSystem对象的open方法,其实获取的是一个DistributedFileSystem的实例
2.NN把文件的列表信息发送给client,列表信息即文件的位置索引
DistributedFileSystem通过RPC(远程过程调用)获得文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面
3.client根据列表信息去DN上读取block块信息(客户端会找离它比较近的去读,就近原则)
前两步会返回一个FSDataInputStream对象,该对象会被封装成 DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream就会找出离客户端最近的datanode并连接datanode
数据从datanode源源不断的流向客户端
4.一直读,直到所有块读完
如果第一个block块的数据读完了,就会关闭指向第一个block块的datanode连接,接着读取下一个block块
如果只有第一行有信息,也会把整个块读完
5.关闭读操作
如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流
比如要读一个文件a.txt,300M,那么它会占用3个块,默认保存3个副本,所以存在三个DN上
HDFS WRITE
1.客户端根据文件的大小,为它分配需要的block数,然后向NN发出写的请求,看看文件是否存在,如果不存在就创建
-客户端通过调用 DistributedFileSystem 的create方法,创建一个新的文件。
-DistributedFileSystem 通过 RPC(远程过程调用)调用 NameNode,去创建一个没有blocks关联的新文件。创建前,NameNode 会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,NameNode 就会记录下新文件,否则就会抛出IO异常
2.NN为文件分配每个块写的位置,然后向client返回文件list,即元数据信息给client
-第一步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 可以协调 NameNode和 DataNode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列 data queue。
3.client根据文件list在相应的DN上写,每写完一个DN都向client返回一个ack信息。
DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
-如果有DN坏了,NN会重新分配,client再重新写
4.客户端写完最后一块后,client关闭数据流
-客户端完成写数据后,调用close方法关闭写入流。
-DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成。
5.当第一块block完成时,它所在的那个节点的后台会启动一个进程进行复制,分别把副本写到其它DN上(管道复制)
-DataStreamer 会去处理接受 data qu