一、HDFS设计思想

要把存入到集群中的数据均匀的分散的存储到整个集群中。

核心设计思想

!

Hadoop HDFS怎么存储数据 hdfs如何存储文件_hdfs

1 分散存储

一个大的文件想要进行存储,必须要借助分布式文件存储系统这个分布式存储系统怎么存文件:把大的文件进行切分,“分而治之”,然后存储,最小单位为:块,大小:128M;

2 冗余存储

整个HDFS集群是存储在多个不是特别可靠的服务器上面,所以要保住数据的安全性,策略:副本冗余
冗余的数量可以在hdfs-site.xml 修改dfs.replicaton。

二、HDFS架构
主从架构

1、namenode:掌管文件系统的目录树,处理客户端的(读写)请求,保存元数据信息 ,负载均衡。
2、datanode:存储实际的数据的,处理真正的读写,定期向namenode发送心跳报告和块的位置信息。
3、secondnamenode:帮助namenode做元数据备份,帮助那么浓的进行恢复;分担namenode压力的,协助合并元数据信息。

Hadoop HDFS怎么存储数据 hdfs如何存储文件_大数据_02

HDFS存储安全

冗余存储,保证了存储数据的安全
HDFS自我恢复机制,节点宕机之后,会自动复制一份
只要宕机的数量少于副本冗余的数量,就一定能保证安全!!!

三、HDFS三大核心机制
1、心跳机制

集群节点之间必须做时间同步。namenode是集群的老大,负责集群上任务的分工,如果要进行分工,则必须知道各个从节点的存活状况。namenode怎么知道?通过datanode定期的向namenode发送心跳报告,datanode每隔3秒向namenode发送一次心跳报告,告诉其自己的存活状态默认情况下心跳间隔的参数由hdfs-default.xml中的下面参数决定:

<property>
  <name>dfs.heartbeat.interval</name>
  <value>3</value>
  <description>Determines datanode heartbeat interval in seconds.</description>
</property>

datanode每隔3秒向namenode发送一次心跳报告,当namenode连续10次没有收到datanode的心跳报告,会觉得datanode可能死了,并没有断定死了,此时namenode向datanode主动发送一次检查,发送一次检查的时间时5分钟,由hdfs.default.xml中的下面属性决定。

<property>
  <name>dfs.namenode.heartbeat.recheck-interval</name>
  <value>300000</value>
  <description>
    This time decides the interval to check for expired datanodes.
    With this value and dfs.heartbeat.interval, the interval of
    deciding the datanode is stale or not is also calculated.
    The unit of this configuration is millisecond.
  </description>
</property>

这个dead有个标准:
超时时长:namenode用来判断datanode的存活状态 630
公式:timeout(超时时长) = 10 * 心跳时长 + 2 * 检查心跳机制是否正常工作的时间
心跳时长:3 秒
检查心跳机制是否正常工作的时间:5min = 300秒
timeout(超时时长) = 630秒

2、安全模式

启动:Safe mode is ON. 关闭:Safe mode is off.

什么时候进入安全模式:
1、当HDFS集群中的部分datnode节点宕机之后,HDFS后台会启动一些服务,做自我恢复
2、当丢失的数据块的比例超过一定数据(0.1%)的时候就会自动的进入安全模式
某个文件的某个数据块的副本丢失了以后,相当于文件损坏。
解决方案:手动强制退出安全模式,
发送命令
hdfs dfsadmin-safemode leave //强制那么node退出安全模式
hdfs dfsadmin -safemode enter //进入安全模式
hdfs dfsadmin -safemode get //查看安全模式的状态
hdfs dfsadmin-safemode wait //等待
总结一下: 在HDFS启动的过程中,datanode会一个启动并汇报,数据完整的比例在提高 当识别到整个集群的数据99.9%,会自动退出安全模式 什么时候退出安全模式: 1、找出问题所在,进行修复 2、手动强制退出安全模式
hdfs dfsadmin -safemode leave //强制那么node退出安全模式

3、副本存放机制

