分布式存储快速入门
文章目录
一、概要介绍
1.1 什么是分布式存储
分布式存储是一种存储架构,它将数据分布在多个独立的存储设备或节点上,而这些设备或节点通过网络互联,协同工作来提供数据存储和访问服务。与传统的集中式存储系统不同,分布式存储系统不依赖于单一的存储设备或服务器,而是通过多个设备的协同工作来提高数据存储的可靠性、可扩展性和性能。
在分布式存储系统中,数据通常会被分割成多个部分(例如块或片段),并分别存储在不同的节点上。这种方式不仅可以提高存储系统的总体容量,还可以通过数据冗余和副本机制来增强系统的容错能力和数据可用性。
1.2 分布式存储的重要性和应用场景
分布式存储通过将数据分布在多个节点上,实现了高可用性、容错性和可扩展性,显著提升了存储系统的性能和可靠性,且成本效益高。它在大数据处理、云存储、内容分发网络(CDN)、企业级存储、数据备份与恢复以及边缘计算等场景中得到广泛应用,支持高效的大规模数据管理和处理。
本篇文章主要讲解分布式存储中的HDFS,重点在于hadoop HA+Federation以及Ambari,因为在实际的生产中,一般都不会仅仅只使用其基础功能,为了提高效率以及实现高可用,往往都会使用其高级功能。
重要性:
- 高可用性和容错性:分布式存储通过数据冗余和副本机制,可以在某些节点出现故障时仍然保持数据的可用性。这种机制极大地提高了系统的可靠性和容错能力。
- 可扩展性:分布式存储系统可以轻松扩展,通过增加更多的存储节点来扩展存储容量和处理能力,适应数据量不断增长的需求。
- 高性能:分布式存储利用多节点并行处理数据请求,能够提供高吞吐量和低延迟的数据访问性能,特别适合大规模数据处理和高并发访问场景。
- 成本效益:分布式存储可以使用廉价的通用硬件,降低了硬件成本。通过横向扩展,可以逐步增加存储容量,避免了大规模集中式存储系统初期建设的高昂成本。
- 数据本地性:分布式存储系统通常会将数据存放在靠近计算节点的位置,减少数据传输的延迟,提高数据处理效率。
应用场景:
- 大数据处理:如Hadoop和Spark等大数据处理框架,依赖于分布式存储系统(如HDFS)来存储和管理大规模数据集,支持大数据分析、数据挖掘和机器学习等任务。
- 云存储:云存储服务(如Amazon S3、Google Cloud Storage、Microsoft Azure Blob Storage)利用分布式存储技术,为用户提供大规模、高可用的存储解决方案,支持文件存储、对象存储和块存储等多种存储方式。
- 内容分发网络(CDN):CDN通过分布式存储技术,将内容缓存到多个地理位置的节点,提升内容分发的速度和可靠性,减少用户访问的延迟。
- 企业级存储:企业级分布式存储解决方案(如Ceph、GlusterFS)为企业提供可靠、高效的存储服务,支持各种应用场景,如数据库、虚拟化、容器化环境等。
- 数据备份和恢复:分布式存储系统可以实现高效的数据备份和恢复,通过数据复制和快照技术,保障数据的安全性和可恢复性。
- 边缘计算:在边缘计算环境中,分布式存储系统可以将数据存储和处理能力分布到靠近数据源的边缘节点,降低数据传输延迟,提升实时数据处理能力。
分布式存储技术在当今数据驱动的世界中,扮演着至关重要的角色,为各种规模和类型的应用提供可靠、可扩展、高性能的存储解决方案。
二、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的核心管理节点,负责整个文件系统的元数据管理。它的主要职责包括:
- 元数据管理:NameNode存储HDFS文件系统的元数据,包括文件和目录的结构、权限、块映射(即文件被分割成的块及其所在的DataNode)、副本信息等。这些元数据通常存储在NameNode的内存中,以确保高效的访问速度。
- 客户端请求处理:当客户端发起文件操作请求(如读、写、删除等)时,NameNode会解析请求并提供相应的元数据信息。例如,在读取文件时,NameNode会返回文件块所在的DataNode列表;在写入文件时,NameNode会指定新的块存储位置。
- 数据块管理:NameNode负责管理HDFS中的数据块,确保每个块的副本数量满足配置要求。如果检测到某个块的副本丢失或不足,NameNode会触发副本的重新复制操作。
- 故障检测和恢复:NameNode持续监控DataNode的状态。如果检测到某个DataNode故障,NameNode会将该节点标记为失效,并在其他健康节点上重新复制其数据块,确保数据的可靠性。
DataNode是HDFS的工作节点,负责实际的数据存储和管理。每个DataNode在本地存储HDFS的数据块,并定期向NameNode汇报其状态和所存储的块信息。DataNode的主要职责包括:
- 数据存储:DataNode将接收到的文件块存储在本地文件系统中,并按照NameNode的指示执行数据读写操作。
- 块汇报:DataNode定期向NameNode发送心跳信息和块报告,包含当前存储的块列表和状态信息。NameNode通过这些信息监控DataNode的健康状态和数据块分布情况。
- 数据传输:在文件写入过程中,DataNode会根据NameNode的指示与其他DataNode协同工作,执行数据块的复制操作,确保数据的副本分布在不同的节点上。
- 数据校验和恢复:DataNode定期对存储的数据块进行校验,检测是否存在数据损坏,并在必要时从其他DataNode获取正确的数据副本进行恢复。
Secondary NameNode并不是NameNode的备份节点,而是一个辅助节点,主要用于帮助NameNode管理元数据日志(Edit Log)的合并工作,防止Edit Log过度膨胀。Secondary NameNode的主要职责包括:
- Checkpoint合并:Secondary NameNode定期从NameNode获取当前的元数据快照(FsImage)和Edit Log,执行合并操作,生成新的FsImage。这有助于减少NameNode启动时需要重放的日志条目数量,提高系统的恢复速度。
- 数据备份:合并生成的新FsImage会被传回NameNode,替换旧的FsImage。同时,Secondary NameNode会保留一个副本,以便在NameNode发生故障时作为参考使用。
- 降低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存储的基本单位,有以下特性和优点:
- 固定大小:默认情况下,每个块的大小为128MB,但可以根据需求进行配置。固定大小的块便于管理和分配存储空间。
- 分布式存储:文件块分布在不同的DataNode上,这种分布式存储方式提高了系统的并行处理能力和数据访问效率。
- 独立管理:每个数据块独立管理,这意味着即使单个块或DataNode发生故障,其他块仍然可以正常工作,从而增强了系统的容错能力。
- 简化存储管理:大文件被分成多个块存储在不同节点上,便于扩展和管理,同时也减少了文件系统管理的复杂性。
为了保证数据的可靠性和高可用性,HDFS对每个数据块进行复制,存储多个副本。副本机制的主要特点包括:
- 默认副本数:HDFS默认每个块有3个副本,可以根据需求进行配置。副本数的增加可以提高数据的可靠性,但也会占用更多的存储空间。
- 副本存放策略:副本通常分布在不同的DataNode和机架(Rack)上,以防止单点故障或单机架故障造成的数据丢失。例如,默认情况下,第一个副本存储在写入的DataNode上,第二个副本存储在同一机架的不同DataNode上,第三个副本存储在不同机架的DataNode上。
- 副本管理:NameNode负责管理数据块的副本信息,并监控副本的状态。如果某个副本丢失或损坏,NameNode会触发重新复制,确保副本数达到预定要求。
- 读写操作优化:副本分布在多个节点上,客户端在读取数据时可以选择最近的副本,从而优化数据访问的性能;在写入数据时,可以同时写入多个副本,提高写入效率。
Rack Awareness是HDFS中一种用于提高数据可靠性和网络效率的策略,它考虑了数据节点的机架位置,具体来说:
- 机架拓扑感知:HDFS可以感知集群中各个DataNode所在的机架,通过配置拓扑脚本(topology script),管理员可以定义机架结构,使NameNode了解每个DataNode所在的机架。
- 数据分布策略:利用机架感知信息,HDFS在存储数据块副本时会将它们分布在不同的机架上。通常情况下,一个副本存储在本地节点,一个副本存储在同一机架的不同节点,另一个副本存储在不同机架的节点上。这种策略可以减少单机架故障带来的风险,提高数据的可靠性。
- 网络效率:通过机架感知,HDFS可以优化网络带宽的使用。在同一机架内传输数据通常比跨机架传输更快且成本更低。因此,尽可能在同一机架内存储副本,可以减少网络传输延迟和带宽消耗,提高数据访问性能。
- 故障恢复:在某个节点或机架发生故障时,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 环境准备
- 安装好虚拟机,准备三台虚拟机(Centos),网络选择NAT模式
master 192.168.10.11
slave1 192.168.10.12
slave2 192.168.10.13
- 设置主机名
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
用命令hostname 查看
- 设置网络IP
vi /etc/sysconfig/network-scripts/ifcfg-ens33
分别设置为:192.168.10.11、192.168.10.12、192.168.10.13
- 添加主机名和IP映射关系
每台机器都添加
vi /etc/hosts
用来简化网络访问,提高网络通信的效率,同时增强网络的稳定性
192.168.10.11 master
192.168.10.12 slave1
192.168.10.13 slave2
- 关闭防火墙
每台机器设置
- 查看:
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
- 设置免密登录
生成 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
- 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
- 拷贝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
- 格式化及启动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
- 测试,查看集群,活动节点是否有两个。
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模式的基础上做了部分调整。
中心组件
- NameNode HA:
- Active NameNode: 处理所有的客户端请求。
- Standby NameNode: 镜像Active NameNode的状态,以便在Active NameNode失败时快速接管。
- JournalNodes: 集群中的一组节点,用于存储NameNode的编辑日志(Edit Logs),确保两个NameNode之间的数据一致性。
- ZKFC (ZooKeeper Failover Controller): 使用ZooKeeper来监控NameNode的健康状态,并在需要时触发failover过程。
- ResourceManager HA:
- Active ResourceManager: 管理集群中的资源分配和任务调度。
- Standby ResourceManager: 在Active ResourceManager失败时接管其职责。
- ZooKeeper: 用于协调ResourceManager之间的状态,确保HA的实现。
Federation 组件
- 多个namespace:
- 在Federation架构中,Hadoop集群可以支持多个命名空间(Namespaces),每个命名空间都由一对NameNode管理(一个Active,一个Standby)。
- 每个命名空间都代表了一个逻辑上的Hadoop集群,拥有自己的HDFS实例和MapReduce作业队列。
- 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 /hom