大数据开发面试题之HDFS篇

了解 HDFS 吗,介绍下HDFS

HSDF 是 Hadoop 生态的一个组件,它是一个分布式文件系统。它将数据进行切分,存储在若干台机器上。它的出现解决了独立机器存储大数据集的压力

HDFS 的特点及应用场景

  • 适合存储大文件

HDFS支持 GB 级别甚至 TB 级别的文件,它会把大文件切分成若干个块存储在不同的节点上,在进行大文件读写时采用并行的方式提高数据的吞吐量。

  • 容错性高

HDFS有多副本机制,它会自动保存副本到不同的节点。即使有一台节点宕机了也不会丢失数据。

  • 适用于读多写少场景

HDFS中的文件支持一次写入、多次读取,写入操作是以追加的方式(append)添加在文件末尾,不支持对文件的任意位置进行修改

HDFS 有什么组件?

数据块(Block)

和磁盘的数据块概念相似,磁盘中的块是数据读写的最小单位,而HDFS中文件被切分成多个块,作为独立的存储单元,但是比磁盘的块大得多,默认为128MB.

NameNode 和 DataNode

HDFS 中由 NameNode 和 DataNode 组成 Master-Slave 模式(主从模式)运行。

NameNode 负责管理文件系统的命名空间和文件元数据,记录了每个文件中各个块所在的数据节点信息,而 DataNode 则是 HDFS 中的工作节点,负责存储数据和读写操作。

Secondary NameNode

它用于定期合并 edit logs 和 fsimage. Secondary NameNode运行在独立的计算机上,它只是一个辅助而不是一个备用

FSImage 和 Edits 是什么?干嘛用的?

fsimage 保存最新的元数据检查点,包含整个 HDFS 的所有目录(如修改时间和权限信息等)及文件的信息(如数据块描述信息等),HDFS 在启动时会加载 fsimage 的信息。

edit logs 主要是记录在 NameNode 启动的情况下对 HDFS 的各种更新操作,HDFS 客户端执行写操作都会被记录到 editlog 中。

SecondaryNameNode 有什么作用?

若 NameNode 宕机重启,那么就需要将 edit logs 里的内容合并到 fsimage 中,然后用于恢复。

但是 edit logs 文件一般比较大,合并会比较花时间,那么 NameNode 重启就会花很多时间。

SecondaryNameNode 就是为了减少启动时间,辅助 NameNode 定期合并 edit logs 和 fsimage.

HDFS 的 block 为什么是 128M ?增大或减小有什么影响?

这个大小是磁盘寻址时间和数据传输时间决定的。磁盘寻址时间一般是 10ms,磁盘的传输速率普遍为 100MB/s.

经验证,当磁盘寻址时间为数据传输时间的 1%,状态是最佳的。

通过计算最佳传输时间=10ms/0.01=1s,进一步计算出Block块大小=1s * 100MB=100MB,而我们磁盘block块的大小都是2^n倍,所以最合适的大小就是128MB.

太大会使得传输时间变长,太小会增加寻址时间。

HDFS 怎么修改默认块大小?

修改 hdfs-site.xml 文件的 dfs.blocksize 参数

HDFS 的存储机制

NameNode 主节点主要存储元数据,具体数据被分成若干个同样大小的数据块存储在若干 DataNode 中。

DataNode 会定期向集群内 NameNode 发送自己的执行状态与存储内容。

每个数据块会存储多个副本。

HDFS 的副本机制和机架感知

Hadoop 集群会分布在很多机架上。

为了提高效率,不同节点之间的通信应尽量发生在同一个机架之内,而不是跨机架。

另外为了提高容错能力,尽可能把数据块的副本放到多个机架上。

机架感知并不是自动感知的,而是需要管理者告知集群实现的。

以一个三副本为例,HDFS 机架感知和副本机制大概如图所示:

HDFS 文件读写流程

读流程:

  • 1、客户端向 NameNode 发起读数据请求;
  • 2、NameNode 响应请求并告诉客户端要读的文件的数据块位置;
  • 3、客户端就近到对应 DataNode 取数,当数据读取到达末端,关闭与这个 DataNode 的连接,并查找下一个数据块,直到文件数据全部读完;
  • 4、最后关闭输出流。

