目录
什么是HDFS?
HDFS是分布式文件存储系统,用于大数据的存储.一个HDFS系统通常由一个NameNode,一个SecondaryNameNode和若干DataNode组成.
NameNode负责管理整个文件系统元数据;DataNode负责管理具体文件数据块存储;Secondary NameNode协助NameNode进行元数据的备份.
HDFS详解:
NameNode:
NameNode用来管理文件系统的元数据,是HDFS集群中的大管家,它不负责存储具体的数据.NameNode由两个核心组件组成:Fsimage和Edits.
Fsimage:
Fsimage中存有元数据(文件和文件块(Block)之间的所属关系,文件块和机器之间的映射关系),是在NameNode启动时对整个文件系统的快照,持久化在NameNode的本地磁盘上.
Edits:
用户发起的创建、删除等操作其实是一个个日志,日志在NameNode上以edit对象存储在edits文件中,持久化在NameNode的本地磁盘上.
SecondaryNameNode:
NameNode的秘书,用来合并NameNode的Edits到Fsimage文件中,分担NameNode的压力。
NameNode实现流程:
NameNode启动时,在NameNode内存中会同步一份磁盘中的Fsimage的数据。当用户发起操作指令时,会先在edits中进行登记,在edits中写入日志(本次操作所做的事情),然后修改NameNode内存中的元数据信息,修改完成直接返回用户结果,此时NameNode会启动进程在DataNode中执行操作。
然而,edits是需要和fsimage进行合并为新的Fsimage的,合并的条件有三个:
-
服务重启时,检查edits中是否有数据,如果有,将两个文件进行合并;
-
Edits文件大小达到64MB,合并;
-
距离上次文件合并达到1小时,合并。
然而,如果edits和fsimage文件合并时,用户发起操作指令,edits为被占用状态,无法写入数据,此时会在NameNode磁盘中生成一个新的文件——edits.new,在edits.new文件中写入日志。同时NameNode将edits和fsimage发送到SecondaryNameNode中,SecondaryNameNode将两个文件合并成一个新的文件fsimage.ckpt,然后发回到NameNode磁盘中。此时会同时将fsimage.ckpt和edits.new的后缀名去掉,变回fsimage和edits。
DataNode:
DataNode是HDFS中文件的实际存储节点,负责管理它所在节点的文件块存储,记录自己存放文件的基本信息。
Block:
文件块,在Hadoop1.0时,每块64MB,Hadoop2.0时,每块128MB,默认备份三份。
DataNode实现流程:
webservlet发起文件上传请求,与NameNode建立通信,NameNode检查目标文件是否已存在,是否可以上传。如果可以,NameNode会将此文件进行逻辑上的区域划分为block文件块,每128MB划分为一块,划分完成后通知存储压力小的DataNode进行保存(负载均衡策略),默认备份三份(Block备份放置位置下方解释)。
Block备份放置位置:
第一份:如果该文件本身从Hadoop集群中的某个节点上传,那么第一份存放在上传节点中,如果从Hadoop集群之外上传,那么存放在相对不太忙,负载较小的节点上。
第二份:放在与第一份所放置的节点相邻机架上的某个节点上。
第三份:放在与第二份所在节点的机架上的另外一台机器上。
三份以上,放置在负载相对较小的节点上。
HDFS的优点:
可以存储海量超大文件(无限拓展)
高容错,支持数据丢失自动恢复
可以构建在廉价机上
HDFS的缺点:
做不到低延迟访问
不支持超强的事务
不适合存大量小文件
不支持行级别的增删改