分布式存储快速入门HDFS

news2024/9/22 7:34:57

分布式存储快速入门

文章目录

  • 分布式存储快速入门
    • 一、概要介绍
      • 1.1 什么是分布式存储
      • 1.2 分布式存储的重要性和应用场景
    • 二、HDFS基础
      • 2.1 HDFS的起源和发展
      • 2.2 HDFS的架构
      • 2.3 HDFS的基本概念
      • 2.4 HDFS的特性
      • 2.5 HDFS的版权
    • 三、HDFS安装与配置
      • 3.1 环境准备
      • 3.2 安装Hadoop和配置HDFS
      • 3.3 常见配置参数解释
        • 3.3.1 hdfs-site.xml
        • 3.3.2 core-site.xml
    • 四、HDFS操作指南
      • 4.1 启动和停止HDFS
      • 4.2 HDFS基本命令
        • 4.2.1 文件上传和下载
        • 4.2.2 文件删除和目录管理
        • 4.2.3 HDFS权限管理
    • 五、高级功能Hadoop HA+Federation
      • 5.1 配置从节点
      • 5.2 建⽴存储数据的相应⽬录
      • 5.3 配置hadoop参数
      • 5.4 安装配置zookeeper
      • 5.5 启动集群
      • 5.6 运⾏情况查看
      • 5.7 总结
    • 六、HDFS存储策略
      • 6.1 环境准备
      • 6.2 配置⽂件
      • 6.3 上传数据到HDFS
        • 6.3.1 启动集群
        • 6.3.2 并在HDFS上创建⽂件⽬录
        • 6.3.3 并将⽂件资料上传
      • 6.4 Hot存储策略
      • 6.5 Warm存储策略
      • 6.6 Cold策略
      • 6.7 One_SSD策略
      • 6.8 MOVER-⼀个新的数据迁移⼯具
      • 6.9 All_SSD策略
    • 七、 HDFS监控与维护(Ambari)
      • 7.1 Ambari是什么
      • 7.2 Ambari架构
      • 7.3 操作⽅式
      • 7.4 Ambari集群搭建
    • 八、总结
    • 九、附录
      • 9.1 常见问题解答
      • 9.2 HDFS相关的术语表
      • 9.3 相关链接

一、概要介绍

1.1 什么是分布式存储

分布式存储是一种存储架构,它将数据分布在多个独立的存储设备或节点上,而这些设备或节点通过网络互联,协同工作来提供数据存储和访问服务。与传统的集中式存储系统不同,分布式存储系统不依赖于单一的存储设备或服务器,而是通过多个设备的协同工作来提高数据存储的可靠性、可扩展性和性能。

在分布式存储系统中,数据通常会被分割成多个部分(例如块或片段),并分别存储在不同的节点上。这种方式不仅可以提高存储系统的总体容量,还可以通过数据冗余和副本机制来增强系统的容错能力和数据可用性。

1.2 分布式存储的重要性和应用场景

分布式存储通过将数据分布在多个节点上,实现了高可用性、容错性和可扩展性,显著提升了存储系统的性能和可靠性,且成本效益高。它在大数据处理、云存储、内容分发网络(CDN)、企业级存储、数据备份与恢复以及边缘计算等场景中得到广泛应用,支持高效的大规模数据管理和处理。

本篇文章主要讲解分布式存储中的HDFS,重点在于hadoop HA+Federation以及Ambari,因为在实际的生产中,一般都不会仅仅只使用其基础功能,为了提高效率以及实现高可用,往往都会使用其高级功能。

重要性:

  1. 高可用性和容错性:分布式存储通过数据冗余和副本机制,可以在某些节点出现故障时仍然保持数据的可用性。这种机制极大地提高了系统的可靠性和容错能力。
  2. 可扩展性:分布式存储系统可以轻松扩展,通过增加更多的存储节点来扩展存储容量和处理能力,适应数据量不断增长的需求。
  3. 高性能:分布式存储利用多节点并行处理数据请求,能够提供高吞吐量和低延迟的数据访问性能,特别适合大规模数据处理和高并发访问场景。
  4. 成本效益:分布式存储可以使用廉价的通用硬件,降低了硬件成本。通过横向扩展,可以逐步增加存储容量,避免了大规模集中式存储系统初期建设的高昂成本。
  5. 数据本地性:分布式存储系统通常会将数据存放在靠近计算节点的位置,减少数据传输的延迟,提高数据处理效率。

应用场景:

  1. 大数据处理:如Hadoop和Spark等大数据处理框架,依赖于分布式存储系统(如HDFS)来存储和管理大规模数据集,支持大数据分析、数据挖掘和机器学习等任务。
  2. 云存储:云存储服务(如Amazon S3、Google Cloud Storage、Microsoft Azure Blob Storage)利用分布式存储技术,为用户提供大规模、高可用的存储解决方案,支持文件存储、对象存储和块存储等多种存储方式。
  3. 内容分发网络(CDN):CDN通过分布式存储技术,将内容缓存到多个地理位置的节点,提升内容分发的速度和可靠性,减少用户访问的延迟。
  4. 企业级存储:企业级分布式存储解决方案(如Ceph、GlusterFS)为企业提供可靠、高效的存储服务,支持各种应用场景,如数据库、虚拟化、容器化环境等。
  5. 数据备份和恢复:分布式存储系统可以实现高效的数据备份和恢复,通过数据复制和快照技术,保障数据的安全性和可恢复性。
  6. 边缘计算:在边缘计算环境中,分布式存储系统可以将数据存储和处理能力分布到靠近数据源的边缘节点,降低数据传输延迟,提升实时数据处理能力。

分布式存储技术在当今数据驱动的世界中,扮演着至关重要的角色,为各种规模和类型的应用提供可靠、可扩展、高性能的存储解决方案。

二、HDFS基础

2.1 HDFS的起源和发展

HDFS(Hadoop Distributed File System)是Apache Hadoop项目的一部分,起源于谷歌的GFS(Google File System)论文。Hadoop项目由Doug Cutting和Mike Cafarella于2006年创立,并在其核心包含了一个分布式文件系统,这个文件系统后来演变成HDFS。HDFS设计之初是为了处理大规模数据集,特别是在互联网上存储和处理数据的需求日益增加的背景下。其最初的灵感来自谷歌的GFS,而Yahoo!在早期对Hadoop的支持和开发起到了关键作用。2008年,Hadoop成为Apache软件基金会的顶级项目,HDFS也随之得到了广泛应用和认可。

HDFS主要使用Java编写。Java作为一种广泛使用的编程语言,其跨平台性和成熟的生态系统使得HDFS在不同的操作系统上均能高效运行。此外,HDFS的一些关键组件和工具也使用了C和C++编写,以提高性能。

HDFS的设计目标是为大数据处理和存储提供一个可靠、高效、可扩展的解决方案。其定位于以下几个场景:

  • 大规模数据集的存储与处理:HDFS适用于需要处理TB级甚至PB级数据集的应用,如数据分析、机器学习、数据仓库等。
  • 高吞吐量数据访问:HDFS为大数据应用提供高吞吐量的数据访问能力,适合批处理作业。
  • 高可用性和容错性:通过数据复制机制和故障检测恢复机制,HDFS确保数据的高可用性和可靠性。

2.2 HDFS的架构

HDFS(Hadoop Distributed File System)的架构设计旨在实现高可靠性、高性能和高可扩展性。HDFS采用主从架构,主要由以下三个核心组件构成:NameNode、DataNode和Secondary NameNode。

在这里插入图片描述

NameNode是HDFS的核心管理节点,负责整个文件系统的元数据管理。它的主要职责包括:

  1. 元数据管理:NameNode存储HDFS文件系统的元数据,包括文件和目录的结构、权限、块映射(即文件被分割成的块及其所在的DataNode)、副本信息等。这些元数据通常存储在NameNode的内存中,以确保高效的访问速度。
  2. 客户端请求处理:当客户端发起文件操作请求(如读、写、删除等)时,NameNode会解析请求并提供相应的元数据信息。例如,在读取文件时,NameNode会返回文件块所在的DataNode列表;在写入文件时,NameNode会指定新的块存储位置。
  3. 数据块管理:NameNode负责管理HDFS中的数据块,确保每个块的副本数量满足配置要求。如果检测到某个块的副本丢失或不足,NameNode会触发副本的重新复制操作。
  4. 故障检测和恢复:NameNode持续监控DataNode的状态。如果检测到某个DataNode故障,NameNode会将该节点标记为失效,并在其他健康节点上重新复制其数据块,确保数据的可靠性。

DataNode是HDFS的工作节点,负责实际的数据存储和管理。每个DataNode在本地存储HDFS的数据块,并定期向NameNode汇报其状态和所存储的块信息。DataNode的主要职责包括:

  1. 数据存储:DataNode将接收到的文件块存储在本地文件系统中,并按照NameNode的指示执行数据读写操作。
  2. 块汇报:DataNode定期向NameNode发送心跳信息和块报告,包含当前存储的块列表和状态信息。NameNode通过这些信息监控DataNode的健康状态和数据块分布情况。
  3. 数据传输:在文件写入过程中,DataNode会根据NameNode的指示与其他DataNode协同工作,执行数据块的复制操作,确保数据的副本分布在不同的节点上。
  4. 数据校验和恢复:DataNode定期对存储的数据块进行校验,检测是否存在数据损坏,并在必要时从其他DataNode获取正确的数据副本进行恢复。

Secondary NameNode并不是NameNode的备份节点,而是一个辅助节点,主要用于帮助NameNode管理元数据日志(Edit Log)的合并工作,防止Edit Log过度膨胀。Secondary NameNode的主要职责包括:

  1. Checkpoint合并:Secondary NameNode定期从NameNode获取当前的元数据快照(FsImage)和Edit Log,执行合并操作,生成新的FsImage。这有助于减少NameNode启动时需要重放的日志条目数量,提高系统的恢复速度。
  2. 数据备份:合并生成的新FsImage会被传回NameNode,替换旧的FsImage。同时,Secondary NameNode会保留一个副本,以便在NameNode发生故障时作为参考使用。
  3. 降低NameNode负担:通过定期合并元数据日志,Secondary NameNode减轻了NameNode的工作负担,确保其能够专注于实时处理客户端请求和数据块管理。

HDFS的架构通过NameNode、DataNode和Secondary NameNode的协同工作,实现了分布式存储系统的高可用性、可靠性和可扩展性。NameNode负责元数据管理和客户端请求处理,DataNode负责实际的数据存储和管理,Secondary NameNode则辅助NameNode进行元数据日志的合并和管理。三者相互配合,构成了一个高效的分布式文件系统。

2.3 HDFS的基本概念

HDFS(Hadoop Distributed File System)的基本概念包括块(Block)、副本(Replication)和机架感知(Rack Awareness)。在HDFS中,文件被分割成固定大小的块(默认128MB)并分布存储在不同的DataNode上,以提高存储管理的效率和系统的并行处理能力。为了保障数据的可靠性,每个块被复制成多个副本(默认3个),分布在不同的节点和机架上,防止单点故障或机架故障导致数据丢失。机架感知策略通过了解节点所在的机架位置,优化数据副本的分布和网络传输效率,进一步增强了系统的容错能力和性能。通过以下基本概念的设计,HDFS能够实现高效、可靠、可扩展的数据存储和管理,满足大规模数据处理的需求。

在HDFS中,文件被分割成若干个固定大小的数据块进行存储。块是HDFS存储的基本单位,有以下特性和优点:

  1. 固定大小:默认情况下,每个块的大小为128MB,但可以根据需求进行配置。固定大小的块便于管理和分配存储空间。
  2. 分布式存储:文件块分布在不同的DataNode上,这种分布式存储方式提高了系统的并行处理能力和数据访问效率。
  3. 独立管理:每个数据块独立管理,这意味着即使单个块或DataNode发生故障,其他块仍然可以正常工作,从而增强了系统的容错能力。
  4. 简化存储管理:大文件被分成多个块存储在不同节点上,便于扩展和管理,同时也减少了文件系统管理的复杂性。

为了保证数据的可靠性和高可用性,HDFS对每个数据块进行复制,存储多个副本。副本机制的主要特点包括:

  1. 默认副本数:HDFS默认每个块有3个副本,可以根据需求进行配置。副本数的增加可以提高数据的可靠性,但也会占用更多的存储空间。
  2. 副本存放策略:副本通常分布在不同的DataNode和机架(Rack)上,以防止单点故障或单机架故障造成的数据丢失。例如,默认情况下,第一个副本存储在写入的DataNode上,第二个副本存储在同一机架的不同DataNode上,第三个副本存储在不同机架的DataNode上。
  3. 副本管理:NameNode负责管理数据块的副本信息,并监控副本的状态。如果某个副本丢失或损坏,NameNode会触发重新复制,确保副本数达到预定要求。
  4. 读写操作优化:副本分布在多个节点上,客户端在读取数据时可以选择最近的副本,从而优化数据访问的性能;在写入数据时,可以同时写入多个副本,提高写入效率。

Rack Awareness是HDFS中一种用于提高数据可靠性和网络效率的策略,它考虑了数据节点的机架位置,具体来说:

  1. 机架拓扑感知:HDFS可以感知集群中各个DataNode所在的机架,通过配置拓扑脚本(topology script),管理员可以定义机架结构,使NameNode了解每个DataNode所在的机架。
  2. 数据分布策略:利用机架感知信息,HDFS在存储数据块副本时会将它们分布在不同的机架上。通常情况下,一个副本存储在本地节点,一个副本存储在同一机架的不同节点,另一个副本存储在不同机架的节点上。这种策略可以减少单机架故障带来的风险,提高数据的可靠性。
  3. 网络效率:通过机架感知,HDFS可以优化网络带宽的使用。在同一机架内传输数据通常比跨机架传输更快且成本更低。因此,尽可能在同一机架内存储副本,可以减少网络传输延迟和带宽消耗,提高数据访问性能。
  4. 故障恢复:在某个节点或机架发生故障时,HDFS可以通过机架感知信息快速定位其他机架上的副本,从而实现快速的故障恢复和数据重建。

2.4 HDFS的特性

  • 分布式架构:数据分布在多个节点上,具有良好的可扩展性和高可用性。
  • 大文件存储:支持存储和管理超大规模的数据文件,文件被分成块并分布在多个节点上。
  • 数据复制:默认情况下,每个数据块会被复制到不同的节点上(通常是3个),提高数据的可靠性和可用性。
  • 容错性:自动检测和恢复数据块的丢失或损坏,确保系统的稳定性和数据的完整性。
  • 高吞吐量:为大数据应用提供高效的数据访问和处理能力,适合批处理场景。
  • 与Hadoop生态系统的集成:HDFS与Hadoop生态系统中的其他组件(如MapReduce、YARN、Hive、Pig等)无缝集成,形成完整的大数据处理平台。
  • 数据本地性:计算任务尽量安排在数据所在节点上,减少数据传输,提高处理效率。

2.5 HDFS的版权

HDFS是Apache Hadoop项目的一部分,遵循Apache License 2.0。这是一种开源许可证,允许用户自由使用、修改和分发代码,同时要求保留原始版权声明和许可证声明。以下是Apache License 2.0的一些关键点:

  • 自由使用:用户可以自由地使用、修改和分发代码。
  • 保留声明:分发修改后的代码时,必须保留原始的版权声明、许可证声明和免责声明。
  • 贡献回报:鼓励用户将修改和改进贡献回开源社区。
  • 无担保:代码按“原样”提供,不对其适用性或性能提供任何担保。

Apache License 2.0的这些特点促进了HDFS的广泛应用和社区贡献,推动了其不断发展和完善。

三、HDFS安装与配置

3.1 环境准备

  1. 安装好虚拟机,准备三台虚拟机(Centos),网络选择NAT模式
master 192.168.10.11
slave1 192.168.10.12
slave2 192.168.10.13
  1. 设置主机名
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2

用命令hostname 查看

  1. 设置网络IP
vi /etc/sysconfig/network-scripts/ifcfg-ens33

分别设置为:192.168.10.11、192.168.10.12、192.168.10.13

  1. 添加主机名和IP映射关系
    每台机器都添加
vi /etc/hosts

用来简化网络访问,提高网络通信的效率,同时增强网络的稳定性

192.168.10.11 master
192.168.10.12 slave1
192.168.10.13 slave2
  1. 关闭防火墙

每台机器设置

  • 查看:systemctl status firewalld.service
  • 关闭:sudo systemctl stop firewalld.service
  • 启动:sudo systemctl start firewalld.service

3.2 安装Hadoop和配置HDFS

  • 安装Java
    jdk1.8版本。下载对应的Linux 发行包 jdk-8u291-linux-x64.tar.gz
  • hadoop-3.1.4
    下载对应的tar包 hadoop-3.1.4.tar.gz
  1. 设置免密登录

生成 SSH 密钥:在每个节点(master, slave1 和 slave2)上的 hadoop 用户生成 SSH 密钥对。
复制 SSH 密钥:将每个节点的 SSH 公钥复制到各个节点的 authorized_keys 文件中,以实现节点之间的无密码 SSH 登录。

这个设置对 Hadoop 集群非常重要,因为它允许 master 和 slave 节点之间无缝通信,从而实现分布式数据处理。

su - hadoop
ssh-keygen
su - hadoop
ssh-keygen
su - hadoop
ssh-keygen
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
  1. Hadoop配置

先在matser配置

# 进入 Hadoop 配置目录
cd /home/hadoop/hadoop-3.1.4/etc/hadoop/
# 创建用于存储临时文件的目录
mkdir /home/hadoop/hadoop-3.1.4/hdfs/tmp -p
# 创建用于存储 NameNode 数据的目录
mkdir /home/hadoop/hadoop-3.1.4/hdfs/name -p
# 创建用于存储 DataNode 数据的目录
mkdir /home/hadoop/hadoop-3.1.4/hdfs/data -p
# 使用 vi 编辑 hadoop-env.sh 文件
vi hadoop-env.sh
# 设置 Java 安装路径
export JAVA_HOME=/usr/local/jdk
# 设置 Hadoop 运行时的 Java 库路径
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/native"

修改core-site.xml文件

<configuration>
    <!-- 设置默认文件系统为 HDFS,NameNode 位于 master 节点的 9000 端口 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
    <!-- 设置 Hadoop 的临时文件存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/hadoop-3.1.4/hdfs/tmp</value>
    </property>
</configuration>

修改hdfs-site.xml文件

<configuration>
    <!-- 设置 NameNode 的数据目录 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop/hadoop-3.1.4/hdfs/name</value>
    </property>
    <!-- 设置 DataNode 的数据目录 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/hadoop-3.1.4/hdfs/data</value>
    </property>
    <!-- 设置 HDFS 数据块的副本数 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!-- 设置 Secondary NameNode 的 HTTP 地址 -->
    <property>
        <name>dfs.secondary.http.address</name>
        <value>master:50090</value>
    </property>
</configuration>

修改yarn-site.xml文件

<configuration>
    <!-- 设置 ResourceManager 主机名 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
    </property>
    <!-- 设置 NodeManager 的辅助服务 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

在主节点master中配置环境操作步骤一样,并在salve中配置

vi workers
slave1
slave2
  1. 拷贝Hadoop文件和/etc/profile和JDK文件

复制 Hadoop 目录:将 hadoop-3.1.4 目录从 master 复制到 slave1 和 slave2。
复制配置文件:将 /etc/profile 文件从 master 复制到 slave1 和 slave2。
复制 JDK 目录:将 jdk 目录从 master 复制到 slave1 和 slave2。
重新加载配置文件:在 slave1 和 slave2 上重新加载 /etc/profile 文件,以应用新的环境配置。
这些步骤确保了所有 Hadoop 集群节点之间的配置和环境一致性。

scp -rq /home/hadoop/hadoop-3.1.4 slave1:/home/hadoop/
scp -rq /home/hadoop/hadoop-3.1.4 slave2:/home/hadoop/
su
scp /etc/profile slave1:/etc/
scp /etc/profile slave2:/etc/
scp -rq /usr/local/jdk/ slave1:/usr/local/
scp -rq /usr/local/jdk/ slave2:/usr/local/
source /etc/profile
source /etc/profile

scp 之后记得改一下slave的权限:

每个机器都要改:

chown hadoop:hadoop -R /home/hadoop/
chmod 755 -R /usr/local/jdk
  1. 格式化及启动Hadoop

切换用户:从 root 用户切换到 hadoop 用户。
进入 sbin 目录:切换到 Hadoop 安装目录下的 sbin 子目录。
格式化 NameNode:格式化 HDFS 的 NameNode,这是初始化 Hadoop 集群的关键步骤。

su - hadoop
cd /home/hadoop/hadoop-3.1.4/sbin/
hdfs namenode -format

启动全部进程,并查看进程。现在master中使用jps查看所有进程,在slave 1和 slave 2中的进程也和master一致。

61376 Jps
48002 SecondaryNameNode
48227 ResourceManager
47690 NameNode
  1. 测试,查看集群,活动节点是否有两个。

3.3 常见配置参数解释

3.3.1 hdfs-site.xml

(1) dfs.name.dir

NameNode 元数据存放位置

默认值:使用core-site.xml中的hadoop.tmp.dir/dfs/name

(2) dfs.block.size

对于新文件切分的大小,单位byte。默认是64M,建议是128M。每一个节点都要指定,包括客户端。

