在大数据面试中,深刻理解 Hadoop 是取得成功的关键之一。以下是一些关于 Hadoop 的HDFS存储系统的高频面试题目以及解答思路和经验分享:
一、 HDFS读流程
- 发起下载请求: 客户端创建分布式文件系统,向 NameNode 请求下载 user/warehouse/ss.avi 文件;
- 获取文件元数据:NameNode 返回目标文件的元数据,包括文件块的位置;
- 请求读取第一个块:客户端向 data1 请求读取第一个块;
- 数据传输:data1 通过 FSDataInputStream 将数据返回给客户端;
- 继续请求读取:重复步骤 3-4 直到所有文件块都读取完毕,然后关闭 FSDataInputStream。
二、 HDFS写流程
- 发起上传请求:客户端创建分布式文件系统,向 NameNode 请求上传 user/warehouse/ss.avi 文件;
- 权限与路径检查:NameNode 检查路径是否存在,客户端是否有上传权限,然后向客户端响应可上传文件;
- 请求上传第一个块:客户端请求上传第一个块,让 NameNode 返回 DataNode;
- 分配存储位置:NameNode 返回 dn1、dn2、dn3,表示用这三个节点存储数据;
- 建立传输通道:客户端请求建立块传输通道,三个 DataNode 相互协作;
- 数据传输与同步:客户端通过 FSDataOutputStream 向 dn1 传输数据,dn1 将数据保存并传输给 dn2,dn2 再同步给 dn3;
- 完成传输:数据传输完成后客户端关闭 FSDataOutputStream 并向 NameNode 响应数据传输成功。
三、HDFS写入流程中DataNode挂掉的处理
在某个 DataNode 挂掉时:
- 客户端无法接收该 DataNode 的 ACK 确认;
- 客户端通知 NameNode;
- NameNode 检查并确定该块的副本与规定不符后通知其他空闲的 DataNode 复制副本;
- 挂掉的节点恢复后,先删除不完整的数据。
四、HDFS的NameNode内存
- Hadoop 2.x 系列,配置 NameNode 默认为 2000MB;
- Hadoop 3.x 系列,NameNode 的内存是动态分配的,默认最小内存为 1GB,每增加 100 万个文件块,增加 1GB 内存。
五、小文件问题及解决方案
危害
- 存储层面:一个文件块占用 NameNode 大约 150 字节内存,128GB 内存可存储 9.1 亿文件块;
- 计算层面:每个小文件启动一个 MapTask,默认内存 1GB,浪费资源。
解决方案
- 采用HAR归档;
- 采用CombineTextInputFormat;
- 开启JVM重用;
- 自行编写MapReduce程序合并小文件。
六、纠删码原理
- HDFS 默认情况下有三个副本,引入纠删码,通过计算方式可节省约一半的存储空间。
- 例如,使用 rs-3-2-1024k 编码,每三个数据单元生成两个检验单元,共 5 个单元,只要有任意的三个单元存在就可以得到原始数据。
七、异构存储
- 存储类型:
- RAM_DISK(内存镜像文件系统)
- SSD(固态硬盘)
- DISK(普通磁盘)
- ARCHIVE(归档)
- 存储策略:
- lazy_persist:一个副本在 RAM_DISK,其余在 DISK;
- all_ssd:所有副本在 SSD;
- one_ssd:一个副本在 SSD,其余在 DISK;
- hot(默认):所有副本在 DISK。
八、 HDFS的优缺点
优点
- 高容错性:数据自动保存多个副本,通过增加副本提高容错性;
- 适合处理大数据(数据规模、文件规模);
- 可构建在廉价机器上,通过多副本机制提高可靠性。
缺点
- 不适合低延时数据访问,比如毫秒级的存储数据是做不到的;
- 无法高效的对大量小文件进行存储,可能占用 NameNode 大量内存;
- 不支持并发写入、文件随机修改。
九、HDFS文件块大小
- 寻址与传输时间:寻址时间与传输时间的最佳状态为 1%;
- 磁盘传输速率:目前磁盘传输速率为 100MB/s;
- 文件块大小设置:取决于磁盘传输速率。
以上是关于 Hadoop 的HDFS系统的高频面试题目,希望这些问题和解答思路能够在面试中帮助你更自信地回答。如有特定问题或需要深入了解,请在评论区留言,我将尽力提供帮助。
- 存储策略: