1.HDFS的名称节点和数据节点的具体功能;
2.HDFS如何减轻中心节点的负担;
3.HDFS设置唯一一个名称节点的局限性表现在哪些方面;
4.HDFS如何探测错误发生以及如何进行恢复;
5.HDFS不发生故障的情况下读文件的过程;
6.HDFS不发生故障的情况下写文件的过程。
1.解:
名称节点负责管理分布式文件系统的命名空间,记录分布式文件系统中的每个文件中各个块所在的数据节点的位置信息;
数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并向名称节点定期发送自己所存储的块的列表。
2.解:
a. 客户端直接从数据节点获取或写入数据,防止了数据都从一个节点输出或写入,避免了单一节点造成了整个集群的瓶颈。
b. HDFS中的块的状态和路径是在整个集群启动的时候获取的,避免了中心节点保存过多冗余的信息,也减轻了中心节点的负担。
c. 中心节点的元数据以log的形式存储,并且会给这个log打上一个快照。一旦集群发生故障,只需要从最近一次的快照开始恢复就行。这样整个集群恢复的速度就会比较快。
3.解:
a.命名空间限制;命名空间中的对象如文件,目录,文件块,数据块,数据节点等这些信息占用一定字节。 NameNode保存全局命名空间,NameNode的内存有上限,因此保存的命名空间的大小有限制。
b.性能瓶颈。整个分布式文件系统的吞吐量受限于单个名称节点的吞吐量。
c.隔离问题。由于集群问题中只有一个名称节点,只有一个命名空间,因此无法对不同应用程序进行隔离。
d.集群可用性。唯一的名称节点发送故障,导致整个集群变得不可用。
4.解:
(1)名称节点出错:
1)把名称节点的元数据信息同步存储到其他文件系统;
2)可以把第二名称节点作为补救措施。
一般可以把这两者结合使用,其他文件系统的元数据信息放到第二名称节点进行恢复,并把第二名称节点作为名称节点使用(这样做仍然会有一部分数据丢失)。
(2)数据节点出错:
数据节点定期向名称节点发送心跳信息,向名称节点报告状态,如果名称节点没有收到某些数据节点时,这时名称节点将这些数据节点标记为宕机,由于这些数据节点不可用导致一些数据块的副本数据量小于冗余因子时,就会启动数据冗余复制,生成新的副本。
(3)数据出错:
网络传输和磁盘错误等因素都会造成数据的错误,客户端读取数据后,会采用md5对数据块进行校验,以正确读取到正确的数据。如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并向名称节点报告这个文件错误,名称节点会定期检查并重新复制这个块。
5.解:
1)使用HDFS提供的客户端Client,向远程的NameNode发起RPC请求;
2)NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回有该block拷贝的DataNode地址;
3)客户端Client会选取离客户端最近的DataNode来读取block;如果客户端本身就是DataNode,那么将从本地直接获取数据;
4)读取完当前block的数据后,关闭当前的DataNode链接,并为读取下一个block寻找最佳的DataNode;
5)当读完列表block后,且文件读取还没有结束,客户端会继续向NameNode获取下一批的block列表;
6)读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。
6.解:
1)使用HDFS提供的客户端Client,向远程的NameNode发起RPC请求;
2)NameNode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
3)当客户端开始写入文件的时候,客户端会将文件切分成多个packets,并在内部以数据队列“data queue”的形式管理这些packets,并向NameNode申请blocks,获取用来存储replicas的合适的datanode列表,列表的大小根据NameNode中replication的设定而定;
4)开始以pipeline的形式将packet写入所有的repilicas中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给此pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方法呈流水线的形式。
5)最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着“ack queue”,成功收到datanode返回的ack packet后会从“ack queue”移除响应的packet。
6)如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时NameNode会分配一个新的datanode,保持replicas设定的数量。
7)客户端完成数据的写入,会对数据流调用close()方法,关闭数据流;
8)只要写入了dfs.replication.min的副本数(默认为1),写操作就会成功,并且这个块可以在集群中异步复制,直到达到其目标副本数(dfs.replication的默认值为3),因为namenode已经知道文件由哪些块组成,所以它在返回成功前只需要等待数据块进行最小量的复制。