HDFS 概述
产生背景
随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。
HDFS 定义
HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
HDFS 优缺点
优点
- 高容错性
数据自动保存多个副本。它通过增加副本的形式,提高容错性。
某一个副本丢失以后,它可以自动恢复。
- 适合处理大数据
数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据;
文件规模:能够处理百万规模以上的文件数量,数量相当之大。
- 构建在廉价机器上
缺点
- 不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。
- 无法高效的对大量小文件进行存储。
小文件过多,会过多占用 Namenode 的内存,并浪费block。因为HDFS的每个文件、目录、数据块占用150B空间大小。
- 不支持并发写入、文件随机修改。
HDFS 组成架构
NameNode:就是一个Master。主要负责:
- 管理HDFS的名称空间
- 配置副本策略
- 管理数据块(Block)映射信息
- 处理客户端读写请求
DataNode:就是Slave。主要负责:
- 存储实际的数据块
- 执行数据块的读/写操作
Client:就是客户端,例如(Java代码,hdfs dfs)。主要负责:
- 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传
- 与NameNode交互,获取文件的位置信息
- 与DataNode交互,读取或者写入数据
- Client提供一些命令来管理HDFS,比如NameNode格式化
- Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作
Secondary NameNode:NameNode 辅助节点,主要负责:
- 合并 fsimage 和 edit logs
NameNode 为了效率高,所以将目录结构相关数据放在内存中。但是因为内存容易丢失,所以内存中的数据需要持久化。那么谁来做这件事情?
NameNode不能完成这件事情吗,当然可以的。如果这么设计会导致 NameNode 节点任务繁重执行效率低下,因此诞生了- Secondary NameNode
HDFS 文件块大小
在 Hadoop2.x 版本中是 128M,老版本中是 64M。可通过配置文件修改。
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
<description>
The default block size for new files, in bytes.
You can use the following suffix (case insensitive):
k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.),
Or provide complete size in bytes (such as 134217728 for 128 MB).
</description>
</property>
参考资料
- Hadoop海量数据处理:技术详解与项目实战(第2版)
- 尚硅谷大数据