一、HDFS的设计
-
1.超大文件
超大文件指 GB、TB甚至PB级别的数据。 -
2.流式数据访问
HDFS的构建思路是这样的:一次写入、多次读取是最高效的访问模式。 -
3.商用硬件
Hadoop并不需要运行在昂贵的高可靠硬件上。 -
4.不适合低时间延迟的数据访问
要求低时间延迟数据访问的应用,不适合在HDFS上面应用。 -
5.不适合大量小文件
由于namenode系统的元数据存储在内存中,因此能存储的文件总数受限于namede的内存容量。根据经验,每个文件、目录和数据块的存储信息大约占150字节。尽管存储上百万个文件是可行的,但是存储数十亿个文件就超出了当前硬件的能力。 -
6.不支持多用户写入,任意修改文件
HDFS文件的写入只支持单个写入者,且写操作总是以"只添加"的方式在文件尾写数据。
二、HDFS的概念
-
1.数据块
- HDFS的块(block)大小默认为128M
- 块适合数据备份,提高容错能力和高可用性。每个block默认有3个副本
- HDFS的块为什么设置成128M?
- HDFS 的块比磁盘块大,其目的主要是为了最小化寻址开销。如果块足够大,从磁盘传输数据的时间,明显大于定位这个块起始位置的时间。因而,传输一个有多个块组成的大文件的时间 取决于磁盘传输的速率,而不受寻址时间的影响。
- 如果寻址时间为10ms,传输的速率为100MB/s,寻址时间 仅占传输时间的1%是最佳的。则传输时间为1s,所以我们需要将块大小设置成100MB左右。默认的块大小为128M。
- 块大小随着传输速率的提升,会设置更大。但是块大小也不能设置的过大。map任务通常一次处理一个块的数据,如果过大,作业运行速度就会变慢
-
2.namenode 和 datanode
- namenode管理文件系统的命名空间 。它维护着文件系统树 及整个树内的所有文件和目录。这些信息以两个文件的形式永久的保存在本地磁盘上:命名空间镜像文件和编辑日志文件。namenode也记录着每个文件在各个块所在的节点信息。
- datanode是文件系统的工作节点。存储并检索数据块,并且定期的向namenode发送存储块的列表。
-
3.块缓存
- datanode通常从磁盘中读取块,但对于访问频繁的文件,可以被显示的缓存在datanode的内存中。例如mapjoin中使用的一小的查询表就是块缓存的应用。
-
4.联邦HDFS
- 联邦HDFS允许系统通过添加namenode实现扩展,其中每一个namenode管理文件系统命名空间的一部分。 例如,一个namenode管理/user目录下的文件,另一namenode管理/share目录下的文件。
-
5. HDFS的高可用
- HDFS的高可用,即namenode的高可用。通过配置 active-standy namenode 可以实现namemode高可用,当active namenode失效了时,备用的standy namenode就会接管任务,处理客户端的请求。
- HDFS系统中 有一个 故障转移器(failover controller)的实体,管理着将活动namenode 转为备用namenode的过程。默认使用zookeeper 来确保有且仅有一个活动namenode。每一个namenode都运行这着一个轻量级的故障转移器,通过简单的心跳机制,判断该namenode是否失效,并在namenode失效时进行故障企划