HDFS复习题

  • 1.HDFS中英文全称?
  • 2.一个基本的Hadoop集群中,HDFS包含的节点有哪些?
  • 3.HDFS默认一个块大小是多少?
  • 4.HDFS优点?
  • 5.HDFS缺点?
  • 6.名称节点每次的启动的详细全过程
  • 7.第二名称节点工作过程
  • 8.为什么第二名称节点不能解决单点故障问题?
  • 9.HDFS冗余存储的策略:
  • 10.HDFS中的数据错误一般有哪三种?
  • 11.HDFS数据读写过程?


1.HDFS中英文全称?

Hadoop Distributed File System

2.一个基本的Hadoop集群中,HDFS包含的节点有哪些?

  • NameNode:名称节点,负责协调集群中的数据存储
  • DataNode:数据节点,存储被拆分的数据块
  • SecondaryNameNode:帮助NameNode收集文件系统运行的状态信息

3.HDFS默认一个块大小是多少?

64MB

4.HDFS优点?

  • 兼容廉价的硬件设备
  • 流数据读写
  • 大数据集
  • 跨平台兼容性
  • 简单的文件模型

5.HDFS缺点?

  • 不支持多用户写入和任意修改文件
  • 不适合低延迟数据访问
  • 无法高效存储大量小文件

6.名称节点每次的启动的详细全过程

  • 首先用Shell命令启动名称节点,将FsImage文件中的内容从磁盘加载到内存中。
  • 然后,逐一执行EditLog日志文件中记载的各项操作,再将这些操作产生的结果,逐一添加和更新到FsImage文件中。
  • 这样会得到一个更新完成的新版的FsImage文件,旧版的FsImage会删掉,同时,创建一个空的EditLog文件,旧的日志文件也删掉

7.第二名称节点工作过程

  • SecondaryNameNode将下载下来的FsImage载入到内存中,然后一条一条地执行EditLog文件中的各项更新操作,从而得到一个新的FsImage;
  • Namenode将从SecondaryNameNode接收到的新的FsImage替换旧的Fsimage文件,同时将Edit.New(更新时,新操作会写在这个建的新文件上)替换EditLog文件,通过这个过程EditLog就变小了

8.为什么第二名称节点不能解决单点故障问题?

因为第二名称节点是冷备份。由于集群中只有一个名称节点,只有一个命名空间,因此,无法对不同应用程序进行隔离,一旦这个唯一的名称节点发生故障,会导致整个集群变得不可用,这就是所谓的单点故障,只有一个名称节点时不可避免

9.HDFS冗余存储的策略:

  • 第一个副本:若由某个数据节点创建文件块副本,则就放在本地;如果是集群外提交副本,则随机挑选一台磁盘不太满、CPU不太忙的节点
  • 第二个副本:放置在与第一个副本不同的机架的节点上(鸡蛋不放在同一篮子里)
  • 第三个副本:与第一个副本相同机架的其他节点上(同机架节点间传输速度快)
  • 更多副本:随机节点存储

10.HDFS中的数据错误一般有哪三种?

  • 名称节点出错
  • 数据节点出错
  • 数据出错

11.HDFS数据读写过程?

读过程:

客户端向HDFS请求打开文件,使用FileSystem的open()方法,返回的是一个输入流FS Data Input Stream

DFS Input Stream中构造函数的代码会远程调用名称节点(通过接口),从名称节点获得文件开始部分的数据块的保存位置。

得到数据节点地址之后,DFS会将DFS Input Stream这个类实例化,并将这个实例化之后的对象,连同数据块的节点地址,一起返回给客户端

客户端获得这个实例和数据块的节点地址之后,调用read()函数,开始读取数据

这一块数据读完之后,客户端关闭和该块数据的连接,并且开始调用getBlockLocation()方法查找下一个数据块的位置

重复第4个步骤,直到所有数据块都读取完毕

所有数据块都读取完毕之后,调用DFS Input Stream这个类中的close()函数,关闭输入流,整个读取过程结束

hdfs 填空题 hdfs题库_hdfs 填空题


写过程:

  • ①②客户端调用FileSystem实例的create方法,创建文件。NameNode通过检查,比如文件是否存在,客户端是否拥有创建权限等;通过检查之后,在NameNode添加文件信息。注意,因为此时文件没有数据,所以NameNode上也没有文件数据块信息。创建结束后,HDFS会返回一个输出流DFSDataOutputStream给客户端。
  • ③客户端调用输出流DFSDataOutputStream的write方法向HDFS中对应的文件写入数据。数据首先会被分包,这些分包会写入一个输入流内部队列Data队列中,接收完整数据分包,输出流DFSDataOutputStream会向nameNode申请保存文件和副本数据块的若干个DataNode,这若个个DataNode会形成一个数据传输管道。
  • ④DFSDataOutputStream会(根据网络拓扑结构排序)将数据传输给距离上最短的DataNode,这个DataNode接收到数据包之后会传递给下一个DataNode,数据在各DataNode之间通过管道流动,而不是全部由输出流分发,这样可以减少传输开销。
  • ⑤因为DataNode位于不同机器上,数据需要通过网络发送,所以,为了保证所有的DataNode的数据都是准确的,接收到数据的DataNode要向发送者发送确认包(ACKPacket)。对于某个数据块,只有当DFSDataOutputStream收到了所有DataNode的正确ACK,才能确认传输结束。DFSDataOutputStream内部专门维护了一个等待ACK队列,这一队列保存已经进入管道传输数据、但是并未被完全确认的数据包。
  • 不断③-⑤直到数据全部写完,客户端调用close关闭文件。
  • ⑥客户端调用close方法,DFSDataOutputStream继续等待直到所有数据写入完毕并被确认,调用complete方法通知NameNode文件写入完成。
  • ⑦NameNode接收到complete消息之后,等待相应数量的副本写入完毕后,告知客户端即可。