什么是分布式文件系统
分布式文件系统
HDFS简介
-
HDFS是Hadoop Distributed File System的缩写,是Hadoop的核心组件之一,用于解决海量数据的存储问题;
-
HDFS能够在普通硬件上运行,具有高度容错的特性;
-
HDFS是Hadoop生态圈中最基础的底层模块;
-
HDFS使用多台计算机存储文件,但是提供了统一的访问接口,可以像访问普通文件系统那样访问HDFS,可以不用关心底层的存储逻辑。
HDFS的设计理念
- 硬件故障是常态,HDFS集群可能有成千上百台服务器组成,任何一台机器出现故障,如何保障数据不丢失?因此故障检测和数据恢复是HDFS架构的核心目标,即高容灾能力;
- HDFS应用主要是以流式读取数据(Streaming Data Access)。主要面向批处理,而不是用户交互式,相较于访问反应时间,更加注重数据访问的高吞吐量;
- HDFS存储大文件更加高效,小文件的存储不适用于HDFS;
- HDFS对文件的要求是write-one, read-many。文件一旦写入就不支持修改,对于数据一致性的假设让高吞吐成为了可能;
- 移动数据的代价高于移动计算,一个计算请求,离它操作的数据越近,计算就会越高效;
- HDFS具简单的跨平台可移植性。
HDFS的应用场景
适用场景:大文件、数据流式访问、一次写入多次读写、低成本部署、廉价PC、高容错
不适合场景:小文件、数据交互式访问要求高、低延时、频繁修改
HDFS架构设计
1. 主从架构
- HDFS集群是典型的主从架构集群(还有主备,不要混淆了)
- 由一个NameNode和一些DataNode组成
- 面向文件包含:文件数据(自身数据data)和文件元数据(metadata)
- NameNode(可以理解为账本)负责存储和管理文件元数据,并且维护了一个层次型的文件目录树
- DataNode负责存储文件数据(block块),并且提供block的读写(每个想存取数据的人都是先去问NameNode,然后去不同的DataNode那里存数据,是一种变相的负载能力)
- DataNode与NameNode维持心跳,并且汇报自己的block信息
- Client和Namenode交互文件元数据和datanode交互文件block数据 2. 分块存储
- 文件线性按照字节切割为块(block,每N个字节划为一个块),具有offset和id,(只要是文件,就是一个字节数组);
- 文件和文件的block大小可以不一样(但是同一个文件除了最后一个块其他块的大小都一样);
- block的大小依据硬件的I/O特性来调整;
- block被分散在集群的节点中,具有Location;
- block具有副本(replication,副本是满足可靠性和性能的关键),没有主从概念,副本不能出现在一个节点;
- 文件上传可以指定块的大小和副本数,上传后只能修改副本的数量;
- 一次写入多次读取,不支持修改(修改造成偏移量的变化,多台计算会为了这个修改操作进行计算,造成资源浪费);
- 支持追加数据(删除支持,是文件层面的,不是块层面的,不然偏移也会变)。 3. 副本机制
- 如果一个块的副本有三个 所有的block都会有副本,副本数可以在文件创建的时候指定,也可以使用命令进行修改。
- 第一个副本:放置在上传文件的DataNode,如果是集群外提交,则随机挑选一台磁盘不太满,CPU节点不太忙的节点。
- 第二个副本:放置于在第一个副本不同的机架的节点上(必须要出机架)
- 第三个副本:与第二个副本相同的机架的节点
- 更多副本:随机节点
之前的hadoop老版本,第一个和第二个副本不出机架,第三个才出机架,这是有问题的,如果只有两个副本,那么两个副本还是在同一个机架
4. 元数据记录
元数据(MetaData),在HDFS中NameNode管理的元数据有两类:
- 文件自身的属性信息 文件的名称、权限、修改时间、文件大小、复制因子、数据块大小。
- 文件位置映射信息 记录文件块和DataNode之间的映射信息,即block位于哪个节点上。
5. 抽象统一的层次目录结构(NameSpace)
- HDFS支持传统的层次性文件系统。用户可以创建目录,然后将文件保存在目录下
- NameNode负责维护文件系统的NameSpace名称空间,任何对文件系统的名称空间或属性的修改都会被NameNode记录下来
- HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件