默认值:67108864

(3) dfs.data.dir

DataNode在本地磁盘存放block的位置,可以是以逗号分隔的目录列表,DataNode循环向磁盘中写入数据,每个DataNode可单独指定与其它DataNode不一样

默认值:${hadoop.tmp.dir}/dfs/data

(4) dfs.namenode.handler.count

NameNode用来处理来自DataNode的RPC请求的线程数量

建议设置为DataNode数量的10%,一般在10~200个之间

如设置太小,DataNode在传输数据的时候日志中会报告“connecton refused"信息

在NameNode上设定

默认值:10

(5) dfs.datanode.handler.count

DataNode用来连接NameNode的RPC请求的线程数量

取决于系统的繁忙程度

设置太小会导致性能下降甚至报错

在DataNode上设定

默认值:3

(6) dfs.datanode.max.xcievers

DataNode可以同时处理的数据传输连接数

默认值:256

建议值:4096

(7) dfs.permissions

如果是true则检查权限,否则不检查(每一个人都可以存取文件)

于NameNode上设定

默认值:true

(8)dfs.datanode.du.reserved

在每个卷上面HDFS不能使用的空间大小

在每个DataNode上面设定

默认值:0

建议为10737418240,即10G。需要结合MapReduce场景设置。

(9) dfs.datanode.failed.volumes.tolerated

DataNode可以容忍损块的磁盘数量,超过这个数量DataNode将会离线,所有在这个节点上面的block将会被重新复制

默认是0,但是在有多块磁盘的时候一般会增大这个值

(10) dfs.replication

在文件被写入的时候,每一块将要被复制多少份

默认是3份。建议3份

在客户端上设定

通常也需要在DataNode上设定

3.3.2 core-site.xml

(1) fs.default.name

文件系统的名字。通常是NameNode的hostname与port

需要在每一个需要访问集群的机器上指定,包括集群中的节点

例如:hdfs://<your_namenode>:9000/

(2) fs.checkpoint.dir

以逗号分隔的文件夹列表,SecondNameNode用来存储checkpoint image文件

如果多于一个文件夹,那么都会被写入数据

需要在SecondNameNode上设定

默认值:${hadoop.tmp.dir}/dfs/namesecondary

(3) hadoop.tmp.dir

HDFS与本地磁盘的临时文件

默认是/tmp/hadoop-${user.name}.需要在所有的节点中设定

(4) fs.trash.interval

当一个文件被删掉后,它会被放到用户目录的.Trash目录下,而不是立即删掉

经过此参数设置的分钟数之后,再删掉数据

默认是0,禁用此功能,建议1440(一天)

(5) io.file.buffer.size

设定在读写数据时的缓存大小,应该为硬件分页大小的2倍

默认是4096,建议为65536 ( 64K)

四、HDFS操作指南

4.1 启动和停止HDFS

HDFS 和普通的硬盘上的文件系统不一样,是通过Java 虚拟机运行在整个集群当中的,所以当Hadoop 程序写好之后,需要启动HDFS 文件系统,才能运行。

HDFS 启动过程如下:
(1) 进入到NameNode 对应节点的Hadoop 安装目录下。
(2) 执行启动脚本:

bin/start-dfs.sh 

这一脚本会启动NameNode,然后根据conf/slaves 中的记录逐个启动DataNode,最后根据conf/masters 中记录的Secondary NameNode 地址启动SecondaryNameNode。

HDFS 关闭过程如下:
运行以下关闭脚本:

bin/stop-dfs.sh 

这一脚本的运行过程正好是bin/start-dfs.sh 的逆过程,关闭Secondary NameNode,然后是每个DataNode,最后是NameNode 自身。

在这里插入图片描述

4.2 HDFS基本命令

4.2.1 文件上传和下载

(1) 上传文件到HDFS:

$ hdfs dfs -put <本地文件路径> <HDFS目标路径>

例如:hdfs dfs -put /home/user/localfile.txt /user/hadoop/hdfsfile.txt

(2) 从HDFS下载文件:

$ hdfs dfs -get <HDFS文件路径> <本地目标路径>

例如:hdfs dfs -get /user/hadoop/hdfsfile.txt /home/user/localfile.txt

4.2.2 文件删除和目录管理

(1) 删除HDFS中的文件或目录/或者删除目录及其内容:

$ hdfs dfs -rm <HDFS文件路径>
$ hdfs dfs -rm -r <HDFS目录路径>

例如:hdfs dfs -rm /user/hadoop/hdfsfile.txt
hdfs dfs -rm -r /user/hadoop/hdfsdir

(2) 创建HDFS目录:

$ hdfs dfs -mkdir <HDFS目录路径>

例如:hdfs dfs -mkdir /user/hadoop/newdir

(3) 查看HDFS目录中的文件和子目录:

$ hdfs dfs -ls <HDFS目录路径>

例如:hdfs dfs -ls /user/hadoop

4.2.3 HDFS权限管理

(1) 查看文件或目录的权限:

$ hdfs dfs -ls <HDFS文件或目录路径>

例如:hdfs dfs -ls /user/hadoop/hdfsfile.txt

(2) 修改文件或目录的权限:

$ hdfs dfs -chmod <权限> <HDFS文件或目录路径>

例如:将权限更改为 rwxr-xr-x:

hdfs dfs -chmod 755 /user/hadoop/hdfsfile.txt

(3) 修改文件或目录的所有者:

$ hdfs dfs -chown <用户>:<> <HDFS文件或目录路径>

例如:将所有者更改为 hadoop 用户和 hadoop 组:

hdfs dfs -chown hadoop:hadoop /user/hadoop/hdfsfile.txt

(4) 修改文件或目录的组:

$ hdfs dfs -chgrp <> <HDFS文件或目录路径>

例如:将组更改为 hadoop:

hdfs dfs -chgrp hadoop /user/hadoop/hdfsfile.txt

五、高级功能Hadoop HA+Federation

Hadoop HA(High Availability)即Hadoop高可用,是一种通过配置冗余组件和自动故障转移机制,以确保Hadoop集群在部分组件出现故障时仍能保持服务的连续性和可用性的技术。Hadoop HA主要关注HDFS(Hadoop Distributed File System)的HA和YARN(Yet Another Resource Negotiator)的HA,旨在解决NameNode和ResourceManager的单点故障问题。

在Hadoop 2.0之前,HDFS集群中的NameNode存在单点故障问题。NameNode的故障可能导致集群无法使用,直到管理员重启NameNode。HDFS HA通过配置Active/Standby两个NameNodes来实现在集群中对NameNode的热备,从而解决单点故障问题。YARN HA主要关注ResourceManager的HA,其实现方式与HDFS HA类似,也是通过配置Active/Standby两个ResourceManager来实现在集群中对ResourceManager的热备。

HA联邦模式解决了单纯HA模式的性能瓶颈(主要指namenode、ResourceManager),将整个HA集群划分为两个以上的集群,不同的集群之间通过Federation进⾏连接,使得HA集群拥有了横向扩展的能⼒。理论上,在该模式下,能够通过增加计算节点以处理⽆限增⻓的数据。联邦模式下的配置在原HA模式的基础上做了部分调整。

在这里插入图片描述

中心组件

  1. NameNode HA:
  • Active NameNode: 处理所有的客户端请求。
  • Standby NameNode: 镜像Active NameNode的状态,以便在Active NameNode失败时快速接管。
  • JournalNodes: 集群中的一组节点,用于存储NameNode的编辑日志(Edit Logs),确保两个NameNode之间的数据一致性。
  • ZKFC (ZooKeeper Failover Controller): 使用ZooKeeper来监控NameNode的健康状态,并在需要时触发failover过程。
  1. ResourceManager HA:
  • Active ResourceManager: 管理集群中的资源分配和任务调度。
  • Standby ResourceManager: 在Active ResourceManager失败时接管其职责。
  • ZooKeeper: 用于协调ResourceManager之间的状态,确保HA的实现。

Federation 组件

  1. 多个namespace:
  • 在Federation架构中,Hadoop集群可以支持多个命名空间(Namespaces),每个命名空间都由一对NameNode管理(一个Active,一个Standby)。
  • 每个命名空间都代表了一个逻辑上的Hadoop集群,拥有自己的HDFS实例和MapReduce作业队列。
  1. Block Storage:
  • DataNodes存储实际的HDFS数据块(Blocks),这些数据块可以由多个Namespace共享。
  • DataNodes不直接知道哪个Namespace拥有这些数据块,它们只负责存储和检索数据块。

客户端交互

  • 客户端:客户端可以与任何Active NameNode交互来访问HDFS,也可以与ResourceManager交互来提交作业。
  • 负载均衡器(可选):用于在多个ResourceManager或NameNode之间分发客户端请求,提高系统的可用性和性能。

这只是一个简化的描述,实际的Hadoop HA + Federation架构可能会更加复杂,具体取决于集群的配置和需求。在实际部署时,可能需要考虑更多的细节,如网络配置、安全设置、性能优化等。

5.1 配置从节点

在 slaves ⽂件中配置的主机即为从节点,将⾃动运⾏datanode, nodemanager服务。在 h01 操作,后⾯通过 scp 同步到其他主机,也可以在不同集群⾥配置不同的从节点。

vim /home/federation/hadoop-2.7.3/etc/hadoop/slaves
hadoop3.com
hadoop4.com

5.2 建⽴存储数据的相应⽬录

在 h01 操作,后⾯通过 scp 同步到其他主机。

#可选操作,数据也可以放在⼀个⽬录下
mkdir -p /home/federation/hadoop-2.7.3/data/hdfs/tmp
mkdir -p /home/federation/hadoop-2.7.3data/journal/data
mkdir -p /home/federation/hadoop-2.7.3/data/pid
mkdir -p /home/federation/hadoop-2.7.3/data/namenode1
mkdir -p /home/federation/hadoop-2.7.3/data/namenode2
mkdir -p /home/federation/hadoop-2.7.3/data/datanode1
mkdir -p /home/federation/hadoop-2.7.3/data/datanode2
mkdir -p /home/federation/hadoop-2.7.3/data/local-dirs
mkdir -p /home/federation/hadoop-2.7.3/data/log-dirs

5.3 配置hadoop参数

在 h01 操作,后⾯通过 scp 同步到其他主机。

