大数据开发面试题之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 保存副本。
HDFS 的默认副本数?为什么是这个数量?如果想修改副本数怎么修改?
默认是3副本。这样是权衡了可靠性及数据的读写性能,设置机架感知。修改方式:hdfs-site.xml 文件的 dfs.replication 参数。
HDFS 的安全认证是怎么做的?
向 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
*表示通配符
总结不易,如果对你有帮助,欢迎点赞+收藏。若有问题欢迎指正
#八股文##面经##数据开发工程师#写点大数据相关的内容,一起交流进步