HDFS
一、概述
是Hadoop中用于数据的分布式存储的组件
根据Google论文《The Google File System》来设计的
二、基本结构
在HDFS中,对于文件是进行切块保存
HDFS中有2类主要的节点:NameNode和DataNode
NameNode负责管理DataNode
DataNode负责存储数据
HDFS会对文件块进行自动的备份,每一个备份称之为复本(Replication),HDFS默认是3个复本
如果某一个DataNode宕机,那么在HDFS中默认将这个DataNode所存储的复本再进行一次备份,保证指定的复本数量,宕机的设备恢复后不会删除多余副本。
三、Block
在HDFS中,会对文件进行切块,每一个块实际上就是一个Block
Block是HDFS中存储的基本单位
Block在Hadoop1.0中的大小是64M,在Hadoop2.0中的大小是128M
如果一个文件或者数据的大小不满足Block的大小,那么这个文件或者数据是多大那么对应的Block就是多大
切块的意义:
a. 便于存储超大文件
b. 便于进行快速的备份
HDFS对每一个Block分配一个递增的编号
四、NameNode
NameNode是HDFS中的核心节点,用于管理其他的DataNode
NameNode本身会记录元数据(Meta Data)
元数据包含:
a. 文件的存储路径,例如/a.log,/test/b.txt
b. 复本数量
c. 文件所对应的文件块 — Block
d. 每一个Block的存储节点
每一条元数据一般是在150B大小左右
只有写请求会产生元数据,读请求不产生元数据
元数据在NameNode中存储在内存以及磁盘中
元数据存储在内存中的目的是为了快速查询
元数据存储在磁盘中是为了崩溃恢复
元数据存储在磁盘上的位置由core-site.xml中的属性hadoop.tmp.dir来决定,在指定的目录的子目录dfs/name/current下
元数据存储的文件:
a. edits:记录NameNode接收的每一次的写(上传、删除、追加)请求
b. fsimage:记录元数据,但是这个文件中的元数据不是实时的
当NameNode接收到一个新的写请求的时候,会先将这个请求写到edits文件中,当edits文件写成功之后,再去更改内存中的元数据,当内存中的元数据更改完毕之后,会个客户端返回一个成功信号
edits和fsimage在触发合并条件的时候会进行合并:
a. 时间:由(core-site.xml)fs.checkpoint.period属性决定,默认数量是3600,默认时间单位是秒
b. 空间:由(core-site.xml)fs.checkpoint.size属性决定,默认是64M,表示当edits文件到达64M的时候会将其中的操作更新到fsimage中
c. 重启:NameNode重新启动的时候,自动触发edits和fsiamge的合并
d. 强制:指令 hadoop dfsadmin -rollEdits
内存中元数据 = edits中的操作+fsimage中的元数据
在Hadoop1.0中,NameNode有且只有一个,也就意味着NameNode存在单点故障
在Hadoop2.0的伪分布式中,NameNode也只有一个;但是在Hadoop2.0的完全分布式中,可以通过舍弃SecondaryNameNode的方式来搭建2个NameNode避免NameNode的单点故障
在完全分布式中,如果存在NameNode和SecondaryNameNode,那么合并过程是发生在SecondaryNameNode上;如果舍弃了SecondaryNameNode,合并过程只能发生在NameNode上
DataNode通过心跳机制(每隔固定时间)来给NameNode发送心跳信号
心跳信号包含:
a. 当前节点的状态
b. 当前DataNode存储的数据
在HDFS启动/重启的时候,自动的触发edits和fsimage的合并,合并完成之后,会将fsimage中的元数据加载到内存中,然后会进行一系列的校验(等待DataNode的心跳,校验数据的完整性),在这个过程中,HDFS不对外提供写服务只提供读服务,这种情况称之为安全模式
HDFS当完成所有的校验之后会自动退出安全模式
如果在伪分布式下,设置的复本数量>1,那么就会无法退出安全模式
五、DateNode
DataNode用于存储数据,数据是以Block形式存储
DataNode通过心跳机制(RPC)来向NameNode发送心跳信号
DataNode每隔3s向NameNode发送一次心跳
如果NameNode超过10min没有收到DataNode的心跳,那么NameNode认为这个DataNode已经lost(丢失)
当NameNode认为DataNode已经lost的时候,NameNode要将这个DataNode上的Block备份到其他的节点上
六、SecondaryNameNode
SecondaryNameNode不是NameNode热备,只是辅助NameNode进行元数据的合并,SecondaryNameNode也能起到一定的备份作用
合并过程:
SecondaryNameNode设计的目的是为了提高HDFS的运行效率,但是实际开发过程中往往会舍弃SecondaryNameNode,而是采用双NameNode机制来实现NameNode的热备
七、多副本放置策略
第一个复本:如果是从集群内部上传,哪个节点上传第一个复本就放在哪个节点上;如果是从集群外部上传,那么NameNode会选择一个相对比较空闲的DataNode存储第一个复本
第二个复本:放在和第一个复本不同机架的节点上
第三个复本:放在和第二个复本相同机架的节点上
更多复本:选择相对空闲的节点来放置
机架感知策略
机架感知策略本质上是建立节点和机架的映射关系
机架指的不是物理机架而是逻辑机架
可以将不同物理机架上的节点映射到同一个逻辑机架上
一般是将同一个物理机架上的节点放到同一个逻辑机架上