vim /home/federation/hadoop-2.7.3/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="utf-8"?>  
<configuration xmlns:xi="http://www.w3.org/2001/XInclude">  
    <xi:include href="/home/federation/hadoop-2.7.3/etc/hadoop/cmt.xml" />  
    <!-- 此处引入federation的额外配置文件 -->  
    <property>  
        <!-- 指定hdfs的nameservice名称,在cmt.xml文件中会引用。注意此处的修改 -->  
        <name>fs.defaultFS</name>  
        <value>viewfs://nsX</value>  
    </property>  
    <!-- 指定hadoop数据存储目录 -->  
    <property>  
        <name>hadoop.tmp.dir</name>  
        <value>/home/federation/hadoop-2.7.3/data/hdfs</value>  
    </property>  
    <property>  
        <!-- 注意此处将该配置项从hdfs-site.xml文件中迁移过来了 -->  
        <name>dfs.journalnode.edits.dir</name>  
        <value>/home/federation/hadoop-2.7.3/data/hdfs/journal/data</value>  
    </property>  
    <!-- 指定zookeeper地址 -->  
    <property>  
        <name>ha.zookeeper.quorum</name>  
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>  
    </property>  
</configuration>
vim /home/federation/hadoop-2.7.3/etc/hadoop/cmt.xml 
<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
    <property>  
        <!-- 将 hdfs 的 /view_ns1 目录挂载到 ns1 的NN下管理,整个federation的不同HA  
        集群也是可以读写此目录的,但是在指定路径时需要指定完全路径 -->  
        <name>fs.viewfs.mounttable.nsX.link./view_ns1</name>  
        <value>hdfs://ns1</value>  
    </property>  
    <property>  
        <name>fs.viewfs.mounttable.nsX.link./view_ns2</name>  
        <value>hdfs://ns2</value>  
    </property>  
    <property>  
        <!-- 指定 /tmp 目录,许多依赖hdfs的组件可能会用到此目录 -->  
        <name>fs.viewfs.mounttable.nsX.link./tmp</name>  
        <value>hdfs://ns1/tmp</value>  
    </property>  
</configuration>
vim /home/federation/hadoop-2.7.3/etc/hadoop/hdfs-site.xml 
<?xml version="1.0" encoding="utf-8"?>  
<!-- HDFS-HA 配置 -->  
<configuration>  
    <property>  
        <!-- 因为集群规划中只配置了2个datanode节点,所以此处只能设置小于2,因为hadoop默认不允许将不同的副本存放到相同的节点上 -->  
        <name>dfs.replication</name>  
        <value>2</value>  
    </property>  
  
    <property>  
        <!-- 白名单:仅允许以下datanode连接到NN,一行一个,也可以指定一个文件 -->  
        <name>dfs.hosts</name>  
        <value>  
            <!-- ~/VMBigData/hadoop/default/etc/hadoop/hosts.allow -->  
            h01.vm.com  
            h02.vm.com  
            h03.vm.com  
            h04.vm.com  
        </value>  
    </property>  
  
    <property>  
        <!-- 黑名单:不允许以下datanode连接到NN,一行一个,也可以指定一个文件 -->  
        <name>dfs.hosts.exclude</name>  
        <value></value>  
    </property>  
  
    <property>  
        <!-- 集群的命名空间、逻辑名称,可配置多个,但是与cmt.xml配置对应 -->  
        <name>dfs.nameservices</name>  
        <value>ns1,ns2</value>  
    </property>  
  
    <property>  
        <!-- 命名空间中所有NameNode的唯一标示。该标识指示集群中有哪些NameNode。目前单个集群最多只能配置两个NameNode -->  
        <name>dfs.ha.namenodes.ns1</name>  
        <value>nn1,nn2</value>  
    </property>  
  
    <property>  
        <name>dfs.ha.namenodes.ns2</name>  
        <value>nn3,nn4</value>  
    </property>  
  
    <property>  
        <name>dfs.namenode.rpc-address.ns1.nn1</name>  
        <value>hadoop1:9000</value>  
    </property>  
  
    <property>  
        <name>dfs.namenode.http-address.ns1.nn1</name>  
        <value>hadoop1:50070</value>  
    </property>  
  
    <property>  
        <name>dfs.namenode.rpc-address.ns1.nn2</name>  
        <value>hadoop2:9000</value>  
    </property>  
  
    <property>  
        <name>dfs.namenode.http-address.ns1.nn2</name>  
        <value>hadoop2:50070</value>  
    </property>  
  
    <property>  
        <name>dfs.namenode.rpc-address.ns2.nn3</name>  
        <value>hadoop3:9000</value>  
    </property>  
  
    <property>  
        <name>dfs.namenode.http-address.ns2.nn3</name>  
        <value>hadoop3:50070</value>  
    </property>  
  
    <property>  
        <name>dfs.namenode.rpc-address.ns2.nn4</name>  
        <value>hadoop4:9000</value>  
    </property>  
  
    <property>  
        <name>dfs.namenode.http-address.ns2.nn4</name>  
        <value>hadoop4:50070</value>  
    </property>  
  
    <property>  
        <!-- JournalNode URLs,ActiveNameNode 会将 Edit Log 写入这些 JournalNode 所配置的本地目录即 dfs.journalnode.edits.dir -->  
        <name>dfs.namenode.shared.edits.dir</name>  
        <!-- 注意此处的ns1,当配置文件所在节点处于ns1集群时,此处为ns1,当处于ns2集群时,此处为ns2 -->  
        <value>qjournal://hadoop2:8485;hadoop3:8485;hadoop4/ns1</value>  
    </property>  
  
    <property>  
        <!-- JournalNode 用于存放 editlog 和其他状态信息的目录 -->  
        <name>dfs.journalnode.edits.dir</name>  
        <value>/home/federation/hadoop-2.7.3/data/hdfs/journal/data</value>  
    </property>  
  
    <property>  
        <name>dfs.ha.automatic-failover.enabled</name>  
        <value>true</value>  
    </property>  
  
    <property>  
        <name>dfs.client.failover.proxy.provider.ns1</name>  
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
    </property>  
  
    <property>  
        <name>dfs.client.failover.proxy.provider.ns2</name>  
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
    </property>  
  
    <property>  
        <!-- 一种关于 NameNode 的隔离机制(fencing) -->  
        <name>dfs.ha.fencing.methods</name>  
        <value>  
            sshfence  
            shell(/bin/true)  
        </value>  
    </property>  
  
    <property>  
        <name>dfs.ha.fencing.ssh.private-key-files</name>  
        <value>/home/vagrant/.ssh/id_rsa</value>  
    </property>  
  
    <property>  
        <name>dfs.ha.fencing.ssh.connect-timeout</name>  
        <value>30000</value>  
    </property>  
  
    <property>  
        <name>dfs.namenode.name.dir</name>  
        <!-- 创建的namenode文件夹位置,如有多个用逗号隔开。配置多个的话,每一个目录下数据都是相同的,达到数据冗余备份的目的 -->  
        <value>file:///home/federation/hadoop-2.7.3/data/hdfs/namenode</value>  
    </property>  
  
    <property>  
        <name>dfs.datanode.data.dir</name>  
        <!-- 创建的datanode文件夹位置,多个用逗号隔开,实际不存在的目录会被忽略 -->  
        <value>file:///home/federation/hadoop-2.7.3/data/hdfs/datanode</value>  
    </property>  
</configuration>
vim /home/federation/hadoop-2.7.3/etc/hadoop/yarn-site.xml
<?xml version="1.0" encoding="utf-8"?>  
<!-- YARN-HA 配置 -->  
<configuration>  
    <!-- YARN HA 配置开始,与NN HA很相似 -->  
    <property>  
        <name>yarn.resourcemanager.zk-address</name>  
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>  
    </property>  
    <property>  
        <!-- 启用RM的高可用模式 -->  
        <name>yarn.resourcemanager.ha.enabled</name>  
        <value>true</value>  
    </property>  
    <property>  
        <!-- 配置HA节点的逻辑名称 -->  
        <name>yarn.resourcemanager.ha.rm-ids</name>  
        <value>rm1,rm2</value>  
    </property>  
    <property>  
        <name>yarn.resourcemanager.hostname.rm1</name>  
        <value>hadoop1</value>  
    </property>  
    <property>  
        <name>yarn.resourcemanager.hostname.rm2</name>  
        <value>hadoop2</value>  
    </property>  
    <!-- ... (省略了部分重复的ResourceManager配置,以保持示例简洁) -->  
  
    <property>  
        <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>  
        <value>true</value>  
    </property>  
  
    <property>  
        <!-- 配置集群ID,使得yarn能够在正确的集群上Active -->  
        <name>yarn.resourcemanager.cluster-id</name>  
        <value>hd0703-yarn</value>  
    </property>  
  
    <property>  
        <name>yarn.client.failover-proxy-provider</name>  
        <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value>  
    </property>  
  
    <property>  
        <name>yarn.resourcemanager.recovery.enabled</name>  
        <value>true</value>  
    </property>  
  
    <property>  
        <!-- 两个可选值:org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore 以及 默认值org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore -->  
        <name>yarn.resourcemanager.store.class</name>  
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>  
    </property>  
  
    <!-- YARN HA 配置结束 -->  
  
    <property>  
        <name>yarn.log-aggregation-enable</name>  
        <!-- 打开日志聚合功能,这样才能从web界面查看日志 -->  
        <value>true</value>  
    </property>  
  
    <property>  
        <name>yarn.log-aggregation.retain-seconds</name>  
        <!-- 聚合日志最长保留时间 -->  
        <value>86400</value>  
    </property>  
  
    <property>  
        <name>yarn.nodemanager.resource.memory-mb</name>  
        <!-- NodeManager总的可用内存,这个要根据实际情况合理配置 -->  
        <value>1024</value>  
    </property>  
  
    <!-- ... (省略了部分YARN NodeManager和Scheduler配置,以保持示例简洁) -->  
  
    <property>  
        <name>yarn.nodemanager.local-dirs</name>  
        <!-- 中间结果存放位置。注意,这个参数通常会配置多个目录,已分摊磁盘IO负载。 -->  
        <value>/home/vagrant/VMBigData/hadoop/data/localdir1,/home/vagrant/VMBigData/hadoop/data/localdir2</value>  
    </property>  
  
    <property>  
        <name>yarn.nodemanager.log-dirs</name>  
        <!-- 日志存放位置。注意,这个参数通常会配置多个目录,已分摊磁盘IO负载。 -->  
        <value>/home/vagrant/VMBigData/hadoop/data/hdfs/logdir1,/home/vagrant/VMBigData/hadoop/data/hdfs/logdir2</value>  
    </property>  
  
    <property>  
        <name>yarn.nodemanager.aux-services</name>  
        <value>mapreduce_shuffle</value>  
    </property>  
  
    <property>  
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>  
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>  
    </property>  
