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()函数,关闭输入流,整个读取过程结束
写过程:
- ①②客户端调用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消息之后,等待相应数量的副本写入完毕后,告知客户端即可。