什么是HDFS
HDFS(Hadoop Distributed File System)是Apache Hadoop的核心组件之一,是一个分布式文件系统,专门设计用于在大规模集群上存储和管理海量数据。它的设计目标是提供高吞吐量的数据访问和容错能力,以支持大数据处理任务。下面是HDFS的主要特性和功能:
1. 架构
- 主从架构:
- NameNode:HDFS的主节点,负责管理文件系统的元数据,如文件和目录结构、文件块的位置等。NameNode不存储实际数据,只管理数据的元信息。
- DataNode:HDFS的从节点,负责实际存储数据块。每个文件在HDFS中被分割成多个数据块(默认大小为128MB或256MB),并分布存储在多个DataNode上。
2. 高容错性
- 数据复制:HDFS通过将每个数据块复制多个副本(默认3个副本)来确保数据的高可用性和容错性。如果某个DataNode故障,系统仍可以从其他副本中恢复数据。
- 自动故障恢复:当DataNode宕机时,NameNode会监控并自动重新复制丢失的数据块,以保证数据的冗余性。
3. 高吞吐量
- 优化读写:HDFS针对大文件的存储和访问进行了优化,适合顺序读写操作。它不适合频繁的随机读取,因为这种模式会降低性能。
- 流式访问:HDFS允许数据流式访问,用户可以在数据写入的同时进行读取,提高数据处理的效率。
4. 可扩展性
- 横向扩展:HDFS支持通过简单地添加新的DataNode来扩展存储容量。这种方式可以灵活应对不断增长的数据量。
5. 数据完整性
- 校验和:HDFS对存储的数据块进行校验和检测,以确保数据在存储和传输过程中的完整性。如果发现损坏,系统会自动从其他副本中恢复数据。
6. 接口
- API接口:HDFS提供了一组API,支持Java和其他语言的开发,方便用户对文件的读写操作。
总结
HDFS是一个为处理和存储海量数据而设计的分布式文件系统,具备高容错性、高吞吐量和可扩展性等优点。它通过将数据分割成多个块并在集群中分布存储,确保了数据的高可用性和高性能,成为大数据处理的基础设施之一。
HDFS的基础架构
1. NameNode主角色
- 功能:作为HDFS的主节点,负责管理文件系统的元数据,包括文件和目录的命名空间、文件的属性、文件块的位置等。
- 职责:
- 元数据管理:维护文件系统的结构,跟踪每个文件的块及其在DataNode上的位置。
- 客户端请求处理:处理来自客户端的文件操作请求(如创建、删除、重命名文件等),并相应地更新元数据。
- 故障监控:监控DataNode的健康状态,并在发现故障时采取措施(如重新复制丢失的块)。
2. Secondary NameNode辅助角色
- 功能:Secondary NameNode并不是NameNode的备份,而是一个辅助角色,主要用于定期合并NameNode的元数据文件,以减小NameNode的内存占用和元数据文件的大小。
- 职责:
- 合并元数据:定期从NameNode获取编辑日志,并将其与文件系统的镜像文件合并,从而减少NameNode的内存使用。
- 故障恢复:虽然Secondary NameNode不能替代NameNode,但在NameNode故障时,可以通过它的快照恢复部分元数据。
DataNode 从角色
- 功能:HDFS中的从节点,负责存储实际的数据块。
- 职责:
- 数据存储:接收并存储来自客户端或其他DataNode的数据块。
- 心跳信号:定期向NameNode发送心跳信号,以报告自身的健康状态和存储情况。
- 数据块复制:根据NameNode的指令,执行数据块的复制和删除操作,以确保数据的冗余性和高可用性。
HDFS 设计原理
HDFS副本块数量的配置
在HDFS(Hadoop Distributed File System)中,副本块数量的配置是一个重要的参数,它直接影响数据的可靠性和存储效率。副本块数量决定了每个数据块在集群中保存的副本数量,从而影响到容错能力和数据读取的性能。
1. 默认副本数量
- HDFS的默认副本块数量通常是3。这意味着每个数据块会在集群中的3个不同的Datanode上存储副本,以提高数据的可用性和容错性。
2. 配置副本块数量
副本块数量可以在HDFS的配置文件中进行设置,主要配置文件为hdfs-site.xml
。可以通过以下属性来修改副本数量:
<configuration><property><name>dfs.replication</name><value>3</value> <!-- 设置为所需的副本数量 --></property>
</configuration>
3. 调整副本数量的注意事项
-
高可用性与性能:增加副本数量可以提高数据的可靠性,但也会增加存储需求和网络流量。对于经常访问的数据,建议保持较高的副本数量,而对于不常用的数据,可以减少副本数量。
-
集群规模:在小规模集群中,设置较高的副本数量可能会导致存储资源的浪费。反之,在大规模集群中,可以根据数据的重要性和访问频率来调整。
-
副本的分布:HDFS会智能地在不同的Datanode上存储副本,以确保负载均衡和容错性。因此,配置副本数量时,也要考虑集群的实际节点数和分布。
4. 动态调整副本数量
HDFS允许对已经存在的文件动态调整副本数量,可以使用以下命令:
复制代码
hdfs dfs -setrep -w <replication_factor> /path/to/file
-w
参数表示等待操作完成。<replication_factor>
是目标副本数量。
假设我们希望将一个特定文件的副本数量设置为2,可以执行以下命令:
hdfs dfs -setrep -w 2 /user/hadoop/example.txt
fsck命令查看文件系统状态及验证文件的数据副本
fsck
(File System Check)命令在HDFS中用于检查文件系统的状态以及验证文件的数据副本。这个命令可以帮助管理员发现和解决文件系统中的问题,确保数据的完整性和可用性。以下是关于fsck
命令的详细信息:
1. 基本用法
fsck
命令的基本语法如下:
hdfs fsck /path/to/directory_or_file
2. 功能和作用
-
检查文件系统状态:
fsck
命令可以检查HDFS中指定目录或文件的状态,包括是否存在、是否有损坏的块、是否有丢失的副本等。 -
验证副本状态:命令会验证文件的每个块副本,检查它们在各个Datanode上的状态。这样可以确保数据的完整性和一致性。
3. 常用选项
-
-delete
:此选项用于删除文件系统中丢失或损坏的数据块,适用于清理无效数据。 -
-files
:显示文件的详细信息。 -
-blocks
:显示块的详细信息,包括每个块的副本状态。 -
-locations
:显示每个块的副本存储位置。
4. 示例
以下是使用fsck
命令的一些示例:
-
检查整个文件系统:
hdfs fsck /
-
检查特定文件:
hdfs fsck /user/hadoop/example.txt
-
显示块信息:
hdfs fsck /user/hadoop/example.txt -blocks
-
删除丢失的块:
hdfs fsck / -delete
5. 输出结果
fsck
命令的输出结果通常包含以下信息:
- 文件路径:被检查的文件或目录路径。
- 文件状态:包括是否存在、是否损坏等。
- 块信息:每个数据块的状态、数量和副本位置。
- 问题总结:如丢失块、重复块等问题的汇总信息。
NameNode元数据
在Hadoop的HDFS(Hadoop Distributed File System)中,NameNode是管理文件系统元数据的核心组件。它负责跟踪所有文件和目录的信息,包括文件的名称、权限、块信息、位置等。NameNode使用edits
和fsimage
两个重要的概念来完成文件系统的管理和维护。下面详细解释它们的作用及其配合关系:
1. fsimage文件
-
定义:
fsimage
是一个持久化的文件,包含了HDFS文件系统的所有元数据的快照。它记录了当前文件系统的结构,包括文件和目录的层次结构、块的信息和它们在数据节点上的位置等。 -
作用:
- 作为文件系统状态的完整备份,可以快速加载文件系统的基本信息。
- 当NameNode启动时,会读取这个文件来恢复文件系统的状态。
2. edits文件
-
定义:
edits
文件是一个事务日志,记录了对文件系统元数据所做的所有更改操作,如创建文件、删除文件、修改文件权限等。每当对HDFS进行写操作时,这些变更会被追加到edits
文件中。 -
作用:
- 记录所有的操作,可以用于恢复文件系统的状态。
- 提供了对文件系统变更的追踪,确保数据的一致性。
3. 配合关系
-
工作流程:
- NameNode在启动时会首先加载
fsimage
文件,以获取当前的文件系统状态。 - 在运行过程中,所有对文件系统的更改(如新文件的创建、文件的删除等)都会被记录到
edits
文件中。 - 为了保持数据一致性,NameNode会定期将
edits
文件中的更改合并到fsimage
中,生成一个新的fsimage
文件,这个过程称为“合并”或“快照”。
- NameNode在启动时会首先加载
-
故障恢复:
- 如果NameNode发生故障或重启,可以通过先加载
fsimage
文件来恢复文件系统的状态,然后应用edits
文件中的所有操作,以恢复到最新的状态。 - 这种方式确保了即使在故障情况下,文件系统的完整性和一致性也能得到保障。
- 如果NameNode发生故障或重启,可以通过先加载
4.元数据合并控制参数
SecondaryNameNode会通过http从NameNode拉取数据(edits和fsimage) 然后合并完成后提供给NameNode使用:
对于元数据的合并,是一个定时过程,基于:
dfs.namenode.checkpoint.period,默认3600(秒)即1小时
dfs.namenode.checkpoint.txns,默认1000000,即100W次事务
只要有一个达到条件就执行。 检查是否达到条件,默认60秒检查一次,基于: dfs.namenode.checkpoint.check.period,默认60(秒),来决定
5. 总结
NameNode通过fsimage
和edits
文件的配合,实现了对整个HDFS文件系统的有效管理和维护。fsimage
提供了文件系统的静态快照,而edits
则记录了动态变化。两者的结合确保了文件系统在高可用性和可靠性方面的表现,使得HDFS能够处理大规模数据的存储与管理。
一键启停脚本
# 一键启动hdfs集群
start-dfs.sh
# 一键关闭hdfs集群
stop-dfs.sh
$HADOOP_HOME/sbin/start-dfs.sh,一键启动HDFS集群
$HADOOP_HOME/sbin/stop-dfs.sh,一键关闭HDFS集群
单独控制进程的启停
1. $HADOOP_HOME/sbin/hadoop-daemon.sh,此脚本可以单独控制所在机器的进程的启停
用法:hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
2. $HADOOP_HOME/bin/hdfs,此程序也可以用以单独控制所在机器的进程的启停
用法:hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)