习题2¶
1. 试举例说明 HDFS 在实际应用中的作用。¶
- 存储 TB 级别的大文件
- 保证文件系统的容错
- 实现大文件的并发读写控制
2. HDFS 的主要部件有哪些?各个部件分别有什么作用?¶
- NameNode: 负责 HDFS 的管理工作,包括管理文件目录结构、位置等元数据、维护 DataNode 的状态等,NameNode 并不实际存储文件
- Secondary NameNode: 充当 NameNode 的备份,NameNode 故障时利用 Secondary NameNode 进行恢复
- DataNode: 负责存储文件,根据 NameNode 的控制信息存储和管理对应的文件块,并定期向 NameNode 汇报自己的状态(通过 TCP 协议发送心跳信息)
3. HDFS 的文件分块是什么?和操作系统的文件系统中块的概念有何联系与区别?¶
HDFS 把文件分成若干个固定大小的块,这些块的大小用户可以指定,比如为 128 MB,然后分布存储于 DataNode 中,HDFS 的文件分块单纯是把数据分块。操作系统中,块的大小通常为 512 B 或者 4 KB,块的大小通常是固定的,一些文件系统允许用户指定块的大小,例如 ext2 和 ext 3 文件系统。操作系统的文件分块是系统层面指定的,是为了让系统更好地工作。
HDFS 与操作系统的文件分块都是为了更好地管理文件。
4. 简述客户端从 HDFS 读取某一文件时的工作过程¶
- 客户端和 NameNode 通信,请求读取一个文件
- NameNode 判断路径等信息是否合法,如果合法,返回这个文件所有数据块的存放地址
- 对于第一个数据块,客户端从最近的存放该数据块的 DataNode 读取数据
- 当读取完第一个数据块后,客户端从最近的存放第二个数据块的 DataNode 读取数据
- 以此类推,直到读取完所有数据块
5. HDFS 为什么要采用“一次写入,多次读取”的方式?¶
- “一次写入” 可以在文件系统写的时候防止其他的写与读取,提升了数据写入 / 读取的一致性。
- 文件内容一经写入,就不可在其中间修改,只能在末尾添加或者删除再重新写入。这件花了数据块管理与同步的困难,增强了数据一致性。
- 对于一个文件的读操作可以并发执行,提升了读文件的效率,因为读文件不会给这个系统的数据一致性等等带来影响。
6. 为什么HDFS要按照逐个进行的阻塞方式读写文件块?能否并行读写文件块?¶
客户端向HDFS读写文件块时,NameNode需要先定位到需要读 / 写的位置,再进行数据包传输。同时在这个节点写的时候,DataNode 从一个节点向其他节点写入同样的数据包(这些都是一样的数据块)。待写入完成一个数据块并且完成分布式备份后,再向 NameNode 申请下一个数据块并开始读 / 写。
不能。HDFS 需要在读写的同时确定副本的位置,并行会增加系统的负担。阻塞可保证数据块在不同的 DataNode 上面有不同的副本数,避免数据丢失或损坏。