HDFS基础知识

HDFS简介

HDFS是Hadoop项目的核心子项目,在大数据开发中通过分布式计算对海量数据进行存储与管理。它基于流数据模型访问和处理超大文件的需求而开发,可以运行在廉价的商用服务器上,为海量数据提供了不怕故障的存储方法,进而为超大数据集的应用处理带来了很多便利。

HDFS 的使用场景:适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。

HDFS特征

1.HDFS非常适合使用商用硬件进行分布式存储和分布式处理。它具有容错性、可扩展性,并且扩展及其简单。

2.HDFS具有高度可配置性。大多数情况下,需要仅针对非常大的集群调整默认配置。

3.HDFS是Hadoop的核心框架,而Hadoop是用JAVA编写的,因而可以运行于所有主流平台上。

4.支持类似Shell命令直接与HDFS交互。

5.HDFS内置了Web服务器,可以轻松检查集群的当前状态。

HDFS设计目标

1.硬件故障

硬件故障是常态,而非例外。HDFS集群可能由数百或数千台服务器组成,每台服务器都存储文件系统数据的一部分,且每台服务器都有很大的故障概率。因此,故障检测和快速、自动地从故障中恢复是HDFS的核心架构目标。

2.流式数据访问

在HDFS上运行的应用程序需要对其数据集进行流式访问,这与运行在一般文件系统上的应用不同。HDFS更适合批量处理,而不是用户的交互使用,它更加强调数据访问的高吞吐量,而不是数据访问的低延迟。

3.大型数据集

HDFS是一个支持大型数据集的文件系统,一个典型的HDFS数据文件可以从千兆字节到兆兆字节不等,可以为具有数百个节点的集群提供高聚合的数据带宽和规模,同时承载千万个文件。

4.简单一致性模型

HDFS遵循简单一致性模型,一次写入,多次读取。即文件一旦被建立、写入、关闭,就不能被改变,更不能从文件任意位置进行修改,以此来保证数据的一致性。Hadoop2.0以后,支持在文件末尾追加内容。

5.移动计算比移动数据容易

HDFS被设计为能更好地将计算迁移到更接近数据的位置,而不是将数据移动到应用程序运行的位置,这样应用程序的计算效率会更高。HDFS为应用程序提供接口,使其更接近数据所在的位置。

6.平台的可移植性

HDFS被设计为可以从一个平台轻松地移植到另一个平台,从而使HDFS能够作为大型应用程序的首选平台。

HDFS的局限性

1.不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。

2.无法高效存储大量小文件。

3.不支持多用户写入及任意修改文件。

HDFS的组成架构

HDFS采用Master/Slave(即:主/从)架构:一个HDFS集群是由一个NameNode和若干个DataNode组成。

NameNode是存储集群的主服务器,负责管理文件系统的命名空间(NameSpace)以及客户端对文件的访问。 DataNode负责处理文件系统客户端的读写。在NameNode的统一调度下进行数据块的创建、删除和复制。 HDFS的辅助元数据节点(SecondaryNameNode)辅助NameNode处理事务日志和镜像文件。

HDFS主要组件

数据块

HDFS中的文件是以数据块的形式存储的,默认最基本的存储单位是128MB(Hadoop1.0版本为64MB)的数据块。也就是说,存储在HDFS中的文件都会被分割成128MB一块的数据块进行存储,如果文件本身小于一个数据块的大小,则按实际大小存储,并不占用整个数据块空间。

HDFS的数据块之所以设置这么大,其目的是减少寻址开销。数据块数量越多,寻址数据块所耗的时间就越多。当然也不会设置过大,Mapreduce中的Map任务通常一次只处理一个块中的数据,如果任务数过少,作业的运行速度就会比较慢。

HDFS的每一个数据块默认都有三个副本,分别存储在不同的DataNode上,以实现容错功能。因此,若数据块的某个副本丢失并不会影响对数据块的访问。数据块大小和副本数量可在配置文件中更改。

NameNode

NameNode是HDFS中存储元数据(文件名称、大小、位置等信息)的地方,他将所有文件和文件夹的元数据保存在一个文件系统目录树中,任何元数据信息的改变,NameNode都会记录。HDFS中的每个文件都被拆分为多个数据块存放,这种文件与数据块的对应关系也存储在文件系统目录树中,有NameNode维护。

NameNode还存储数据块到DataNode的映射信息,这种映射信息包括:数据块存放在哪些DataNode上、每个DataNode上保存了哪些数据块。

NameNode也会周期性地接收来自集群中DataNode的“心跳”和“块报告”。通过“心跳”与DataNode保持通信,监控DataNode的状态(活着还是宕机),若长时间接收不到“心跳”信息,NameNode会认为DataNode已经宕机,从而做出相应的调整策略。“块报告”包含了DataNode上所有数据块的信息。

DataNode

DataNode是HDFS中真正存储数据的地方。客户端可以向DataNode请求写入或读取数据块,DataNode还在来自NameNode的指令下执行块的创建、复制和删除,并且周期性地向NameNode汇报数据块信息。

SecondaryNameNode

SecondaryNameNode用于帮助NameNode管理元数据,从而使NameNode能够快速、高效地工作,它并不是第二个NameNode,仅是NameNode的一个辅助工具。

HDFS的元数据信息主要存储与两个文件中:fsimage和edits。fsimage是文件系统映射文件,主要存储文件元数据信息,其中包含文件系统所有目录、文件信息以及数据块的索引。edits是HDFS操作日志文件,HDFS对文件系统的修改日志会存储到该文件中。