</configuration>
vim /home/federation/hadoop-2.7.3/etc/hadoop/mapred-site.xml 
<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
    <property>  
        <name>mapreduce.framework.name</name>  
        <value>yarn</value>  
    </property>  
    <property>  
        <name>yarn.app.mapreduce.am.resource.mb</name>  
        <!-- 默认值为 1536,可根据需要调整,调小一些也是可接受的 -->  
        <value>512</value>  
    </property>  
    <property>  
        <name>mapreduce.map.memory.mb</name>  
        <!-- 每个map task申请的内存,每一次都会实际申请这么多 -->  
        <value>384</value>  
    </property>  
    <property>  
        <name>mapreduce.map.java.opts</name>  
        <!-- 每个map task中的child jvm启动时参数,需要比 mapreduce.map.memory.mb 设置的小一些 -->  
        <!-- 注意:map任务里不一定跑java,可能跑非java(如streaming) -->  
        <value>-Xmx256m</value>  
    </property>  
    <property>  
        <name>mapreduce.reduce.memory.mb</name>  
        <value>384</value>  
    </property>  
    <property>  
        <name>mapreduce.reduce.java.opts</name>  
        <value>-Xmx256m</value>  
    </property>  
    <property>  
        <name>mapreduce.tasktracker.map.tasks.maximum</name>  
        <value>2</value>  
    </property>  
    <property>  
        <name>mapreduce.tasktracker.reduce.tasks.maximum</name>  
        <value>2</value>  
    </property>  
    <property>  
        <name>mapred.child.java.opts</name>  
        <!-- 默认值为 -Xmx200m,生产环境可以设大一些 -->  
        <value>-Xmx384m</value>  
    </property>  
    <property>  
        <name>mapreduce.task.io.sort.mb</name>  
        <!-- 任务内部排序缓冲区大小 -->  
        <value>128</value>  
    </property>  
    <property>  
        <name>mapreduce.task.io.sort.factor</name>  
        <!-- map计算完全后的merge阶段,一次merge时最多可有多少个输入流 -->  
        <value>100</value>  
    </property>  
    <property>  
        <name>mapreduce.reduce.shuffle.parallelcopies</name>  
        <!-- reduce shuffle阶段并行传输数据的数量 -->  
        <value>50</value>  
    </property>  
    <property>  
        <name>mapreduce.jobhistory.address</name>  
        <value>hadoop1:10020</value>  
    </property>  
    <property>  
        <name>mapreduce.jobhistory.webapp.address</name>  
        <value>hadoop1:19888</value>  
    </property>  
    <property>  
        <name>mapreduce.task.io.sort.mb</name>  
        <!-- 任务内部排序缓冲区大小 -->  
        <value>128</value>  
    </property>  
    <property>  
        <name>mapreduce.task.io.sort.factor</name>  
        <!-- map计算完全后的merge阶段,一次merge时最多可有多少个输入流 -->  
        <value>100</value>  
    </property>  
    <property>  
        <name>mapreduce.reduce.shuffle.parallelcopies</name>  
        <!-- reduce shuffle阶段并行传输数据的数量 -->  
        <value>50</value>  
    </property>  
    <property>  
        <name>mapreduce.jobhistory.address</name>  
        <value>hadoop1:10020</value>  
    </property>  
    <property>  
        <name>mapreduce.jobhistory.webapp.address</name>  
        <value>hadoop1:19888</value>  
    </property>  
</configuration>

!!! 特别要注意 !!!
​ 在 hdfs-site.xml ⽂件中的 dfs.namenode.shared.edits.dir 配置项:
​ 当配置⽂件所在节点处于ns1集群时,此处值末尾部分为ns1,当处于ns2集群时,则为ns2。

5.4 安装配置zookeeper

在 hadoop1 操作,后⾯通过 scp 同步到其他主机。

cd /home/vagrant/VMBigData/zookeeper/default/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
# 对该⽂件做出以下修改
dataDir=/home/vagrant/VMBigData/zookeeper/data/tmp
# 如果⽆法启动zookeeper,可将以下代码对应的⾏改为 0.0.0.0:2888:3888
# 注意zookeeper解析该⽂件很死板,不要输⼊多余的空格和空⾏
server.1=h01.vm.com:2888:3888
server.2=h02.vm.com:2888:3888
server.3=h03.vm.com:2888:3888
mkdir -p /...../zookeeper/data/tmp
vim /...../zookeeper/data/tmp/myid

在此⽂件中输⼊节点编号,⽐如h01节点就输⼊1,h02节点就输⼊2.

# 修改各节点的 zookeeper 的 /home/vagrant/VMBigData/zookeeper/data/tmp/myid ⽂件,内容为各节点编号,本例中为 1,2,3

5.5 启动集群

(1) 启动zookeeper
启动之前记得分发到其他主机,在 hadoop1 hadoop2 hadoop3 操作。

zkServer.sh start

(2) 启动JournalNode
在任⼀配置了journalnode的节点操作。

hadoop-daemons.sh --hostnames "h02.vm.com h03.vm.com h04.vm.com" start journalnode

(3) 格式化namenode
在 hadoop1 和 hadoop3 即每个集群其中⼀台namenode的节点上执⾏,注意需要指定集群ID。

hdfs namenode -format -clusterid hd0703

(4) 启动格式化后的namenode
在已经格式化过的 hadoop1 和 hadoop3 namenode 节点运⾏。

hadoop-daemons.sh --hostnames "hadoop1 hadoop2" start namenode

(5) 同步四个namenode的数据
在 hadoop2 和 hadoop4 执⾏同步。

hdfs namenode -bootstrapStandby

(6) 启动同步后的namenode
在已经同步过的 hadoop2 和 hadoop4 namenode 节点运⾏。

cd /home/vagrant/VMBigData/hadoop/default
sbin/hadoop-daemons.sh --hostnames "hadoop2 hadoop4" start namenode

(7) 格式化zkfc
在 hadoop1 和 hadoop3 (主namenode) 上操作。注意仅在⾸次启动时执⾏ !!!

hdfs zkfc -formatZK

(8) 启动zkfc
在 hadoop1 操作即可。

hadoop-daemons.sh --hostnames "hadoop1 hadoop2 hadoop3 hadoop4" start zkfc
# sbin/hadoop-daemons.sh stop zkfc # 停⽌

(9) 启动hadoop集群
启动hdfs,可在任意主节点执⾏。

start-dfs.sh
stop-dfs.sh # 停⽌

启动Yarn,在hadoop1 和 hadoop2 即计划搭载 ResourceManager 的节点上操作。

start-yarn.sh
sbin/stop-yarn.sh# 停⽌

5.6 运⾏情况查看

在这里插入图片描述

由上图所示,我们可以看到我的4个节点相关进程均已启动。首先,如果仅仅只是HA,那么我的namenode进程只会在hadoop1和hadoop2这两个节点上启动,其中一个结点的状态是active,另一个的状态是standby。现在,我在HA的基础上加上了Federation,可以理解为将我的大集群划分为两个小集群ns1和ns2,并且每个小集群都实现了HA。还有就是关于数据节点datanode,为什么4个节点都有datanode进程,是因为我将所有节点也同时设置为从节点,这样某些结点既是主节点又是从节点。

那么这样的效果将如下图所示,其中hadoop1状态为active,hadoop2状态为standby;hadoop3状态为standby,hadoop4状态为active。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从下图我们也可以看到我的4台数据节点也全部在线,并且经过我的测试能正常使用所有hdfs相关功能。
在这里插入图片描述
在这里插入图片描述

下图是yarm的相关情况
在这里插入图片描述
在这里插入图片描述

5.7 总结

  • QuorumPeerMain 是zookeeper集群的⼊⼝进程;
  • zkfc 是 Zookeeper FailoverController 的简称,主要⽤于实现两个NN之间的容灾;
  • resourcemanager 是 yarn 中负责资源协调和管理的进程;
  • nodemanager 是 yarn 中单个节点上的代理进程,向 RM 汇报信息,监控该节点资源;
  • datanode 是 hdfs 的⼯作节点,负责实际的数据存储和任务计算;
  • journalnode 是QJM模式下两个NN节点同步数据的进程,每个HA集群⾥⾯的⾼可⽤依赖它;
  • ns1,ns2 是集群的逻辑名称。

nn1,nn2, nn3, nn4 是集群中NN的逻辑名称
注意:zookeeper 节点需要配置奇数台,⼀般配置3-7台即可。2000多个节点的集群也仅需要5-9台zk;journalnode与zk类似,也是配置奇数台,且最少需要3台,同样不需要太多;另外zkfc需要在启动namenode的节点上也启动,以保障NN间的⼼跳机制。

六、HDFS存储策略

6.1 环境准备

服务器规模:3台

集群配置:副本数为2,创建好带有存储类型的⽬录(提前创建)

节点存储类型
masterRAM_DISK,SSD
slave1SSD,DISK
slave2DISK,ARCHIVE

6.2 配置⽂件

6.2.1 为Master节点的hdfs-site.xml添加如下信息

<property>  
    <name>dfs.replication</name>  
    <value>2</value>  
</property>  
<property>  
    <name>dfs.storage.policy.enabled</name>  
    <value>true</value>  
</property>  
<property>  
    <name>dfs.datanode.data.dir</name>  
    <value>[SSD]file:///usr/local/hadoop/data/ssd,[RAM_DISK]file:///usr/local/hadoop/data/ram_disk</value>  
</property>

6.2.2 为slave1节点的hdfs-site.xml添加如下信息

<property>  
    <name>dfs.replication</name>  
    <value>2</value>  
</property>  
<property>  
    <name>dfs.storage.policy.enabled</name>  
    <value>true</value>  
</property>  
<property>  
    <name>dfs.datanode.data.dir</name>  
    <value>[SSD]file:///usr/local/hadoop/data/ssd,[DISK]file:///usr/local/hadoop/data/disk</value>  
</property>

6.2.3 为slave2节点的hdfs-site.xml添加如下信息

<property>  
    <name>dfs.replication</name>  
    <value>2</value>  
</property>  
<property>  
    <name>dfs.storage.policy.enabled</name>  
    <value>true</value>  
</property>  
<property>  
    <name>dfs.datanode.data.dir</name>  
    <value>[ARCHIVE]file:///usr/local/hadoop/data/archive,[DISK]file:///usr/local/hadoop/data/disk</value>  
</property>

6.3 上传数据到HDFS

6.3.1 启动集群
# HDFS格式化
hdfs namenode -format

# 启动集群
start-all.sh
6.3.2 并在HDFS上创建⽂件⽬录
hadoop fs -mkdir /hdfsdata 或者 hdfs dfs -mkdir /hdfsdata
6.3.3 并将⽂件资料上传
hdfs dfs -put /....../hdfsTest.txt /hdfsdata

6.4 Hot存储策略

(1) 最开始我们未设置存储策略的情况下,我们获取该⽬录的存储策略

hdfs storagepolicies -getStoragePolicy -path /hdfsdata

(2) 查看上传的⽂件块分布

