HDFS是以分布式文件存储的文件系统,主要负责集群数据的存储和读取,HDFS是一个主/从(Master/Slave)体系结构的分布式文件系统,HDFS文件系统主要包括一个NameNode、一个Secondary NameNode和多个Datanode。
HDFS架构图
(1) 元数据
元数据不是具体的文件内容,它有三类重要信息:第一类是文件和目录自身的属性信息,例如文件名、目录名、文件大小、修改时间等;第二类记录文件内容存储的相关信息,例如文件分块情况、副本个数等;第三类用来记录HDFS中所有DataNode的信息,用于DataNode管理。
(2) NameNode
NameNode用于存储元数据以及处理客户端发出的请求,在NameNode中存放元信息的文件时fsimage文件。在系统运行期间,所有对元数据的操作都保存在内存中,并被持久化到另一个文件edits中,当NameNode启动的时候,fsimage会被加载到内存,然后对内存里的数据执行edit所记录的操作,以确保内存所保留的数据处于最新的状态。
(3) Secondary NameNode
Secondary NameNode用于备份NameNode的数据,周期性将edits文件合并到fsimage文件并在本地备份,将新的fsimage文件存储到NameNode,取代原来的fsimage,删除edits文件,创建一个新的edits继续存储文件修改状态。
(4) DataNode
DataNode是真正存储数据的地方。在DataNode中,文件以数据块的形式进行存储。当文件传到HDFS端时以128MB的数据块将文件进行切割,将每个数据块存放到不同的或相同的NataNode并且备份副本,一般默认3个,NameNode会负责记录文件的分块信息,确保在读取该文件时可以找到并整合所有块。
HDFS 工作流程图
举个数据上传的例子来深入理解下HDFS内部是怎么做的
文件在客户端时会被分块,这里可以看到文件被分为 5 个块,分别是:A、B、C、D、E。同时为了负载均衡,所以每个节点有 3 个块。下面来看看具体步骤:
客户端将要上传的文件按 128M 的大小分块,并向名称节点发送写数据请求。
名称节点记录各个 DataNode 信息,并返回可用的 DataNode 列表。
客户端直接向 DataNode 发送分割后的文件块,发送过程以流式写入。
DataNode 中数据备份,文件块流水线复制
写入完成后,DataNode 向 NameNode 发送消息,更新元数据。
这里需要注意:
1、写 1T 文件,需要 3T 的存储,3T 的网络流量。
2、在执行读或写的过程中,NameNode 和 DataNode 通过 HeartBeat 进行保存通信,确定 DataNode 活着。如果发现 DataNode 死掉了,就将死掉的 DataNode 上的数据,放到其他节点去,读取时,读其他节点。
3、宕掉一个节点没关系,还有其他节点可以备份;甚至,宕掉某一个机架也没关系;其他机架上也有备份。
HDFS 宕机处理
数据存储在文件系统中,如果某个节点宕机了,就很容易造成数据流失,HDFS针对这个问题提供了有效的保护措施。
(1)冗余备份
在数据存储过程中,对每个数据块都进行了副本备份,副本个数可以自行设置。
(2)副本存放
仅仅对数据进行冗余备份还不够,假设所有的备份都在一个节点上,那么该节点宕机后,数据一样会丢失,因此HDFS要有一个更有效的副本存放策略,目前使用的策略是,以dfs.replication=3为例,在同一机器的两个节点上各备份一个副本,然后在另一台机器的某个节点上再放一个副本。前者防止该机器的某个节点宕机,后者防止每个机器宕机。
(3)宕机处理
当一切运行正常时,DataNode会周期性发送心跳信息给NameNode(默认是每3秒一次)。如果NameNode在预定的时间内没有收到心跳信息(默认是10分钟),它会认为DataNode出问题了,把他从集群中移除。对于HDFS来说,丢失一个DataNode意味着丢失了存储在它的硬盘上的数据块的副本。HDFS会检测到存储在该硬盘的数据块的副本数量低于要求,且主动对副本数量不符合要求的数据块创建需要的副本,以达到满副本数状态。
当HDFS读取某个数据块时,如果正好该节点宕机了,客户端就会到存储该数据块的其他节点上读取,除非其他节点损坏或者该数据块在存储时损坏,否则依然可以得到该数据块的信息。HDFS也会检测到该数据块副本个数不符合要求而重新补全副本。
当HDFS存储数据时,如果要存放数据的节点宕机,HDFS会再分配一个节点给数据块,然后备份宕机节点的数据。
HDFS 优点
(1) 高容错性
HDFS上传的数据自动保存多个副本,通过增加副本的数量来增加它的容错性。如果某一个副本丢失,HDFS机制会复制其他机器上的副本。
(2) 适合大数据的处理
HDFS能够处理GB、TB甚至PB级别的数据,规模达百万,数量非常大。
(3) 流式数据访问
HDFS以流式数据访问模式来存储超大文件,“一次写入,多次读取”。文件一旦写入,不能修改,只能追加。这样可以保证数据的一致性。
HDFS 缺点
(1) 不适合低延迟数据访问
如果要处理一些用户要求时间比较短的低延迟应用请求,则HDFS不适合。HDFS是为了处理大型数据集分析任务而设计的,目的是为了达到高的数据吞吐量,这就可能要求以高延迟为代价。
(2) 无法高效存储大量小文件
因为NameNode把文件系统的元数据放置在内存中,所以文件系统所能容纳的文件数目是由NameNode的内存大小来决定的,即每存入一个文件都会在NameNode中写入文件信息。如果写入太多小文件,NameNode内存会被占满而无法写入文件信息。而与多个小文件大小相同的单一文件只会写入一次文件信息到内存中,所以更适合大文件存储。
(3) 不支持多用户写入及任意修改文件
在HDFS的一个文件中只有一个写入者,而且写操作只能在文件末尾追加完成。
领取专属 10元无门槛券
私享最新 技术干货