HDFS是Hadoop Distribute File System的简称,Hadoop的一个分布式文件系统
HDFS的优缺点
HDFS优点
- 高容错性
- 数据保存多个副本,完全分布式模式默认为3个副本
- 数据丢失后自动恢复
- 适合移动批处理
- 移动计算而移动数据
- 数据位置暴露给计算框架
- 适合大数据处理
- GB、TB甚至PB级的数据处理
- 百万规模以上的文件数据
- 10000+的节点
- 可构建在廉价的机器上
- 通过多副本存储,提供可靠性
- 提供了容器和恢复机制
HDFS缺点
- 低延迟数据访问处理较弱
- 毫秒级别的访问响应较慢
- 低延迟和高吞吐的请求处理较弱
- 大量小文件存取处理较弱
- 会占用大量NameNode的内存
- 寻到时间超过读取时间
- 并发写入、文件随机修改
- 一个文件仅有一个写者
- 仅支持Append写入
HDFS 架构
HDFS采用master/slave架构。
一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。
- NameNode :是Master节点,是大领导。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间
- SecondaryNameNode:是一个小弟,分担大哥namenode的一部分工作量;是NameNode的冷备份;合并fsimage和fsedits然后再发给namenode
- DataNode: Slave节点,奴隶,干活的。负责存储client发来的数据块block;执行数据块的读写操作
- 热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作
- 冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失
- fsimage:元数据镜像文件(文件系统的目录树)
- edits:元数据的操作日志(针对文件系统做的修改操作记录
- namenode内存中存储的是=fsimage+edits
- SecondaryNameNode负责定时默认1小时,从namenode上,获取fsimage和edits来进行合并,然后再发送给namenode。减少namenode的工作量
NameNode(NN)、SencondryNameNode(SNN)、DataNode(Dn)介绍
- *NameNode(NN)
- 接受客户端的读写服务
- 保存metadata的信息,包括:文件的owership和permissions、文件包含哪些block、block保存在哪些DataNode节点上(在启动时由DataNode上报)
- NameNode的metadata信息会在启动后加载到内存中
a. metadata信息在磁盘上的存储文件为fsimage
b.Block的位置信息不保存在fsimage中(由DataNode上报)
c.edits中保存对metadata的操作日志
-
SecondryNameNode(SNN)
- 它不是NN的备份(但可以做NN的部分备份工作),它的主要工作是帮助NN合并edits log,减少NN的启动时间
- SNN合并时机
a.根据配置文件设置的时间间隔fs.checkpoint.period
默认是3600秒
b.根据配置文件设置的edits log的大小fs.checkpoint.size
默认的edits log大小为64MB
-
SNN合并流程
a. NN创建一个新的edits log来接替老的edits的工作
b. NN将fsimage和旧的edits拷贝到SNN上
c. SNN上进行合并操作,产生一个新的fsimage
d. 将新的fsimage复制一份到NN上
f. 使用新的fsimage和新的edits log -
DataNode(DN)
- 存储数块(block)
- 启动DN线程时,DN会自动想NN汇报Block的信息
- NN向DN发送心跳检测,与其DN保持联系(3秒一次),如果NN连续10分钟没有收到DN的心跳,则认为该DN已经lost,并从其他DN中备份一份该DN上的所有Block
- block的放置策略
- 第一个副本,放置在上传文件的DN上,如果是集群外提交,则随便选择一台磁盘、内存、CPU不太忙的节点存储
- 第二个副本,放置在与第一个副本不同机架上的节点上
- 第三个副本,放置在与第二个副本相同机架上的相邻节点上
- 更多副本随机放置
HDFS写入流程
原理
- NameNode具有RackAware机架感知功能,可以配置
- 若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;其他副本随机挑选
- 若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同副本1机架上;副本3,同副本2相同的另一个节点上;其他副本随机挑选
- client想DataNode发送Block1;发送过程以流式写入
HDFS的读取流程
- client向NameNode发送读请求
- NameNode查看Metadata信息,返回文件的block的位置
block1 = 1,5,6
block2 = 8,1,2
block3 = 5,8,9 - block的位置是有先后顺序的,先读block1,再读block2、block3。而且block1去node1上读取,然后block2去node8上读取,block3去node5上读取
副本选择
为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本。如果在读取程序的同一个机架上有一个副本,那么就读取该副本。如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本
安全模式
Namenode启动后会进入一个称为安全模式的特殊状态。处于安全模式的Namenode是不会进行数据块的复制的。Namenode从所有的 Datanode接收心跳信号和块状态报告。块状态报告包括了某个Datanode所有的数据块列表。每个数据块都有一个指定的最小副本数。当Namenode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全(safely replicated)的;在一定百分比(这个参数可配置)的数据块被Namenode检测确认是安全之后(加上一个额外的30秒等待时间),Namenode将退出安全模式状态。接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上
通信协议
所有的HDFS通讯协议都是建立在TCP/IP协议之上。客户端通过一个可配置的TCP端口连接到Namenode,通过ClientProtocol协议与Namenode交互。而Datanode使用DatanodeProtocol协议与Namenode交互。一个远程过程调用(RPC)模型被抽象出来封装ClientProtocol和Datanodeprotocol协议。在设计上,Namenode不会主动发起RPC,而是响应来自客户端或 Datanode 的RPC请求