hdfs组成
hdfs由NameNode、secondNameNode与DataNode组成。
DataNode存储真实的数据(1台真实的服务器为1个dataNode)
NameNode记录文件、block、DataNode之间的映射关系,保存在内存和磁盘之中各一份。
SecondNameNode合并操作日志,协助NameNode
存储过程
一个大文件存储到hdfs中,会首先被切分成128M为大小的文件块,每一个文件块称之为一个block。不足128M的,单独作为一个block,占用实际文件大小空间。)每一个block会复制2份(共3份,具体复制份数可以配置),保存在不同的DataNode中。
dataNode选择:首先1个block会存放在距离文件最近的机器,或者最闲的机器(通过cpu占用率检测)。不同的block会放在不同的机架上(机架感知策略),防止一个机架出现故障,所有的备份都出现问题。
NameNode记录文件、block、dataNode之间的映射关系,以便查询文件。 NameNode数据会保存在内存和磁盘各一份。放在内存,为检索文件快速,保存在磁盘,为防止NameNode所在机器宕机后,数据丢失。单独搭建hadoop集群,只有1个NameNode,存在单节点故障风险,即NameNode宕机了,整个集群就瘫痪了。所以hadoop2.0,就引入了hadoop+zookeeper,实现了双NameNode的集群搭建,进一步保证的集群的可靠性。
nameNode数据格式参照如下:
FileName replicas block-Ids id2host
例如:/test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}]
/test/a.log为文件名
3:备份份数
{b1,b2}文件被切成两块
b1:[h0,h1,h3]表示b1块保存在机器h0,h1,h3上。
NameNode详细
NameNode保存在磁盘中文件包括:
fsimage 元数据镜像文件。存储NameNode元数据信息,并不实时同步内存数据。(即镜像文件可能比内存文件要小。)
edits操作日志文件
fstime 保存最近一次checkpoint时间。
当有写请求,NodeNode首先写editlog到磁盘edits文件中,成功后才会修改内存,并向客户端返回请求结果。
所以fsimage中并非实时数据,而是达到条件时,再进行更新,更新时需要secondNameNode参与。
secondNameNode
secondNameNode不是nameNode的备份,而是帮助NameNode进行edits与fsimage的合并。
触发secondNameNode的条件
1、根据配置文件设置的文件间隔fs.checkpoint.period,默认是3600秒
2、根据文件设计的edits大小 fs.checkpoint.size,默认是64M
更新过程
1、secondNameNode通过http从NameNode获取文件edits,加载到内存中,与原fsimage文件进行合并生成一个新的fsimage.ckp文件。
2、将fsimage.ckpt复制到NameNode中,重命名为fsimage,覆盖原文件。
3、secondNameNode获取edits时,NameNode会生成edits.new文件来记录此时的操作记录。
4、fsimage.ckpt重命名的同时,要对edits.new进行重命名为edits,等待下一次合并。
dataNode
dataNode为实际存储Block的节点,可以有上千台服务器
dataNode会不断向NameNode节点发送心跳报告(3s一次),工作中,dataNode会不断更新与NameNode节点之间对应的元数据信息,并接受NameNode节点的指令,创建、移动、删除本地磁盘上的数据块。
如果10分钟未收到DataNode传来的心跳信息,则认为DataNode已经宕机,将其上block复制到其他DataNode。
存储策略:
第一个副本:如果上传文件的服务器本身就是DataNode,就放置在上传文件的DataNode;如果是外部客户端向集群上传,就随机选一台相对清闲的dataNode(通过cup使用率以及磁盘使用程度)。
第二个副本:放在与第一个副本不同的机架上。
第三个副本:放在与第二个副本相同机架上
如果保存更多副本:随机节点。
注意:机架感知,需要手动配置。
HDFS优点
1、可存储超大文件,GB、TB、PB级别的文件,反正再大也会被切成小块。
2、检测和快速应对硬件故障,如果有个机器坏了,hadoop会自动把坏掉机器存储的数据,再次进行备份。
3、流式数据访问,主要是数据高吞吐,而非访问速度快。
4、简化的一致性模型,一般一次写入,多次读取。
5、高容错性,数据自动保存多个副本,副本丢失自动恢复。
6、可构建在廉价机器上。
HDFS缺点
1、低延迟数据访问,无法再毫秒或秒的范围内给与响应。
2、不支持大量小文件。数据映射都放在NameNode中,如果大量小文件,会在NameNode中新增大量记录,影响NameNode性能。
3、不适合多用户读写修改。HDFS只能一次写入,多次读取,不支持修改(2.0版本以后支持追加)。
4、不支持超强事务。