大数据面试题--HDFS篇

NameNode和Secondary NameNode区别?

第一阶段:NameNode启动
(1)NameNode服务工作,第一次启动格式化后,创建fsimage和editlog文件。如果不是第一次启动,直接加载镜像文件和日志到内存。
(2)处理客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对数据进行增删改查。

第二阶段:Secondary NameNode工作
(1)Secondary NameNode服务工作,询问NameNode是否需要checkpoint,直接返回请求结果。
(2)Secondary NameNode请求执行checkpoint
(3)NameNode滚动正在写的editlog日志
(4)将滚动前的镜像文件和编辑日志拷贝到Secondary NameNode
(5)Secondary NameNode加载镜像文件和编辑日志到内存,并进行合并
(6)生成新的镜像文件fsimage.chkpoint
(7)拷贝fsimage.chkpoint到NameNode
(8)NameNode将fsimage.chkpoint重新命名为fsimage

NN和2NN工作机制详解:

Fsimage: namenode内存中元数据序列化后形成的文件
Edits:记录客户端更新元数据信息的每一步操作

namenode启动时,先滚动edits并生成一个空的edits.inprogress(第一次启动会创建fsimage和edits文件),然后加载edits和fsimage到内存中,此时namenode内存就持有最新的元数据信息。client开始对namenode发送元数据的增删改查的请求,这些请求的操作首先会被记录的edits.inprogress中(查询元数据的操作不会被记录在edits中,因为查询操作不会更改元数据信息),如果此时namenode挂掉,重启后会从edits中读取元数据的信息。然后,namenode会在内存中执行元数据的增删改查的操作。

为了防止edits中记录的数据过大,导致namenode在启动加载edits时会很慢,所以需要对edits和fsiamge进行合并(所谓合并,就是将edits和fsimage加载到内存中,照着edits中的操作一步步执行,最终形成新的fsimage)。secondarynamenode的作用就是帮助namenode进行edits和fsimage的合并工作。

secondarynamenode首先会询问namenode是否需要checkpoint(触发checkpoint需要满足两个条件中的任意一个,定时时间到和edits中数据写满了)。直接带回namenode是否检查结果。secondarynamenode执行checkpoint操作,首先会让namenode滚动edits并生成一个空的edits.inprogress,滚动edits的目的是给edits打个标记,以后所有新的操作都写入edits.inprogress,其他未合并的edits和fsimage会拷贝到secondarynamenode的本地,然后将拷贝的edits和fsimage加载到内存中进行合并,生成fsimage.chkpoint,然后将fsimage.chkpoint拷贝给namenode,重命名为fsimage后替换掉原来的fsimage。namenode在启动时就只需要加载之前未合并的edits和fsimage即可,因为合并过的edits中的元数据信息已经被记录在fsimage中。

块存储的好处、HDFS的默认块大小是多少?128MB window block是多大?32MB?

块存储是指在一个RAID(独立磁盘冗余阵列)集中,一个控制器加入一组磁盘驱动器,然后提供固定大小的RAID块作为LUN(逻辑单元号)的卷。
优点:
(1)对数据提供了保护机制
(2)可以将多块廉价的硬盘组合在一起,成为一个大容量的逻辑盘对外提供服务,提高了容量。
(3)写入数据时,由于是多块磁盘组合而成的逻辑盘,所以几块磁盘可以并行写入,提供了读写效率
(4)块存储大多采用SAN架构组网,提升了传输速率和读写速率
缺点:
(1)采用SAN架构组网时,需要额外为主机购买光纤通道卡,还要买光纤交换机,造价成本高。
(2)在服务器不做集群的情况下,主机之间的数据无法共享。
(3)不利于不同操作系统之间的数据共享。

块的大小设置原则:最小化寻址开销。
HDFS的块比磁盘的块大(磁盘的块一般为512字节),其目的是为了最小化寻址开销
然而真正实际开发中要把block设置的远大于128MB,比如存储文件是1TB时,一般把Block大小设置成512MB.但是也不能任意设置的太大,比如200GB一个,因为在MapReduce的map任务中通常一次只处理一个块中数据(切片大小默认等于block大小),如果设置太大,因为任务数太少(少于集群中的节点数量),那么作业的运行速度就会慢很多,此外比如故障等原因也会拖慢速度。

DAS:服务器直接访问存储,直连的方式;
NAS:通过IP网络来访问存储,一般是用到cifs、nfs这类的协议来方式访问,主要是文件访问;
SAN:单独的存储网络,即有IP SAN也有FC SAN,一般至块存储的访问方式。
至于SAN网络,简单理解就是点到点的访问,中间通过专业的网络协议来实现,也有对应的交换机、路由器设备。

HDFS为何不能存储小文件?

(1)小文件过多,会过多占用namenode的内存,造成block的浪费。

  • 文件的元数据(包含文件被分成了哪些block,每个block存储在哪些服务器的哪个block上)都是存储在namenode上的。HDFS的每个目录、文件、数据块占用150B,因此300MB内存情况下,只能存储不超过300MB/150B=1024*1024=1048576个目录、文件、数据块的元数据。
  • datanode会向namenode发送两种类型的报告:增量报告和全量报告。增量报告是当namenode接收到block或者删除block时,会向namenode报告;全量报告是周期性的,namenode处理100万的block需要1s左右,这个时间会被锁住,其他的请求会被阻塞。

(2)文件过小,寻址时间大于数据读写时间,不符合HDFS的设计初衷。

  • HDFS为了使数据的传输速度和硬盘的传输速度接近,在设计上将寻址时间相对最小化,将block的大小设置的比较大,这样读写数据块的时间大于寻址时间,接近于硬盘的传输速度。
什么是Rack机架感知?

在集群规模比较大时,机架感知能告诉集群哪台机器属于哪台机架。那么它是如何做到的呢?Hadoop对机架的感知并非是自适应的,即Hadoop集群分辨某台lave机器属于哪个机架并非是智能感知的,而是需要Hadoop的管理者人为地告知Hadoop哪台机器属于哪个机架,这样在Hadoop的启动初始化时,会将这些机器与Rack的对应信息保存在内存中,用来作为对接下来所有的HDFS的写块操作分配datanode列表时的选择策略(尽量将多个副本分布在不同的Rack)。机架感知需要考虑的情况:

  • 不同节点的通信能够尽量发生在同一个机架内
  • 为了提高容错能力,namenode节点会尽可能把数据的副本放到多个机架上。
HDFS-HA: NameNode、DataNode、Zookeeper、JournalNode、zkfc、fsimage、editlog
  • NameNode:一个中心服务器,负责管理文件系统的namespace以及客户端对文件的访问。NameNode执行文件系统的namespace操作,比如打开、关闭、重命名目录或文件,同时它还确定block和DataNode节点的映射关系。
  • DataNode:负责处理文件系统客户端的读写请求,在NameNode的统一调度下进行数据块的创建、删除和复制
  • Zookeeper:一个分布式的、开源的分布式应用协调服务,是Google的Chubby的一个开源实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
  • JournalNode:运行的JournalNode进程非常轻量,可以部署在其他的服务器上。注意:节点数至少3个。
  • zkfc:ZooKeeperFailoverController作为一个ZK集群的客户端,主要用来监控NameNode的状态信息。
  • fsimage:fsiamge文件实质是Hadoop文件系统元数据的一个永久检查点,其中包含Hadoop文件系统的所有目录和文件id的序列化信息。
  • editlog:editlog文件存放的是Hadoop文件系统的所有更新操作的命令,文件系统客户端执行的所有写操作首先会被记录到editlog文件中。

你可能感兴趣的:(大数据面试题,大数据,面试题)