定义:决定一个数据块的多个副本(默认3)到底要选取哪些服务器节点进行存储 副本的存储有几个原则:
1、任意一个节点上面不可能存储两个一样的副本块
2、如果我们要存储完整的三个副本块,必须至少需要3个节点
副本存放策略:
1、第一个副本块选取和客户端相同的节点上
2、第二个副本块选取跟第一个存储节点相邻机架的任意一个节点
3、第三个副本存储在和第二个副本块所在的机架不同的节点上
但是这个默认的副本存放策略不是绝对的标准版!!实际存储可能选择是不忙的节点
作用: 数据分块存储和副本的存放,是保证可靠性和高性能的关键

四、HDFS三大核心

1、上传

Hadoop HDFS怎么存储数据 hdfs如何存储文件_大数据_03

1、客户端向namenode请求上传文件
2、NameNode检查权限并做出响应
3、客户端拿到namenode的响应之后,请求上传第一个block块,并请求namenode返回可用的datanode列表
4、namenode依据客户端的请求返回可用的datanode列表
5、客户端请求与datanode列表建立数据传输管道,进行数据传输
6、datanode依次返回响应,正式建立起来了数据传输管道
7、客户端以package为单位进行数据的传输,知道讲第一个block块传输完毕
8、其他的块以此类推。

2、下载

Hadoop HDFS怎么存储数据 hdfs如何存储文件_分布式_04

1、客户端向NameNode请求下载文件
2、NameNode返回目标文件的元数据信息 {blk1:dn1blk2:dn2 blk3:dn1}
3、客户端和每一个block块所在的主机建立连接
4、以package为单位进行数据的读取
5、读取完毕之后,将block块合并成完整的文件。

3、元数据的管理

元数据:
1、抽象目录树
2、数据和块的映射关系 3、数据块存储的位置信息
内存存储:1、2、3
磁盘存储:1、2

dfs文件夹下有data、name和namesecondary三个文件夹:

data文件夹是对应datanode的,存储真实数据
name文件夹对应元数据
nm-local-dir:本地缓存

元数据的合并

触发合并的条件:
时间节点 每隔一小时(3600s)合并 或者元数据条数 当达到100万条时

合并的过程:根据edits的操作日志改变fsimage的元数据信息。

合并的流程:
1、secondarynamenode(snn)向namenode发送请求,是否checkpoint
2、当满足合并的条件时,namenode返回snn同意合并
3、开始checkpoint
4、将正在编辑的日志文件回滚(由编辑状态变成编辑完成状态),同时生成一个新的正在编辑的日志文件,
5、snn把fsimage和历史日志文件拉取到自己的节点上。
PS:如果不是第一次checkpoint,那么这次拉取的日志文件是合并点记录的
日志文件编号到最新回滚的日志文件区间的所有日志文件。
6、snn把edits和fsimage文件加载到内存中进行合并,合并的文件叫fsimage.checkpoint。
7、snn把合并后的fsimage.checkpoint文件发送给namenode,snn中也保留一份。
8、namenode将fsimage.checkpoint文件重命名为fsimage,替换原来的。
没有达到checkpoint过程的这段时间内集群正常关闭了,在关闭之前,内存中的元数据会写入磁盘中。

五、HDFS优缺点

优点:
1、可构建在廉价机器上
通过多个副本来提高可靠性,文件切分多个块进行存储
2、高容错性
数据自动保存多个副本,副本丢失后,可以自动恢复
3、适合批处理
移动计算比移动数据方便
4、适合大数据处理
10k+节点规模
5、流式文件访问
一次写入,多次读取,可以保证数据的一致性
> 缺点
1、要求高的数据访问
比如毫秒级
2、小文件存取
寻道时间超过读取时间
3、并发写入、文件随机修改
一个文件只能有一个写
仅仅支持追加
4、不适合存储小文件
存储一个1亿个小文件,大小仅仅1t,但是消耗掉20g左右的内存

六、应用场景

数据量很大的情况 兼顾数据的快速增长问题