前言:
网上摘录的一些 hdfs的信息。
1. HDFS优缺点
1.1 优点
1.1.1高容错性
可以由数百或数千个服务器机器组成,每个服务器机器存储文件系统数据的一部分;
数据自动保存多个副本;
副本丢失后检测故障快速,自动恢复。1.1.2适合批处理
移动计算而非数据;
数据位置暴露给计算框架;
数据访问的高吞吐量 ;
运行的应用程序对其数据集进行流式访问。1.1.3适合大数据处理
典型文件大小为千兆字节到太字节;
支持单个实例中的数千万个文件;
10K+节点。1.1.4 可构建在廉价的机器上
通过多副本提高可靠性;
提供了容错与恢复机制 。1.1.5跨异构硬件和软件平台的可移植性强
轻松地从一个平台移植到另一个平台。1.1.6 简单一致性模型
应用程序需要一次写入多次读取文件的访问模型;
除了追加和截断之外,不需要更改已创建,写入和关闭的文件;
简化了数据一致性问题,并实现了高吞吐量数据访问;
高度可配置,具有非常适合于许多安装的默认配置。大多数时候,只需要为非常大的集群调整配置。1.2 缺点
1.2.1 不适合低延迟的数据访问
HDFS设计更多的是批处理,而不是用户交互使用。重点在于数据访问的高吞吐量,而不是数据访问的低延迟。1.2.2不适合小文件存取
占用NameNode大量内存;
寻道时间超过读取时间。1.2.3无法并发写入、文件随即修改
一个文件只能有一个写者;
仅支持追加和截断。
2. 基本组成
2.1 Namenode
2.1.1 接受客户端的读写服务
执行文件系统命名空间操作,如打开,关闭和重命名文件和目录。
2.1.2 管理文件系统命名空间
记录对文件系统命名空间或其属性的任何更改。
2.1.3metadata组成
Metadata是存储在Namenode上的元数据信息,它存储到磁盘的文件名为:fsimage。并且有个叫edits的文件记录对metadata的操作日志。总体来说,fsimage与edits文件记录了Metadata中的权限信息和文件系统目录树、文件包含哪些块、确定块到DataNode的映射、Block存放在哪些DataNode上(由DataNode启动时上报)。
NameNode将这些信息加载到内存并进行拼装,就成为了一个完整的元数据信息。
2.1.4文件系统命名空间
HDFS支持传统的分层文件组织。用户或应用程序可以在这些目录中创建目录和存储文件。文件系统命名空间层次结构与大多数其他现有文件系统类似:可以创建和删除文件,将文件从一个目录移动到另一个目录,或重命名文件。HDFS支持用户配额和访问权限。但不支持硬链接或软链接。
NameNode维护文件系统命名空间。对文件系统命名空间或其属性的任何更改由NameNode记录。应用程序可以指定应由HDFS维护的文件的副本数。文件的副本数称为该文件的复制因子。此信息由NameNode存储。
2.1.5 文件系统元数据的持久性
NameNode的metadata信息在启动后会加载到内存,由于加载到内存的数据很不安全,断电后就没有了,因此必须对内存中存放的信息做持久化处理。
Namenode上保存着HDFS的命名空间。对于任何对文件系统元数据产生修改的操作,Namenode都会使用一种称为Edits的事务日志记录下来。例如,在HDFS中创建一个文件,Namenode就会在Edits中插入一条记录来表示;同样地,修改文件的副本系数也将往Edits插入一条记录。Namenode在本地操作系统的文件系统中存储这个Edits。整个文件系统的命名空间,包括数据块到文件的映射、文件的属性等,都存储在一个称为FsImage的文件中,这个文件也是放在Namenode所在的本地文件系统上。
Namenode在内存中保存着整个文件系统的命名空间和文件数据块映射(Blockmap)的映像。这个关键的元数据结构设计得很紧凑,因而一个有4G内存的Namenode足够支撑大量的文件和目录。当Namenode启动时,它从硬盘中读取Edits和FsImage,将所有Edits中的事务作用在内存中的FsImage上,并将这个新版本的FsImage从内存中保存到本地磁盘上,然后删除旧的Edits,因为这个旧的Edits的事务都已经作用在FsImage上了。这个过程称为一个检查点(checkpoint)。
Datanode将HDFS数据以文件的形式存储在本地的文件系统中,它并不知道有关HDFS文件的信息。它把每个HDFS数据块存储在本地文件系统的一个单独的文件中。Datanode并不在同一个目录创建所有的文件,实际上,它用试探的方法来确定每个目录的最佳文件数目,并且在适当的时候创建子目录。在同一个目录中创建所有的本地文件并不是最优的选择,这是因为本地文件系统可能无法高效地在单个目录中支持大量的文件。当一个Datanode启动时,它会扫描本地文件系统,产生一个这些本地文件对应的所有HDFS数据块的列表,然后作为报告发送到Namenode,这个报告就是块状态报告。