hdfs fsck /hdfsdata -files -blocks -locations
# 未设置存储策略,所有⽂件块都存储在DISK下。所以,默认存储策略为HOT。
[DatanodeInfoWithStorage[192.168.150.129:50010,DS-36e5bd33-f721-4e81-9c46-3
8876ef7b565,DISK], DatanodeInfoWithStorage[192.168.150.133:50010,DS-7c15ee8
c-cff9-47fc-a3b3-9d52106a7e4a,DISK]]

(3)查看⼀个HDFS路径是否设置了存储策略

hdfs storagepolicies -getStoragePolicy -path /hdfsdata
# 说明这个路径没有设置存储路径,那么这个路劲就是⽤默认的存储策略,即HOT存储策略。
The storage policy of /user/hadoop-twq/cmd is unspecified

6.5 Warm存储策略

(1) 为数据降温

hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy WARM

(2) 查看⼀个HDFS路径是否设置了存储策略

hdfs storagepolicies -getStoragePolicy -path /hdfsdata

查看⽂件分布:hdfs fsck /hdfsdata -files -blocks -locations(这⾥策略修改成功,但数据应该都还在disk,需要⼿动移动数据块)

(3) ⼿动转移⽂件块

hdfs mover /hdfsdata

注意:虽然存储策略已经修改,但数据还是存放在原有⽬录(⽐如:disk,需要⼿动移动下数据到指定类型⽬录,这⾥的温数据,应该是有⼀部分放disk,⼀部分放archive)。

(4) 查看⽂件块分布

hdfs fsck /hdfsdata -files -blocks -locations

⽂件块⼀部分在DISK,⼀部分在ARCHIVE,符合我们设置的WARM策略。

6.6 Cold策略

(1) 继续将数据降温为cold

hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy COLD

注意:当我们将⽬录设置为COLD且我们未配置ARCHIVE存储⽬录的情况下,不能向该⽬录直接上传⽂件,会报出异常。

(2) 查看⼀个HDFS路径是否设置了存储策略

hdfs storagepolicies -getStoragePolicy -path /hdfsdata

所有⽂件块都在ARCHIVE,符合COLD存储策略,这⾥由于我们没有⼀台主机设置了ARCHIVE策略,所以数据存储没变。

(3) 查看⽂件块分布

hdfs fsck /hdfsdata -files -blocks -locations

6.7 One_SSD策略

(1) 将存储策略从默认的HOT更改为One_SSD

hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy One_SSD

(2) ⼿动转移⽂件块

hdfs mover /hdfsdata

(3) 查看⽂件块分布

hdfs fsck /hdfsdata -files -blocks -locations
⽂件块分布为⼀半在SSD,⼀半在DISK,符合One_SSD存储策略
[DatanodeInfoWithStorage[192.168.150.129:50010,DS-36e5bd33-f721-4e81-9c46-3
8876ef7b565,DISK], DatanodeInfoWithStorage[192.168.150.133:50010,DS-7c15ee8
c-cff9-47fc-a3b3-9d52106a7e4a,SSD]] 

(4)查看⼀个HDFS路径是否设置了存储策略

hdfs storagepolicies -getStoragePolicy -path /hdfsdata 

6.8 MOVER-⼀个新的数据迁移⼯具

​ mover⼯具可以将数据从⼀个存储层移动到另⼀个存储层。它的⼯作原理与HDFS平衡器⾮常相似,只不过它是在不同的存储类型之间移动块副本。可以使⽤mover⼯具扫描HDFS⽂件,以确定块位置是否与配置的存储策略匹配。如果⼀个块未根据配置的存储策略存放,则mover会将副本移动到相应的存储类型。可以定期运⾏mover,将所有⽂件迁移到使⽤存储策略配置的存储类型中。

hdfs mover -help   # mover命令的关键选项说明
hdfs mover # 直接运⾏不加任何参数,若不指定路径则默认将根⽬录("/")作为默认路径。
hdfs mover -p /data/ 
# 指定迁移的⽬录为"/data",他会将该⽬录下的⽂件数据块根据存储策略移动到咱们定义的存储类型设备上。

6.9 All_SSD策略

(1) 将存储策略更改为All_SSD

hdfs storagepolicies -setStoragePolicy -path /hdfsdata -policy All_SSD

(2) ⼿动转移⽂件块

hdfs mover /hdfsdata

(3) 查看⽂件块分布

所有的⽂件块都存储在SSD,符合All_SSD存储策略
[DatanodeInfoWithStorage[192.168.150.129:50010,DS-36e5bd33-f721-4e81-9c46-3
8876ef7b565,SSD], DatanodeInfoWithStorage[192.168.150.133:50010,DS-7c15ee8c
-cff9-47fc-a3b3-9d52106a7e4a,SSD]]

(4) 查看⼀个HDFS路径是否设置了存储策略

hdfs storagepolicies -getStoragePolicy -path /hdfsdata

七、 HDFS监控与维护(Ambari)

7.1 Ambari是什么

Ambari跟Hadoop等开源软件⼀样,也是 Apache Software Foundation 中的⼀个项⽬。并且是顶级项⽬。就Ambari的作⽤来说。就是创建、管理、监视、Hadoop的集群,但是这⾥的Hadoop是⼴义,指的是Hadoop整个⽣态圈(例如 Hive,Hbase,Sqoop,Zookeeper 等),⽽并不仅是特指Hadoop。Ambari就是为了让Hadoop以及相关的⼤数据软件更容易使⽤的⼀个⼯具。

简单来说,Ambari是⼀个拥有集群⾃动化安装、中⼼化管理、集群监控、报警功能的⼀个⼯具(软件),使得安装集群从⼏天的时间缩短在⼏个⼩时内,运维⼈员从数⼗⼈降低到⼏⼈以内,极⼤的提⾼集群管理的效率。

7.2 Ambari架构

Ambari框架采⽤的是Server/Client的模式,主要由两部分组成:ambari-agent和ambari-server。ambari-server主要管理部署在每个节点上的管理监控程序。Ambari-agent 部署在监控节点上运⾏的管理监控程序。ambari-web 作为⽤户与 Ambari server 交互的。

在这里插入图片描述

7.3 操作⽅式

Ambari 提供 Ambari web,rest api,Ambari shell 三⼤⽅式操作集群;Ambari 将集群的配置、各个服务的配置等信息存在 Ambari server 端的 DB 中(⽐如可以是Mysql);Ambari server 与 Ambari agent 的交流⾛ RPC,即 agent 向 server 报告⼼跳,server 将 command 通过 response 发回给 agent,agent 本地执⾏命令;Ambari 有⾃⼰的⼀套监控、告警、镜像服务,以可插拔的形式供上层服务调⽤。

7.4 Ambari集群搭建

(1) 服务器环境说明

  • 集群三台节点
  • 可以互相访问
  • 使⽤root⽤户
  • 配置免密
  • centos7
  • ambari-2.6.2.2
  • hdp-2.6.5
  • 在windows的hosts⽂件中添加环境信息

(2) 防⽕墙关闭设置

# 查看防⽕墙状态
systemctl status firewalld
# 关闭防⽕墙
systemctl stop firewalld
# 设置防⽕墙服务开机不⾃启
systemctl disable firewalld
# 再次查看防⽕墙检查防⽕墙是否关闭
systemctl status firewalld

(3) 禁⽤selinux

vim /etc/selinux.config
把SELINUX=enforcing修改为SELINUX=disabled

(4) 配置jdk

# 上传jdk
# 解压
# 配置环境变量
# 查看java环境
java -version

(5) 安装mysql

# 安装mysql
# mysql启动
# mysql登录
mysql -uroot
# 修改root⽤户密码
alter user 'root'@'localhost' identified by '******';
# 授权root⽤户所有权限并设置本地登录
grant all privileges on *.* to 'root'@'localhost' identified by '******';
# 授权root⽤户所有权限并设置远程登录
grant all privileges on *.* to 'root'@'%' identified by '******';
# 刷新权限
flush privileges;

(6) 安装httpd服务

# 安装
yum install httpd
# 开机⾃启动
systemctl enable httpd.service
# 启动httpd服务
systemctl start httpd.service
# 查看httpd服务状态
systemctl status httpd.service
# 说明,安装完之后,会⽣成/var/www/html⽬录

(7) 安装ntp

# 安装
yum install ntp
# 开机⾃启动
systemctl enable ntpd
# 启动ntp服务
systemctl start ntpd
# 查看ntpd服务状态
systemctl status ntpd

(8) ntp配置

vim /etc/ntp.conf
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
# 表示ntp主服务器是与⾃身的系统时钟同步
server 127.127.1.0
# 指定阶层编号为10,降低优先度
fudge 127.127.1.0 stratum 10

(9) 时钟同步

在主机2和主机3上执⾏

# my-hdp2、my-hdp3执⾏以下操作
vim /etc/ntp.conf
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
# 表示ntp主服务器是与⾃身的系统时钟同步
server 127.127.1.0
# 指定阶层编号为10,降低优先度
fudge 127.127.1.0 stratum 10
# 配置时间服务器为本地的时间服务器
server my-hdp1
# 允许上层时间服务器主动修改本机时间
restrict my-hdp1 nomodify notrap noquery

(10) 上传ambari和hdp

在主机1上传

# 在my-hdp1上执⾏
# 将安装包上传到/var/www/html
ambari-2.6.2.2-centos7.tar.gz
HDP-2.6.5.0-centos7-rpm.tar.gz
HDP-UTILS-1.1.0.22-centos7.tar.gz
# 解压
tar -zxvf 上⾯的包

(11) 创建repo⽂件

在主机1上传

# 进⼊/etc/yum.repo.d/
cd /etc/yum.repo.d/
# 新建ambari.repo⽂件
vim ambari.repo
# 添加以下内容
[ambari]
name=ambari
baseurl=http://hadoop1/ambari/centos7/2.6.2.2-1
enabled=1
gpgcheck=0
# 新建HDP.repo
vim HDP.repo
#添加以下内容
[HDP]
name=HDP
baseurl=http://hadoop1/HDP/centos7/2.6.5.0-292
path=/
enabled=1
gpgcheck=0
# 新建HDP-UTILS.repo
vim HDP-UTILS.repo
#添加以下内容
[HDP-UTILS]
name=HDP-UTILS
baseurl=http://hadoop1/HDP-UTILS/centos7/1.1.0.22
path=/
enabled=1
gpgcheck=0

(12) 分发repo⽂件

在主机1上执⾏

# 分发⽂件到主机2、主机3,使⽤分发的⽅式避免⽂件出错
# 分发ambari.repo
scp ambari.repo root@主机2:/etc/yum.repo.d
scp ambari.repo root@主机3:/etc/yum.repo.d
# 分发HDP.repo
scp HDP.repo root@主机2:/etc/yum.repo.d
scp HDP.repo root@主机3:/etc/yum.repo.d
# 分发HDP-UTILS.repo
scp HDP-UTILS.repo root@主机2:/etc/yum.repo.d
scp HDP-UTILS.repo root@主机3:/etc/yum.repo.d

