1. HDFS的架构
HDFS的架构可以分为以下几个主要组件:
-
NameNode(名称节点):
- NameNode是HDFS的关键组件之一,负责管理文件系统的命名空间(文件和目录结构)以及客户端的访问请求。
- 它维护了整个文件系统的元数据,包括文件和目录的层次结构、文件的权限和属性等。
- NameNode记录了文件系统中每个数据块的位置信息(存储在哪个数据节点上)。
-
DataNode(数据节点):
- DataNode是集群中的工作节点,负责存储实际的数据块。
- 它们根据NameNode的指示存储、检索和删除数据块。
- DataNode负责定期向NameNode发送心跳消息以报告其健康状况,并汇报存储在本地的数据块信息。
-
Secondary NameNode(辅助名称节点):
- Secondary NameNode并不是NameNode的备用,而是负责定期合并编辑日志(edits log)和镜像文件(fsimage)以保持NameNode的元数据的大小较小。
- 它定期从NameNode获取最新的编辑日志和镜像文件,并将其合并,然后将新的fsimage文件发送回NameNode。
-
客户端:
- 客户端是与HDFS交互的应用程序或用户。它们通过HDFS的Java API、命令行工具(如hadoop fs命令)、或者其他支持HDFS的接口(如Hive、Spark等)来访问和操作文件系统。
总体而言,HDFS的架构是一个主从式的架构,其中NameNode作为中心管理元数据和客户端请求,而DataNode负责存储实际的数据块。这种架构提供了高可靠性和可扩展性,使得HDFS适用于大规模数据存储和处理。
2. HDFS的读写流程
HDFS的读写流程包括以下几个步骤:
-
写入流程:
- 当一个客户端想要向HDFS写入数据时,它首先会与NameNode通信,请求在文件系统中创建一个新文件。
- NameNode会检查文件是否已经存在,如果不存在则允许客户端写入数据,并且记录下新文件的元数据信息。
- 客户端收到消息后,开始将数据划分为固定大小的数据块,并且选择一个DataNode来存储每个数据块。通常,客户端会选择距离它最近的DataNode来写入数据。
- 客户端将数据块发送给选定的DataNode,并且DataNode负责将数据块写入本地磁盘。同时,DataNode也会将数据块的副本发送给其他DataNode,以提高数据的可靠性和容错性。
- 在所有数据块都成功写入后,客户端通知NameNode写入操作完成。NameNode更新文件的元数据,包括数据块的位置信息和副本数量。
-
读取流程:
- 当一个客户端想要从HDFS读取数据时,它首先会与NameNode通信,请求打开指定文件。
- NameNode会返回文件的元数据信息,包括文件的大小、数据块的位置等。
- 客户端根据元数据信息确定每个数据块的位置,并且与最近的DataNode建立连接。
- 客户端向DataNode发送读取请求,并且DataNode负责从本地磁盘读取数据块,并将数据块传输给客户端。
- 如果某个DataNode发生了故障或者数据传输失败,客户端可以尝试从其他副本所在的DataNode读取数据,从而实现容错和高可用性。
3.HDFS中,文件为什么以block块的方式存储?
从HDFS的优点来回答:
-
将文件分成固定大小的数据块可以使得数据在集群中分布均匀,并且能够实现并行处理。每个数据块都可以在集群中的不同节点上进行存储和处理,从而实现数据的高效读写和处理。
-
通过将文件分成多个数据块并在集群中复制多个副本,可以提高数据的容错性。如果某个节点发生故障或者数据损坏,系统可以从其他副本所在的节点上获取数据,从而保证数据的可靠性和可用性。
-
可以减少存储空间的碎片化,提高存储利用率。
4.描述一下HDFS 文件块大小,为什么块的大小不能设置太小,也不能设置太大?
HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。
(1)HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置;
(2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。
总结:HDFS块的大小设置主要取决于磁盘传输速率。