当NameNode启动时候,会从文件fsimage中读取HDFS的状态,也会对文件fsimage和edits进行合并,得到完整的元数据信息。随后会将新HDFS状态写入fsimage。但是在繁忙的集群中,edits文件会随着时间的推移变得非常大,这就导致NameNode下一次启动的时间会非常长。为了解决这个问题,则产生了SecondaryNameNode。SecondaryNameNode会定期协助NameNode合并fsimage和edits文件,并使edits文件的大小保持在一定的限制内。SecondaryNameNode通常与NameNode在不同的计算机上运行,因为它的内存需求与NameNode相同,这样可以减轻NameNode所在计算机的压力。

在紧急情况下,SecondaryNameNode可辅助恢复NameNode。

Client

就是客户端。Client主要进行文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传。并且可以与NameNode进行交互,获取文件的位置信息,还可以与DataNode进行交互,读取或者写入数据。Client提供一些命令来访问和管理HDFS,比如NameNode的格式化,对HDFS的增删改查等。

HDFS读写数据的流程

读文件:客户端要读某个文件

1.客户端向NameNode发送数据读操作请求。

2.NameNode向客户端发送组成该文件的数据块的位置列表(即每个数据块存储哪些DataNode之中)。

3.客户端直接从这些DataNode读取文件数据(在读数据过程中,NameNode不参与文件的传输)。

写文件:当客户端需要写入一个文件

1.客户端向NameNode发送数据写操作请求,将需要写入的文件名、路径等元数据信息(MetaData)告诉NameNode。

2.NameNode将文件信息记录到本地,同时验证客户端的写入权限,若验证通过,会向客户端返回文件数据块能够存放在DataNode上的存储位置信息。

3.客户端直接向DataNode的相应位置写入数据块。

4.被写入的数据块的DataNode也会将数据块备份到其他DataNode上。

SecondaryNamenode工作机制

第一阶段:NameNode 启动

1.第一次启动 NameNode 格式化后,创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

2.客户端对元数据进行增删改的请求。(这里就是客户端对hdfs的读/取请求)

3.NameNode 记录操作日志,更新滚动日志。(edits)

4.NameNode 在内存中对元数据进行增删改。(fsimage)

第二阶段:Secondary NameNode 工作

1.Secondary NameNode 询问 NameNode 是否需要 CheckPoint(默认1小时)。直接带回 NameNode 是否检查结果。

2.Secondary NameNode 请求执行 CheckPoint。

3.NameNode 滚动正在写的 Edits 日志。

4.将滚动前的编辑日志和镜像文件拷贝到 Secondary NameNode。

5.Secondary NameNode 加载编辑日志和镜像文件到内存,并合并。

6.生成新的镜像文件 fsimage.chkpoint。

7.拷贝 fsimage.chkpoint 到 NameNode。

8.NameNode 将 fsimage.chkpoint 重新命名成 fsimage。

DataNode 工作机制

1.一个数据块在 DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

2.DataNode 启动后向 NameNode 注册,通过后,周期性(6 小时)的向 NameNode 上报所有的块信息。

3.心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 DataNode 的心跳,则认为该节点不可用。

4.集群运行中可以安全加入和退出一些机器。

数据完整性

当创建一个新的文件时,会计算每个数据块的校验和,并作为一个单独的隐藏文件保存。

当客户端读取文件内容时,会检查校验和是否匹配,如果不匹配,客户端可以选择从其他Datanode获取该数据块的副本。

机架感知策略

副本的存放是HDFS可靠性和性能的关键,默认的副本数为3

第一个副本在Client所处的节点上。如果客户端在集群外,随机选一个。

第二个副本在另一个机架的随机一个节点。

第三个副本在第二个副本所在机架的随机节点。

特点:

数据块只存放在两个不同机架上。

HDFS尽量读取离它最近的副本 副本并不是均匀分布在不同的机架上。

优点:

减少了机架间的数据传输,提高了操作效率。

不损坏数据可靠性和读取性能,机架错误远远比节点错误少。

心跳检测和重新复制

DataNode节点周期性向NameNode发送心跳信号,近期不发送心跳信号的DataNode标记为死机,不会再将新的IO请求发给它们,死机DataNode上的数据块将不再有效。

如果数据块副本系数低于指定值,NameNode不断检测这些需要复制的数据块,一旦发现就启动复制操作。

集群均衡

如果当某个DataNode节点上的空闲空间低于特定临界点,按照均衡策略会自动将部分数据移动到其他空闲的DataNode。当对某个文件的请求突然增加时,可能启动一个计划创建该文件新的副本,并且同时重新平衡集群中的其他数据

流水线复制

当客户端向HDFS写入数据时,一开始是写在本地临时文件中。当本地文件累计到一个数据块的大小时,客户端向NameNode获取一个DataNode列表用于存放副本。客户端向第一个DataNode传输数据,第一个DataNode一小部分一小部分(默认4KB)地接收数据,将每一部分写入本地仓库,并同时传输该部分到列表中的第二个DataNode,依次类推。

文件的删除和恢复

当删除某个文件时,文件并没有立刻从HDFS删除,HDFS将这个文件重命名转移至/trash目录,只要文件还在/trash目录中,可以被迅速恢复,文件在/trash目录保存的时间可配置,默认6小时,当超过保存时间,NameNode就从删除文件并释放相关数据块。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值