写流程:

  • 1、客户端发起写数据请求;
  • 2、NameNode 响应请求,然后做一些检查,比如查看文件是否存在,达标则创建文件;
  • 3、客户端将文件切分成若干个块,然后上传,先把第一个块传到 Datanode1,然后 Datanode1再传给Datanode2,以此类推,传完为止;
  • 4、成功后 DataNode 会返回一个确认队列给客户端,客户端进行效验,然后客户端上传下一个数据块到DataNode,直到所有数据块写入完成;
  • 5、当所有数据块全部写入成功后,客户端会向 NameNode 发送一个反馈并关闭数据流。

HDFS 支持并发写数据吗?

不支持

HDFS 的高可用机制

详见我的另一篇文章:面试官:你知道 HDFS 高可用机制吗?

HDFS 的数据一致性靠什么保证(如何保证数据不丢失)?

HDFS 有数据校验和机制。

假设客户端要发送 2KB 的数据,它会每隔 512 字节计算一次校验和,这样就可以计算出 checksum ,即 2KB/512B = 4; 然后 datanode 接收客户端发送来的数据,每接收 512B 的数据,checksum+1,后面比较客户端和 datanade 的 checksum.

客户端从 datanode 读数据时也要检查校验和,而且每个 datanode 还保存了检查校验和的日志,每次校验都会记录到日志。 若 checksum 发生变化,则数据异常,DateNode 会报告给 NameNode,NameNode 会发送一条命令,清除这个异常块,然后找到这个块对应的副本,将完整的副本复制给其他的 DataNode 节点。

HDFS 的容错机制有哪些?

1、读容错:文件块会存储多个副本,即使有一台节点宕机了也可以从其它节点读取;

2、写容错:写 HDFS 的过程中会对多个 DataNode 建立管道写入,若数据发送方没有收到其中某个 DataNode 的 ACK,则认为该 DataNode 失效,会跳过该 DataNode 并将数据写入剩余 DataNode。 NameNode 收集 DataNode 信息时发现文件的副本数与设置值不一致,会重新寻找一个 DataNode 保存副本。

3、HDFS 高可用模式

HDFS 的默认副本数?为什么是这个数量?如果想修改副本数怎么修改?

默认是3副本。这样是权衡了可靠性及数据的读写性能,设置机架感知。修改方式:hdfs-site.xml 文件的 dfs.replication 参数。

HDFS 的安全认证是怎么做的?

大数据安全认证之Kerberos

向 DataNode 写数据失败了,HDFS 会怎么样?

  • 1、关闭管道,将已经发送到管道中,还没有收到确认的数据包写回数据队列,防止数据丢失。
  • 2、正常工作的 DateNode 获得新的版本号,这样做是为了当故障节点恢复后删除。
  • 3、在正常工作的 DateNode 中,重新建立管道,并删除故障节点。
  • 4、若副本数量不足,会在另一个节点创建一个新的副本。

HDFS 跨集群怎么进行数据迁移?

使用 hadoop distcp 源端 目标端 命令,distcp的本质是一个 MapReduce 任务,只有 Map 阶段,没有 Reduce 阶段,具备分布式执行的特性

HDFS 合并多个文件的命令

HDFS 合并多个文件的命令有如下几种,可根据场景使用:

1、直接将本地的文件合并追加到HDFS的文件

hdfs dfs -appendToFile sourceLocalFiles(*) /targetPath/targetFile

2、合并文件到本地,然后再传HDFS

hdfs dfs -getmerge sourceHDFSFile(*)  LocalFile
hdfs dfs -put LocalFile targetHDFSFile

3、直接在HDFS上合并,通过管道进行

hdfs dfs -cat sourceFiles(*) | hdfs dfs -copyFromLocal - targetFile

*表示通配符

总结不易,如果对你有帮助,欢迎点赞+收藏。若有问题欢迎指正

#八股文##面经##数据开发工程师#
大数据从入门到放弃 文章被收录于专栏

写点大数据相关的内容,一起交流进步

全部评论
mark
点赞 回复 分享
发布于 昨天 21:11 广东

相关推荐

点赞 评论 收藏
分享
评论
2
4
分享

创作者周榜

更多
牛客网
牛客企业服务