(13) ⽣成yum源

在主机1上执⾏

# 在/var/www/html下有三个⽂件夹
drwxr-xr-x. 3 root root 21 47 14:58 ambari
drwxr-xr-x. 3 1001 users 21 515 2018 HDP
drwxr-xr-x. 3 1001 users 21 813 2018 HDP-UTILS
# 分别进⼊以下⽬录查看是否有repodata⽬录
# ambari⽬录
/var/www/html/ambari/centos7/2.6.2.2-1
# HDP⽬录
/var/www/html/HDP/centos7/2.6.5.0-292
# HDP-UTILS⽬录
/var/www/html/HDP-UTILS/centos7/1.1.0.22
# 如果上⾯的⽬录中没有repodata,则在上⾯的路径下执⾏
createrepo .

(14) 在mysql中创建ambari⽤户

在主机1上执⾏

# 登录mysql
mysql -uroot -proot
# 创建ambari⽤户
create user 'ambari'@'%' identified by 'ambari';
# 授权ambari⽤户所有权限并设置本地登录
grant all privileges on *.* to 'ambari'@'localhost' identified by 'ambar
i';
# 授权ambari⽤户所有权限并设置远程登录
grant all privileges on *.* to 'ambari'@'%' identified by 'ambari';
# 刷新权限
flush privileges;
# 退出登录
exit;
# 使⽤ambari⽤户登录,检查ambari是否可以登录
mysql -uambari -pambari
# 使⽤ambari⽤户登录并创建数据库
create database ambari;

(15) 初始化ambari数据库

在主机1上执⾏

# 使⽤amabri⽤户登录Mysql
mysql -uambari -pambari
# 切换数据库
use ambari;
# 初始化ambari数据库
source /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql

(16) 安装ambari

在主机1上执⾏

# 安装ambari-server
yum install ambari-server
# 修改ambari.properties
vim /etc/ambari-server/conf/ambari.properties
# 在ambari.properties⽂件末尾添加mysql-connector-java驱动
server.jdbc.driver.path=/var/share/java/mysql-connector-java-5.1.27-bin.jar
# ambari-server初始化配置
ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-con
nector-java-5.1.27-bin.jar

在这里插入图片描述

(17) ambari配置

在主机1上执⾏

Using python /usr/bin/python
Setup ambari-server
Checking SELinux...
SELinux status is 'enabled'
SELinux mode is 'permissive'
WARNING: SELinux is set to 'permissive' mode and temporarily disabled.
OK to continue [y/n] (y)? y
Customize user account for ambari-server daemon [y/n] (n)? y
Enter user account for ambari-server daemon (sweet):root
Adjusting ambari-server permissions and ownership...
Checking firewall status...
Checking JDK...
Do you want to change Oracle JDK [y/n] (n)? y
[1] Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8
[2] Oracle JDK 1.7 + Java Cryptography Extension (JCE) Policy Files 7
[3] Custom JDK
=========================================================================
=====
Enter choice (1): 3
WARNING: JDK must be installed on all hosts and JAVA_HOME must be valid o
n all hosts.
WARNING: JCE Policy files are required for configuring Kerberos securit
y. If you plan to use Kerberos,please make sure JCE Unlimited Strength Ju
risdiction Policy Files are valid on all hosts.
Path to JAVA_HOME:
Property cannot be blank.
Path to JAVA_HOME: /home/sweet/jdk1.8.0_144
Validating JDK on Ambari Server...done.
Checking GPL software agreement...
Completing setup...
Configuring database...
Enter advanced database configuration [y/n] (n)? y
Configuring database...
=========================================================================
=====
Choose one of the following options:
[1] - PostgreSQL (Embedded)
[2] - Oracle
[3] - MySQL / MariaDB
[4] - PostgreSQL
[5] - Microsoft SQL Server (Tech Preview)
[6] - SQL Anywhere
[7] - BDB
========================================================================= 41
===== 42 Enter choice (3): 3 43 Hostname (localhost): 44 Port (3306): 45 Database name (ambari): 46 Username (ambari): 47 Enter Database Password (ambari): 48 Configuring ambari database... 49 Configuring remote database connection properties...
WARNING: Before starting Ambari Server, you must run the following DDL ag
ainst the database to create the schema: /var/lib/ambari-server/resource 50 s/Ambari-DDL-MySQL-CREATE.sql
Proceed with configuring remote database connection properties [y/n] 51 (y)? n 52 WARNING: Remote database setup aborted. 53 Ambari Server 'setup' completed with warnings. 54 [root@my-hdp1 java]# ambari-server setup 55 Using python /usr/bin/python 56 Setup ambari-server 57 Checking SELinux... 58 SELinux status is 'enabled' 59 SELinux mode is 'permissive' 60 WARNING: SELinux is set to 'permissive' mode and temporarily disabled. 61 OK to continue [y/n] (y)? y 62 Customize user account for ambari-server daemon [y/n] (n)? y 63 Enter user account for ambari-server daemon (sweet):root 64 Adjusting ambari-server permissions and ownership... 65 Checking firewall status... 66 Checking JDK... 67 Do you want to change Oracle JDK [y/n] (n)? y 68 [1] Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8 69 [2] Oracle JDK 1.7 + Java Cryptography Extension (JCE) Policy Files 7 70 [3] Custom JDK
========================================================================= 71
===== 72 Enter choice (1): 3
WARNING: JDK must be installed on all hosts and JAVA_HOME must be valid o 73 n all hosts.
WARNING: JCE Policy files are required for configuring Kerberos securit
y. If you plan to use Kerberos,please make sure JCE Unlimited Strength Ju 74 risdiction Policy Files are valid on all hosts. 75 Path to JAVA_HOME: /home/sweet/jdk1.8.0_144 76 Validating JDK on Ambari Server...done. 77 Checking GPL software agreement... 78 Completing setup... 79 Configuring database... 80 Enter advanced database configuration [y/n] (n)? y
Configuring database...
=========================================================================
=====
Choose one of the following options:
[1] - PostgreSQL (Embedded)
[2] - Oracle
[3] - MySQL / MariaDB
[4] - PostgreSQL
[5] - Microsoft SQL Server (Tech Preview)
[6] - SQL Anywhere
[7] - BDB
=========================================================================
=====
Enter choice (3): 3
Hostname (localhost):
Port (3306):
Database name (ambari):
Username (ambari):
Enter Database Password (ambari):
Configuring ambari database...
Configuring remote database connection properties...
WARNING: Before starting Ambari Server, you must run the following DDL ag
ainst the database to create the schema: /var/lib/ambari-server/resource
s/Ambari-DDL-MySQL-CREATE.sql
Proceed with configuring remote database connection properties [y/n]
(y)? y
Extracting system views...
ambari-admin-2.6.2.2.1.jar
...........
Adjusting ambari-server permissions and ownership...
Ambari Server 'setup' completed successfully.

(18) 启动ambari

# 启动ambari
ambari-server start
# 启动成功后
# 在windows浏览器地址栏中输⼊,主机名根据自己实际情况进行更改
http://my-hdp1:8080/

由于Spark的默认端口也是8080,如果需要同时使用Spark和ambari,则需要改默认端口号,以防发生冲突。可以改ambari,也可以改Spark的默认端口号。

我这里在最后启动的时候也发生了端口占用的情况,虽然没有被Spark占用,但根据输出来看,端口 8080 已经被一个 Java 进程(PID 为 4713)监听。可以去修改端口号再来启动,不想修改可以用kill命令杀死占用8080端口的服务进程,然后再次启动。我这里选择第3种方式,临时使用其他端口来启动。

# 通过命令行设置环境变量(每次启动前都需要设置)
export AMBARI_SERVER_PORT=88080  
ambari-server start

在这里插入图片描述

启动成功之后我们去浏览器输入“http://hadoop1:8080/”,可以看到ambari登录界面。默认用户和密码都是“admin”。

在这里插入图片描述

登录成功后部分展示如下图:

在这里插入图片描述
在这里插入图片描述

八、总结

分布式存储,作为一种将数据存储任务分散到多个独立的存储节点上,并通过网络进行数据访问和管理的技术,已经广泛应用于各种场景中。随着大数据、云计算、物联网等技术的不断发展,分布式存储技术因其高可用性、可扩展性、容错性和高性能等特点,成为了存储海量数据的首选方案。

在本文中,我们首先探讨了分布式存储的定义和主要应用场景,包括云存储服务、IoT应用、数据备份与恢复等,这些场景对存储系统的容量、性能和可靠性都提出了极高的要求。接着,我们深入解析了HDFS(Hadoop Distributed File System)的起源、发展、架构、基本概念和特性。HDFS作为Hadoop生态系统中的核心组件,为大数据处理提供了稳定、高效的存储支持。随后,我们介绍了HDFS的安装与配置过程,帮助读者搭建起自己的HDFS环境,以便进行更深入的学习和实践。在HDFS操作指南部分,我们详细说明了如何在HDFS上进行文件的创建、读取、写入和删除等操作,以及如何进行数据块的管理和分配。为了进一步提升HDFS的可用性和性能,我们介绍了Hadoop的高可用性(HA)和联邦(Federation)架构。HA通过引入备用NameNode和自动故障转移机制,保证了系统的持续可用性;而Federation则通过引入多个NameSpace,实现了HDFS的横向扩展。在HDFS的存储策略部分,我们介绍了HDFS支持的五种存储策略,包括默认的存储策略、热存储策略、冷存储策略、归档存储策略和全磁盘存储策略,这些策略可以根据数据的访问频率和重要性进行灵活配置。最后,在HDFS监控与维护部分,我们介绍了如何使用Ambari等监控工具对HDFS进行实时监控和性能调优,以确保系统的稳定运行。

随着技术的不断进步和应用的不断扩展,分布式存储将面临更多的挑战和机遇。一方面,随着物联网、人工智能等技术的快速发展,数据量将继续呈现爆炸式增长,对分布式存储的容量、性能和可靠性提出了更高的要求。另一方面,随着云计算的普及和边缘计算的兴起,分布式存储的架构和形态也将发生深刻的变化。未来,分布式存储将更加注重数据的安全性和隐私保护,通过加密、脱敏、访问控制等技术手段,确保数据的安全性和合规性。同时,分布式存储也将更加注重与云原生、容器化等技术的融合,为用户提供更加灵活、高效、可靠的存储服务。此外,随着新型存储介质和技术的不断涌现,分布式存储的性能和效率也将得到进一步提升。总之,分布式存储将继续在大数据、云计算、物联网等领域发挥重要作用,并迎来更加广阔的发展前景。

九、附录

9.1 常见问题解答

(1)HDFS节点宕机如何处理?

