一、HDFS设计目标
- 硬件故障是常态,HDFS可能由成百上千的服务器组成,每一个组件都有可能出现故障。因此故障检测和自动快速恢复是HDFS的核心架构目标
- HDFS上的应用主要是以流式读取数据。HDFS被设计成用于批处理,而不是用户交互的。相较于数据访问的反应时间,更注重数据访问的高吞吐量。
- 典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级的文件。
- 大部分HDFS应用对文件要求的是write-one-read-many访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了,这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
- 移动计算程序的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效。将计算程序移动到数据附近,比之将数据移动到应用所在服务器显然更好。
- HDFS被设计为可从一个平台轻松移植到另一个平台。这有助于将HDFS广泛用作大量应用程序的首选平台。
二、HDFS应用场景
- 适合的场景
- 大文件
- 数据流式访问
- 一次写入多次读取
- 低成本部署,廉价PC
- 高容错
- 不适合的场景
- 小文件
- 数据交互式访问
- 频繁任意修改
- 低延迟处理
三、HDFS重要特性
1、分块存储机制
- HDFS中的文件在物理上是分块存储的,块的大小通过配置参数来规定,参数位于hdfs-default.xml中:dfs.blocksize。Hadoop1.0时默认为64M,2.0开始变成了128M。想修改默认大小时,修改hdfs-site.xml文件即可。
- 块大小设置原理:按照经验,寻址时间占读取数据的时间的1%为最佳,又因为寻址时间一般为10ms,所以读取数据的时间最好为1s,因此,在当前大部分磁盘读取速度为100MB/s的时候,单块的大小应该为100M左右,所以是128M,如果磁盘读取速度为200MB/s,可设置为256M,400MB/s时,可为512M
2.副本机制
- 文件的所有block都会有副本。每个文件的block大小(dfs.blocksize)和副本系数(dfs.replication)都是可配置的。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变。
- 默认dfs.replication的值是3,也就是会额外复制2份,连同本身总共3份。
3、namespace
- HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
- Namenode负责维护文件系统的namespace名称空间,任何对文件系统名称空间或属性的修改都将被Namenode记录下来。
- HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
4.元数据管理
在HDFS中,Namenode管理的元数据具有两种类型
- 文件自身属性信息
文件名称、权限,修改时间,文件大小,复制因子,数据块大小。 - 文件块位置映射信息
记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。