1.HDFS存储机制
HDFS包含三个守护进程:NameNode、Secondary NameNode和DataNode。HDFS中使用“块”这样一个概念,将数据分成块,每一块默认大小64M,比磁盘块大得多,这是为了减少寻址时间占传输时间的比重。数据块存放在DataNode节点中,DataNode负责维护本地数据块列表。为了避免丢失,通常数据块会有多个副本,默认值是3,可配置。NameNode中存放元数据信息,比如文件中包含哪些数据块、数据块所在DataNode等,如果NameNode失效,那么HDFS系统将无法使用。值得一提的是,NameNode并不永久记录数据块位置信息,这些位置信息将在NameNode启动时由DataNode重建,DataNode定时向NameNode发送数据块列表信息。Secondary NameNode用于备份恢复NameNode信息。
2.NameNode异常恢复机制
为了避免因NameNode故障导致不可恢复,NameNode引入备份机制,备份靠两部分内容:fsimage和edits;NameNode接收到写数据请求时,会先将操作写入到edits文件中,然后再执行操作。为了控制edits文件大小和快速恢复,Secondary NameNode会定期请求合并fsimage和edits,NameNode接到请求后,将原来edits发送给Secondary NameNode并新建一个edits.new。Secondary NameNode完成合并后,将新的fsimage发送给NameNode,NameNode用新的替换掉旧的fsimager。并且将edits.new作为新的edits使用。
NameNode发生异常时,将会从Secondary中恢复fsimage,而后重做edits中操作,以恢复NameNode。
HDFS存储策略
通常数据节点会存放在不同数据中心和不同机架,不同机架中数据节点带宽比相同机架数据节点之间带宽小,为了避免带宽造成效率瓶颈,HDFS有机架感知这样的策略。数据中心、机架、数据节点三者组成树状结构,叶子节点全部是数据节点,非叶子节点是数据中心或机架,利用路径/a/b/c来标识数据节点c在数据中心a下的机架b下。两个数据节点之间距离通过查找最近共同祖先节点实现。
而机架这些物理条件对于网络来说是透明的,需要手工配置。
1.core-site.xml中开启机架感知
#配置python脚本文件路径
<property>
<name>net.topology.script.file.name</name>
<value>.../script.py</value>
</property>
script.py
#!/usr/bin/python
import sys
rack = {
'hostname':'/a/b/c',
'ip':'/a/b/c'
}
if __name__=='__main__':
print rack.get(sys.argv[1])
脚本输入参数一般是ip,不过最好把hostname也配置一下。
重启hdfs即可
HDFS副本策略
为了避免当一个 机架或者区域异常而丢失数据,对于所有数据块都有副本存储,默认是3份,其策略是:
1.如果client端所在服务器是数据节点,那么第一份存放在本地,如果不是由namenode随机选择一个datanode存放
2.随机选择一个与第一份副本不在同一机架的数据节点存放第二份副本。
3.随机选择与第二份副本同一机架的数据节点存放第三份副本。