如果某个Data Node宕机,HDFS会自动检测到,并通过副本机制从其他节点恢复数据。管理员需要检查节点状态并进行故障修复。

(2)如何优化HDFS的性能?

调整副本数量、合理配置块大小、优化网络架构以及使用高性能硬件设备可以有效提升HDFS性能。

(3)HDFS与传统文件系统的区别?

HDFS设计用于处理大规模数据集,具有高容错性和高吞吐量,适合批处理,而传统文件系统更适用于一般文件存储和访问。

(4)HDFS中的数据如何保证一致性?

HDFS通过数据块副本和Name Node管理的数据一致性机制,确保数据的一致性和可靠性。

(5) 如何进行HDFS的容量规划?

根据数据增长预测和实际使用情况,合理设置每个节点的存储容量,确保HDFS能够满足未来的数据存储需求。

(6)HDFS如何处理小文件?

HDFS不适合存储大量小文件。可以使用Hadoop Archive(HAR)或将小文件合并成大文件来优化存储效率。

(7)如何备份HDFS数据?

可以使用DistCp(分布式复制)工具将HDFS数据备份到其他集群或存储系统。

9.2 HDFS相关的术语表

Name Node: HDFS的主节点,负责管理文件系统元数据,包括文件路径、数据块位置等。Name Node是HDFS的中央控制器,负责协调客户端和Data Node之间的交互。

Data Node:存储实际数据块的节点。每个DataNode负责存储和管理HDFS中的实际数据,并定期向Name Node发送心跳信息和数据块报告。

Secondary Name Node:辅助Name Node进行元数据的检查点操作。Secondary Name Node定期将Name Node的内存镜像和编辑日志合并,并保存到本地磁盘,以减轻Name Node的工作负担。

块(Block):HDFS中最小的数据存储单元,默认大小为128MB。每个文件在HDFS中被分成若干个块,每个块被分布存储在不同的Data Node上。

副本(Replication):为保证数据可靠性,HDFS会将每个数据块存储多个副本,默认3个副本。副本分布在不同的DataNode和机架上,以提高数据的可用性和容错性。

Rack Awareness:机架感知,HDFS通过识别数据块副本所在机架,优化数据存储和读取效率。Rack Awareness策略确保数据副本分布在不同机架上,以避免单一机架故障造成的数据丢失。

HDFS Federation: HDFS联邦机制,通过多个Name Node管理不同的命名空间,实现文件系统的横向扩展。Federation提高了HDFS的可扩展性和性能。

HA(High Availability):高可用性,通过配置多个Name Node实现HDFS的高可用性。HA机制确保在一个Name Node故障时,备用Name Node可以迅速接管工作,保证系统的持续运行。

FileSystem: HDFS的核心接口类,提供了对文件系统的基本操作接口,如文件的创建、删除、重命名等。

DistributedFileSystem: FileSystem的具体实现类,用于操作HDFS,提供了HDFS的具体操作方法。

File Context:提供了一组更加抽象的文件系统操作接口,适用于需要跨文件系统操作的场景。

FSDataInputStream: HDFS文件输入流类,用于读取HDFS文件数据。

FSDataOutputStream: HDFS文件输出流类,用于向HDFS文件写入数据。

9.3 相关链接

  1. mysql驱动5.1.27 jar包下载地址

https://www.itmop.com/downinfo/177972.html

  1. jdk下载地址

https://www.oracle.com/java/technologies/downloads/#java8

  1. zookeeper下载地址

https://downloads.apache.org/zookeeper/

  1. hadoop下载地址

https://downloads.apache.org/hadoop/core/

  1. Ambari相关安装包

链接:https://pan.baidu.com/s/1JUo7j_yWHDDqKwzkLddvYg?pwd=cgex
提取码:cgex

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1921668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你也想做一个Element-ui吧!!!——Blueの前端路(一)

目录 前言&#xff1a; 父子组件 button组件 使用vue脚手架初始化一个项目 如何封装&#xff0c;注册和使用一个组件 main.js中将组件设置为全局 使用 此组件我们所需实现的内容 type 父组件组件传递type属性 子组件接收负组件传递的数据 通过绑定类名的方法动态控制…

python如何结束程序运行

方法1&#xff1a;采用sys.exit(0)&#xff0c;正常终止程序&#xff0c;从图中可以看到&#xff0c;程序终止后shell运行不受影响。 方法2&#xff1a;采用os._exit(0)关闭整个shell&#xff0c;从图中看到&#xff0c;调用sys._exit(0)后整个shell都重启了&#xff08;RESTAR…

关键路径-matlab

路径上边的数目称为路径长度 图的基本知识 求最短路径&#xff08;Dijkstra算法&#xff09; 2. 待继续尝试 ①Dijkstra ②floyd_all.m 一 二 ③ LeetCode [329. 矩阵中的最长递增路径]

OpenCV solvePnP位姿估计

目录 一、概述 二、实现代码 2.1solvePnP函数 2.1.1输入参数 2.1.2输出参数 2.2完整代码 三、实现效果 3.1标定板位姿 3.2标定板到相机的变换矩阵 一、概述 完成相机标定后&#xff0c;可以通过检测标定板在图像中的位置来计算标定板在相机坐标系下的位姿&#xff08;…

Python基础知识——(004)

文章目录 P16——15. 布尔类型 P17——16. 类型转换函数 P18——17. eval函数 P19——18. 算数运算符 P20——19. 赋值运算符 P16——15. 布尔类型 布尔类型 用来表示 “真” 值或 “假” 值的数据类型在Python中使用标识符 True 或 False 表示布尔类型的值True表示整数1&…

python的集合

定义 集合&#xff08;是一个无序的、不包含重复元素的集合。集合对象支持数学上的标准集合操作&#xff0c;如并集、交集、差集等。&#xff09; 创建集合 添加元素 删除元素 遍历 其他 union() 或 |&#xff1a;返回两个集合的 并集intersection() 或 &&#xff1a;返回…

关于共享盘(文件夹)

1、创建共享文件夹或共享盘 对应文件或盘-》右键-》属性-》共享或高级共享 2、设置权限来针对不同的用户进行访问 2.1 关于用户的添加 电脑->计算机管理->添加用户和组 2.2 本地用户 在属性的安全之中&#xff0c;可针对不同的用户和组进行权限设置&#xff0c;例如某…

MYSQL--第七次作业

MYSQL–第七次作业 在product表上创建三个触发器。每次激活触发器后&#xff0c;都会更新operate表。product表和表的内容如下 Product表内容 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 产品编号 Int(10) 是 否 是 是 否 Name …

iPad锁屏密码忘记怎么办?有什么方法可以解锁?

当我们在日常使用iPad时&#xff0c;偶尔可能会遇到忘记锁屏密码的尴尬情况。这时&#xff0c;不必过于担心&#xff0c;因为有多种方法可以帮助您解锁iPad。接下来&#xff0c;小编将为您详细介绍这些解决方案。 一、使用iCloud的“查找我的iPhone”功能 如果你曾经启用了“查…

Nginx:关于实现跨域代理

运维专题 Nginx&#xff1a;关于实现跨域代理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.ne…

openWrt(3) - ubus (下)

参考自: [OpenWrt Wiki] ubus&#xff08;OpenWrt微总线架构&#xff09; --- [OpenWrt Wiki] ubus (OpenWrt micro bus architecture) ubus补充 查看注册到 ubusd 的所有服务的所有方法&#xff1a; ubus -v list system 调用远程方法并接收回复。回复可以是简单的整数返回…

超声波清洗机哪个牌子好?耐用的超声波眼镜清洗机推荐

超声波清洗机大家也一定不陌生了&#xff0c;提起超声波清洗机啊&#xff0c;大家对他的印象一定是清洗眼镜&#xff0c;这话没毛病&#xff0c;但是&#xff0c;这仅仅只是清洗机的基本功&#xff0c;清洗机的功能远远比咱们想象中的强大&#xff0c;但是目前市面上的小型超声…

基于RHCE基础搭建简单服务

目录 项目标题与需求一 配置IP地址server机node02机 二 配置web服务三 搭建dns服务器四 开启防火墙server firewalld 五 配置nfs服务器node02 nfsserver autofs 六 开启SELinux七 验证是否能访问www.rhce.com 项目标题与需求 项目标题&#xff1a; 项目需求&#xff1a; 现有…

眼镜清洗机哪款好用?眼镜党必备四款高性价比热门清洗机

戴眼镜的朋友应该深有体会&#xff0c;每次去眼镜店给眼镜“洗个澡”&#xff0c;重新戴上眼镜那一刻是不是觉得眼前的事物特别清晰&#xff0c;镜片也变得清澈透明。但是每次都得跑眼镜店&#xff0c;不仅耗时还费精力。这个时候&#xff0c;家用眼镜清洗机就显得特别有用了。…

MongoDB教程(四):mongoDB索引

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…

软文推广小白进阶高手之路,这几招让你事半功倍

在数字营销的大潮中&#xff0c;软文推广作为一种润物细无声的营销手段&#xff0c;越来越受到企业和个人的青睐。对于初入此道的小白而言&#xff0c;想要从懵懂探索到游刃有余&#xff0c;其实并不遥远。今日投媒网就来与您分享掌握以下几招&#xff0c;让你的软文推广之路便…

Vxe UI vxe-table column 根据内容的长度来自适应列的宽度

Vxe UI vue vxe-table 根据内容的长度来自适应列的宽度 列的 width 宽度支持多种格式&#xff08;默认情况下是等比例分配&#xff09;&#xff1a; 固定像素&#xff1a;100 或者 ‘100px’ 百分比&#xff1a;‘20%’ 自适应内容&#xff1a;‘auto’ 代码 <template&g…

如何检测代理IP是否有效?检查因素与方法全解

代理IP是一种网络代理技术&#xff0c;它是通过中间服务器来转发网络请求的IP地址。当我们使用代理IP时&#xff0c;我们的真实IP地址会被隐藏起来&#xff0c;而代理服务器的IP地址会被用作我们的身份标识。使用代理IP的步骤如下&#xff1a; 1.选择合适的代理服务器 考虑服务…

2024年最新PyCharm保姆级安装教程

PyCharm是一款专为Python开发者设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在帮助用户在使用Python语言开发时提高效率。 PyCharm作为一款强大的Python IDE&#xff0c;其主要作用在于提供了一整套可以帮助Python开发者提高开发效率的工具。这些工具包括但不…

Python转换PDF为PowerPoint演示文件

PDF文件以其跨平台兼容性和版面固定性成为了分享和存储文档资料的首选格式。然而&#xff0c;在需要进行生动、互动性强的演示时&#xff0c;PDF的静态特性便难以满足个性化演示需求。将PDF文件转换为PowerPoint演示文稿可以解决这一问题。PowerPoint不仅提供了丰富的动画和过渡…