Hadoop——HDFS

什么是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。可以通过以下属性来修改副本数量:

XML 复制代码
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value> <!-- 设置为所需的副本数量 -->
    </property>
</configuration>

3. 调整副本数量的注意事项

  • 高可用性与性能:增加副本数量可以提高数据的可靠性,但也会增加存储需求和网络流量。对于经常访问的数据,建议保持较高的副本数量,而对于不常用的数据,可以减少副本数量。

  • 集群规模:在小规模集群中,设置较高的副本数量可能会导致存储资源的浪费。反之,在大规模集群中,可以根据数据的重要性和访问频率来调整。

  • 副本的分布:HDFS会智能地在不同的Datanode上存储副本,以确保负载均衡和容错性。因此,配置副本数量时,也要考虑集群的实际节点数和分布。

4. 动态调整副本数量

HDFS允许对已经存在的文件动态调整副本数量,可以使用以下命令:

复制代码

bash 复制代码
hdfs dfs -setrep -w <replication_factor> /path/to/file
  • -w 参数表示等待操作完成。
  • <replication_factor> 是目标副本数量。

假设我们希望将一个特定文件的副本数量设置为2,可以执行以下命令:

bash 复制代码
hdfs dfs -setrep -w 2 /user/hadoop/example.txt

fsck命令查看文件系统状态及验证文件的数据副本

fsck(File System Check)命令在HDFS中用于检查文件系统的状态以及验证文件的数据副本。这个命令可以帮助管理员发现和解决文件系统中的问题,确保数据的完整性和可用性。以下是关于fsck命令的详细信息:

1. 基本用法

fsck命令的基本语法如下:

bash 复制代码
hdfs fsck /path/to/directory_or_file

2. 功能和作用

  • 检查文件系统状态fsck命令可以检查HDFS中指定目录或文件的状态,包括是否存在、是否有损坏的块、是否有丢失的副本等。

  • 验证副本状态:命令会验证文件的每个块副本,检查它们在各个Datanode上的状态。这样可以确保数据的完整性和一致性。

3. 常用选项

  • -delete:此选项用于删除文件系统中丢失或损坏的数据块,适用于清理无效数据。

  • -files:显示文件的详细信息。

  • -blocks:显示块的详细信息,包括每个块的副本状态。

  • -locations:显示每个块的副本存储位置。

4. 示例

以下是使用fsck命令的一些示例:

  • 检查整个文件系统

    bash 复制代码
    hdfs fsck /
  • 检查特定文件

    bash 复制代码
    hdfs fsck /user/hadoop/example.txt
  • 显示块信息

    bash 复制代码
    hdfs fsck /user/hadoop/example.txt -blocks
  • 删除丢失的块

    bash 复制代码
    hdfs fsck / -delete

5. 输出结果

fsck命令的输出结果通常包含以下信息:

  • 文件路径:被检查的文件或目录路径。
  • 文件状态:包括是否存在、是否损坏等。
  • 块信息:每个数据块的状态、数量和副本位置。
  • 问题总结:如丢失块、重复块等问题的汇总信息。

NameNode元数据

在Hadoop的HDFS(Hadoop Distributed File System)中,NameNode是管理文件系统元数据的核心组件。它负责跟踪所有文件和目录的信息,包括文件的名称、权限、块信息、位置等。NameNode使用editsfsimage两个重要的概念来完成文件系统的管理和维护。下面详细解释它们的作用及其配合关系:

1. fsimage文件

  • 定义fsimage是一个持久化的文件,包含了HDFS文件系统的所有元数据的快照。它记录了当前文件系统的结构,包括文件和目录的层次结构、块的信息和它们在数据节点上的位置等。

  • 作用

    • 作为文件系统状态的完整备份,可以快速加载文件系统的基本信息。
    • 当NameNode启动时,会读取这个文件来恢复文件系统的状态。

2. edits文件

  • 定义edits文件是一个事务日志,记录了对文件系统元数据所做的所有更改操作,如创建文件、删除文件、修改文件权限等。每当对HDFS进行写操作时,这些变更会被追加到edits文件中。

  • 作用

    • 记录所有的操作,可以用于恢复文件系统的状态。
    • 提供了对文件系统变更的追踪,确保数据的一致性。

3. 配合关系

  • 工作流程

    • NameNode在启动时会首先加载fsimage文件,以获取当前的文件系统状态。
    • 在运行过程中,所有对文件系统的更改(如新文件的创建、文件的删除等)都会被记录到edits文件中。
    • 为了保持数据一致性,NameNode会定期将edits文件中的更改合并到fsimage中,生成一个新的fsimage文件,这个过程称为"合并"或"快照"。
  • 故障恢复

    • 如果NameNode发生故障或重启,可以通过先加载fsimage文件来恢复文件系统的状态,然后应用edits文件中的所有操作,以恢复到最新的状态。
    • 这种方式确保了即使在故障情况下,文件系统的完整性和一致性也能得到保障。

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通过fsimageedits文件的配合,实现了对整个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)

相关推荐
yumgpkpm9 分钟前
CMP (类ClouderaCDP7.3(404次编译) )华为鲲鹏Aarch64(ARM)信创环境 查询2100w行 hive 查询策略
数据库·数据仓库·hive·hadoop·flink·mapreduce·big data
Aevget13 小时前
「Java EE开发指南」用MyEclipse开发的EJB开发工具(二)
java·ide·java-ee·eclipse·myeclipse
yudiandian201420 小时前
03 Eclipse 配置 JDK 环境
java·ide·eclipse
K_i13421 小时前
Hadoop 集群自动化运维实战
运维·hadoop·自动化
Q26433650231 天前
【有源码】基于Python与Spark的火锅店数据可视化分析系统-基于机器学习的火锅店综合竞争力评估与可视化分析-基于用户画像聚类的火锅店市场细分与可视化研究
大数据·hadoop·python·机器学习·数据分析·spark·毕业设计
顧棟2 天前
【Yarn实战】Yarn 2.9.1滚动升级到3.4.1调研与实践验证
hadoop·yarn
一苓二肆2 天前
代码加密技术
linux·windows·python·spring·eclipse
D明明就是我2 天前
Hive 拉链表
数据仓库·hive·hadoop
嘉禾望岗5032 天前
hive join优化和数据倾斜处理
数据仓库·hive·hadoop
yumgpkpm2 天前
华为鲲鹏 Aarch64 环境下多 Oracle 数据库汇聚操作指南 CMP(类 Cloudera CDP 7.3)
大数据·hive·hadoop·elasticsearch·zookeeper·big data·cloudera