contos7.9 部署3节点 hadoop3.4 集群 非高可用
contos7.9 部署3节点 hadoop3.4 集群 非高可用
- contos7.9 部署3节点 hadoop3.4 集群 非高可用
- 环境信息
- 服务器角色分配
- 服务器配置
- 服务器配置初始化 `init_server.sh`
- 配置主机名映射
- 所有节点配置 hosts文件
- 配置免密登录
- hadoop 安装环境配置
- 下载安装包
- 下载 jdk1.8
- hadoop3.4
- 分发安装包
- 安装jdk1.8 `install_jdk.sh`
- 安装 hadoop3.4
- 部署 hadoop3.4 运行环境 `env_hadoop.sh`
- 配置 Hadoop3.4 核心文件
- `core-site.xml`
- 所有节点上配置
- `hdfs-site.xml`
- 在NameNode节点(hadoop-0001)上配置:
- 在DataNode节点(hadoop-0002和hadoop-0003)上:
- `yarn-site.xml`
- 在ResourceManager节点(hadoop-0001)上:
- 在NodeManager节点(hadoop-0002)上:
- 在NodeManager节点(hadoop-0003)上:
- `mapred-site.xml`
- 在所有节点上(因为MapReduce客户端可能需要在任何节点上运行):
- 写入works文件
- 在NameNode节点(hadoop-0001)上配置:
- 启动 hadoop 集群
- 给 hadoop 用户授权并设置免密登录
- 在 NameNode 节点格式化 HDFS(**对于新集群或重新格式化**)
- 启动 HDFS 的守护进程
- 启动 YARN 守护进程
- 查看集群状态
- 关闭 hadoop 集群
- 先停止 YARN 守护进程
- 再停止 HDFS 守护进程
- 补充不使用 works 文件的单独启动
- 对于hdfs节点
- 对应yarn节点
- WebAppProxy 服务器
- MapReduce JobHistory Server
- 补充不使用 works 文件的单独关闭
- 对于hdfs节点
- 对应yarn节点
- 停止 WebAppProxy 服务器
- MapReduce JobHistory Server
- 集群扩容
- 新增一台 datanode 节点
- 服务器配置
- 服务器配置初始化
- 安装jdk
- 安装 hadoop
- 配置hadoop
- `core-site.xml`
- `hdfs-site.xml`
- `yarn-site.xml`
- `mapred-site.xml`
- 配置 works文件
- 启动 hadoop 集群新节点
- 启动 hdfs 守护进程
- 启动 yarn 守护进程(启动 NodeManager)
- 查看集群状态
- 再次停止四节点集群
- 停止 yarn 守护进程
- 停止 hdfs 守护进程
- 缩容集群
- 减少一台 datanode 节点
- 确认数据副本
- 进入安全模式
- 修改配置添加黑名单
- 配置黑名单文件 `hosts.exclude`
- 刷新集群
- 确认退役状态
- 停止 DataNode
- 从配置中移除节点 hadoop-0004
- 清理节点
- 退出安全模式
- Balancer 操作(可选)
- 从配置中移除节点 hadoop-0004
- 清理节点
- 退出安全模式
- Balancer 操作(可选)
contos7.9 部署3节点 hadoop3.4 集群 非高可用
环境信息
服务器 | IP地址 | 配置 | 系统 | jdk | hadoop |
---|---|---|---|---|---|
hadoop-0001 | 192.168.0.141 | 2C4G | CentOS 7.9 64bit | jdk-8u421-linux-x64.tar.gz | hadoop-3.4.0.tar.gz |
hadoop-0002 | 192.168.0.222 | 2C4G | CentOS 7.9 64bit | jdk-8u421-linux-x64.tar.gz | hadoop-3.4.0.tar.gz |
hadoop-0003 | 192.168.0.252 | 2C4G | CentOS 7.9 64bit | jdk-8u421-linux-x64.tar.gz | hadoop-3.4.0.tar.gz |
服务器角色分配
服务器 | 角色 | |
---|---|---|
hadoop-0001 | NameNode 和 ResourceManager,都作为 DataNode 和 NodeManager | NameNode通常单独主机,ResourceManager通常单独主机 |
hadoop-0002 | Secondary NameNode,都作为 DataNode 和 NodeManager | Secondary NameNode非NameNode主机 |
hadoop-0003 | 都作为 DataNode 和 NodeManager | NodeManager运行在每个DataNode节点上 |
服务器配置
服务器配置初始化 init_server.sh
#!/bin/bash
# 清理旧的YUM源
rm -rf /etc/yum.repos.d/*.repo
# 下载华为云内部使用的YUM源文件
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.myhuaweicloud.com/repo/CentOS-Base-7.repo
# 清理YUM缓存并重新生成
yum clean all
yum makecache
# 安装常用软件包
yum install -y net-tools lftp rsync psmisc vim-enhanced tree vsftpd bash-completion createrepo lrzsz iproute
# 停止不需要的服务
systemctl stop postfix atd tuned
# 卸载不需要的软件包
yum remove -y postfix at audit tuned kexec-tools firewalld-*
# 修改cloud配置文件,注释掉manage_etc_hosts: localhost这一行
sed -i '/manage_etc_hosts: localhost/s/^/#/' /etc/cloud/cloud.cfg
# 检查SELinux状态,确保其为Disabled
SELINUX_STATUS=$(getenforce)
if [ "$SELINUX_STATUS" != "Disabled" ]; then
echo "SELinux is not disabled. Please disable SELinux before running this script."
exit 1
fi
# 检查防火墙状态,确保firewalld未启用
FIREWALLD_STATUS=$(systemctl is-active --quiet firewalld)
if [ "$FIREWALLD_STATUS" == "active" ]; then
echo "Firewalld is active. Please stop and disable firewalld before running this script."
exit 1
fi
# 重启服务器
echo "Rebooting the server..."
reboot
bash init_server.sh
配置主机名映射
所有节点配置 hosts文件
[root@hadoop-0001 ~]# cat /etc/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
# 把127.0.0.1对应的 主机名这行删掉
192.168.0.141 hadoop-0001
192.168.0.222 hadoop-0002
192.168.0.252 hadoop-0003
for i in 192.168.0.141 192.168.0.222 192.168.0.252; do scp /etc/hosts $i:/etc/hosts; done
配置免密登录
[root@hadoop-0001 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Cs7KQUaKcghgPJ5HhTjQOf9auz4O4eliH2D7JjUvzus root@hadoop-0001
The key's randomart image is:
+---[RSA 2048]----+
|=o..o. |
|o=+o |
|o *o |
|o* .. |
|= B o. S |
|.= *o+o. |
| o.B=.. |
| .+*+o+ |
| .oBE=+o |
+----[SHA256]-----+
[root@hadoop-0001 ~]# for i in 192.168.0.141 192.168.0.222 192.168.0.252; do ssh-copy-id $i; done
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.0.141 (192.168.0.141)' can't be established.
ECDSA key fingerprint is SHA256:lVwPW/z6UMHejWxQHICQD8bn/7zfKDTRwRT81GWSm9M.
ECDSA key fingerprint is MD5:7b:3d:d4:09:49:05:6a:f2:b3:60:c5:97:52:f5:4f:1e.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.141's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.0.141'"
and check to make sure that only the key(s) you wanted were added.
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.222's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.0.222'"
and check to make sure that only the key(s) you wanted were added.
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.252's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.0.252'"
and check to make sure that only the key(s) you wanted were added.
hadoop 安装环境配置
下载安装包
华为镜像站点:华为开源镜像站_软件开发服务_华为云
下载 jdk1.8
hadoop支持的jdk版本:Hadoop Java 版本 - Hadoop - Apache Software Foundation
支持的 Java 版本
Apache Hadoop 3.3 及更高版本支持 Java 8 和 Java 11(仅限运行时)
请使用 Java 8 编译 Hadoop。不支持使用 Java 11 编译 Hadoop: 哈多普-16795 - Java 11 编译支持 打开
Apache Hadoop 从 3.0.x 到 3.2.x 现在仅支持 Java 8
从 2.7.x 到 2.10.x 的 Apache Hadoop 同时支持 Java 7 和 8
Linux x64 Compressed Archive | 139.93 MB | jdk-8u421-linux-x64.tar.gz |
---|---|---|
hadoop-3.4.0.tar.gz |
hadoop3.4
下载二进制包
Apache Download Mirrors
https://dlcdn.apache.org/hadoop/common/hadoop-3.4.0/hadoop-3.4.0.tar.gz
分发安装包
curl -o hadoop-3.4.0.tar.gz https://dlcdn.apache.org/hadoop/common/hadoop-3.4.0/hadoop-3.4.0.tar.gz
for i in 192.168.0.222 192.168.0.252; do scp hadoop-3.4.0.tar.gz jdk-8u421-linux-x64.tar.gz install_jdk.sh root@$i:/root/; done
安装jdk1.8 install_jdk.sh
#!/bin/bash
# 定义变量
JDK_TAR_GZ="$1"
PROFILE_BACKUP="/etc/profile.bak.$(date +%F-%T)"
JDK_INSTALL_DIR=""
INSTALLED_JDK_VERSION=""
# 错误处理逻辑
handle_error() {
echo "[ERROR] - [$(date +'%Y-%m-%d %H:%M:%S')] - $1" >&2
exit 1
}
# 提示信息处理逻辑
handle_info() {
echo "[INFO] - [$(date +'%Y-%m-%d %H:%M:%S')] - $1"
}
handle_warning() {
echo "[WARNING] - [$(date +'%Y-%m-%d %H:%M:%S')] - $1"
}
# 检查是否传入了参数
if [[ -z "$JDK_TAR_GZ" ]]; then
handle_error "未传入JDK安装包的文件名作为参数。用法:$0 jdk-文件名.tar.gz"
fi
# 检查JDK安装包是否在当前目录
if [[ ! -f "$JDK_TAR_GZ" ]]; then
handle_error "未在当前目录找到JDK安装包 $JDK_TAR_GZ。"
fi
# 检查是否已经安装了JDK并获取版本
if command -v java &> /dev/null; then
INSTALLED_JDK_VERSION=$(java -version 2>&1 | head -n 1 | awk -F'[ "]+' '{print $3}')
INSTALLED_JDK_VERSION_MAJOR_MINOR=$(echo "$INSTALLED_JDK_VERSION" | cut -d. -f1-2)
handle_info "已安装的JDK版本信息如下:"
java -version
if [[ "$INSTALLED_JDK_VERSION_MAJOR_MINOR" != "1.8" ]]; then
handle_info "警告:已安装的JDK版本不是1.8,而是 $INSTALLED_JDK_VERSION。"
# 提供卸载非JDK 1.8版本的指导
if rpm -qa | grep -q "jdk|java"; then
handle_info "发现通过rpm安装的JDK,可以使用以下命令卸载:"
handle_info "rpm -e --nodeps $(rpm -qa | grep -E 'jdk|java')"
elif yum list installed | grep -q "jdk|java"; then
handle_info "发现通过yum安装的JDK,可以使用以下命令卸载:"
handle_info "yum remove $(yum list installed | grep -E 'jdk|java' | awk '{print $1}')"
else
handle_info "无法确定JDK的安装方式,可能需要手动卸载。请查找相关安装文档。"
fi
read -p "是否继续安装新版本的JDK?(y/n): " choice
if [[ "$choice" != "y" && "$choice" != "Y" ]]; then
handle_info "取消安装。"
exit 0
fi
fi
else
handle_info "未检测到JDK安装。"
fi
# 备份/etc/profile
handle_info "开始备份/etc/profile到$PROFILE_BACKUP"
cp /etc/profile "$PROFILE_BACKUP" || handle_error "Failed to create backup of /etc/profile."
handle_info "备份/etc/profile完成"
# 解压JDK安装包
handle_info "开始解压JDK安装包 $JDK_TAR_GZ 到 /usr/local/"
tar -xzf "$JDK_TAR_GZ" -C /usr/local/ || handle_error "Failed to extract $JDK_TAR_GZ file."
handle_info "解压JDK安装包完成"
# 获取解压后的JDK目录名(使用find命令提高健壮性)
JDK_DIRS=($(find /usr/local/ -maxdepth 1 -type d -name "jdk[0-9]*.[0-9]*.[0-9]*_[0-9]*" 2>/dev/null))
if [[ ${#JDK_DIRS[@]} -eq 0 ]]; then
handle_error "未找到解压后的JDK目录。"
elif [[ ${#JDK_DIRS[@]} -gt 1 ]]; then
handle_warning "警告:发现多个可能的JDK目录,选择第一个(${JDK_DIRS[0]}):"
for dir in "${JDK_DIRS[@]}"; do
handle_warning " $dir"
done
fi
JDK_INSTALL_DIR="${JDK_DIRS[0]}"
# 将环境变量写入/etc/profile
handle_info "开始将环境变量写入/etc/profile"
{
echo ""
echo "export JAVA_HOME=$JDK_INSTALL_DIR"
echo "export PATH=\$JAVA_HOME/bin:\$PATH"
} >> /etc/profile
handle_info "环境变量写入/etc/profile完成"
# 为了使更改立即生效,对当前会话加载新的环境变量(对后续登录用户无效)
handle_info "/etc/profile 是在用户登录时由系统读取的,因此任何对 /etc/profile 的更改都需要用户重新登录或手动重新加载(如使用 source /etc/profile)才能生效。"
source /etc/profile || handle_error "Failed to source /etc/profile."
# 验证JDK安装是否成功
if java -version 2>&1; then
handle_info "JDK安装成功,版本信息如下:"
java -version
handle_info "安装和配置已完成。环境变量已写入/etc/profile。"
handle_info "对于当前用户,为了使更改立即生效,请执行'source /etc/profile'。"
handle_info "对于后续登录的用户,新的环境变量将在他们登录时自动生效。"
else
handle_error "JDK安装验证失败。请检查JDK是否正确安装以及环境变量设置是否正确。"
fi
bash install_jdk.sh
#source /etc/profile
安装 hadoop3.4
部署 hadoop3.4 运行环境 env_hadoop.sh
#!/bin/bash
# 错误处理逻辑
handle_error() {
echo "[ERROR] - [$(date +'%Y-%m-%d %H:%M:%S')] - $1" >&2
exit 1
}
# 提示信息处理逻辑
handle_info() {
echo "[INFO] - [$(date +'%Y-%m-%d %H:%M:%S')] - $1"
}
# 检查并获取 Hadoop tar.gz 文件参数
check_hadoop_tar_gz() {
local HADOOP_TAR_GZ="$1"
if [ -z "$HADOOP_TAR_GZ" ]; then
handle_error "No Hadoop tar.gz file provided!"
elif [ ! -f "$HADOOP_TAR_GZ" ]; then
handle_error "Hadoop tar.gz file not found!"
fi
}
# 创建必要的目录
create_directories() {
mkdir -p /data/hadoop/{hadoop_soft,hadoop_data/{tmp,hdfs/{namenode,datanode}}}
# 输出创建的目录
for dir in /data/hadoop/{hadoop_soft,hadoop_data/{tmp,hdfs/{namenode,datanode}}}; do
handle_info "Created directory: $dir"
done
handle_info "Directories created successfully."
}
# 解压 Hadoop tar.gz 文件
extract_hadoop() {
local HADOOP_TAR_GZ="$1"
tar -xf "$HADOOP_TAR_GZ" -C /data/hadoop/hadoop_soft/ || handle_error "Failed to extract $HADOOP_TAR_GZ file."
handle_info "Hadoop extracted successfully."
}
# 更新 /etc/profile
update_profile() {
local BACKUP_FILE="/etc/profile.bak.$(date +%F-%H%M%S)"
cp /etc/profile "$BACKUP_FILE" || handle_error "Failed to create backup of /etc/profile."
cat << EOF >> /etc/profile
export HADOOP_HOME=$(ls -d /data/hadoop/hadoop_soft/hadoop-* | head -n 1)
export HADOOP_CONF_DIR=\$HADOOP_HOME/etc/hadoop
export PATH=\$PATH:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin
EOF
source /etc/profile || handle_error "Failed to source /etc/profile."
# 检查环境变量是否设置成功(可选)
if [ -z "${HADOOP_HOME-}" ]; then
handle_error "HADOOP_HOME environment variable not set!"
fi
handle_info "Hadoop environment variables have been set."
}
# 备份并更新 Hadoop 配置文件
backup_and_update_hadoop_config() {
cd $(ls -d /data/hadoop/hadoop_soft/hadoop-* | head -n 1)/etc/hadoop || handle_error "Failed to change directory to Hadoop config directory."
for file in core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml; do
cp "$file" "${file}.$(date +%F-%H%M%S).bak" || handle_error "Failed to backup $file."
done
cp hadoop-env.sh hadoop-env.sh.$(date +%F-%H%M%S).bak || handle_error "Failed to backup hadoop-env.sh."
cat << EOF >> hadoop-env.sh
export HDFS_NAMENODE_USER="hadoop"
export HDFS_DATANODE_USER="hadoop"
export HDFS_SECONDARYNAMENODE_USER="hadoop"
export JAVA_HOME=/usr/local/jdk1.8.0_421
EOF
# 检查 hadoop 用户是否存在
if ! id "hadoop" &>/dev/null; then
# 用户不存在,创建用户并设置密码
useradd hadoop || handle_error "Failed to create hadoop user."
# 注意:出于安全考虑,不建议在脚本中直接设置简单密码。
echo "hadoop:hadoop" | chpasswd || handle_error "Failed to set password for hadoop user."
handle_info "Hadoop user created and password set."
else
handle_info "Hadoop user already exists."
fi
# 更新 Hadoop 配置文件
handle_info "Hadoop configuration files have been updated."
}
# 警告信息处理逻辑
handle_warning() {
echo "[WARNING] - [$(date +'%Y-%m-%d %H:%M:%S')] - $1"
}
# 主流程
check_hadoop_tar_gz "$1"
create_directories
extract_hadoop "$1"
update_profile
backup_and_update_hadoop_config
handle_info "Hadoop environment setup completed successfully."
[root@hadoop-0001 ~]# for i in 192.168.0.222 192.168.0.252; do scp env_hadoop.sh root@$i:/root/; done
# 所有节点执行
bash env_hadoop.sh hadoop-3.4.0.tar.gz
配置 Hadoop3.4 核心文件
在所有节点上配置 core-site.xml
、 hdfs-site.xml
、 yarn-site.xml
、 mapred-site.xml
core-site.xml
所有节点上配置
文件包含了集群使用的核心配置,包括文件系统的默认设置和 I/O 缓冲区大小。
<configuration>
<!-- 设置Hadoop文件系统的默认名称,即NameNode的URI -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-0001:9000</value> <!-- 指定NameNode所在的主机名和端口号 或者使用IP地址:hdfs://192.168.0.141:9000 -->
</property>
<!-- 设置Hadoop临时目录的路径,用于存储临时文件 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/hadoop_data/tmp</value> <!-- 临时文件存储的本地目录 -->
</property>
<!-- 设置文件I/O操作的缓冲区大小 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value> <!-- 缓冲区大小,单位字节 -->
</property>
</configuration>
[root@hadoop-0001 hadoop]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0001 hadoop]# vim core-site.xml
[root@hadoop-0001 hadoop]# for i in 192.168.0.222 192.168.0.252; do scp core-site.xml root@$i:/data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop; done
hdfs-site.xml
文件包含了 HDFS 的特定配置,包括 NameNode 和 DataNode 的存储目录以及数据复制的策略。
在NameNode节点(hadoop-0001)上配置:
<configuration>
<!-- 设置NameNode存储元数据的本地目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/hadoop_data/hdfs/namenode</value> <!-- NameNode元数据目录 -->
</property>
<property>
<name>dfs.namenode.rpc-address</name>
<value>hadoop-0001:9000</value> <!-- 或者直接使用IP地址:192.168.0.141:9000 -->
</property>
<!-- 设置Secondary NameNode检查点数据的本地目录(可选,通常Secondary NameNode与NameNode的配置分开) -->
<!-- 注意:在Hadoop 2.x及更高版本中,Secondary NameNode主要负责合并NameNode的编辑日志,而不是作为备份 -->
<!-- <property>-->
<!-- <name>dfs.namenode.checkpoint.dir</name> <!– 通常不再需要明确配置,Secondary NameNode有其自己的配置方式 –>-->
<!-- <value>/data/hadoop/hadoop_data/hdfs/namesecondary</value> <!– 可选,用于存放检查点数据 –>-->
<!-- </property>-->
<!-- 设置HDFS文件块的复制因子 -->
<property>
<name>dfs.replication</name>
<value>2</value> <!-- 每个文件块在HDFS中的副本数 -->
</property>
<!-- 设置NameNode的HTTP服务地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop-0001:9870</value> <!-- NameNode HTTP服务的主机名和端口号 -->
</property>
<!-- 设置Secondary NameNode的HTTP服务地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop-0001:9868</value> <!-- Secondary NameNode HTTP服务的主机名和端口号 -->
</property>
</configuration>
注意:关于dfs.namenode.checkpoint.dir
的注释,实际上在Hadoop 3.x中,你通常不需要单独为Secondary NameNode配置检查点目录,因为它会自动处理。这里的注释是为了解释该属性在旧版本中的作用,并在实际配置中可能不需要。
[root@hadoop-0001 hadoop]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0001 hadoop]# vim hdfs-site.xml
在DataNode节点(hadoop-0002和hadoop-0003)上:
<configuration>
<!-- 设置DataNode存储数据块的本地目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/hadoop_data/hdfs/datanode</value> <!-- DataNode数据块目录 -->
</property>
<property>
<name>dfs.namenode.rpc-address</name>
<value>hadoop-0001:9000</value> <!-- 或者直接使用IP地址:192.168.0.141:9000 -->
</property>
<!-- 设置HDFS文件块的复制因子(通常在NameNode上配置,但在这里重复以确保一致性) -->
<property>
<name>dfs.replication</name>
<value>2</value> <!-- 每个文件块在HDFS中的副本数 -->
</property>
</configuration>
[root@hadoop-0002 hadoop]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0002 hadoop]# vim hdfs-site.xml
[root@hadoop-0003 hadoop]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0003 hadoop]# vim hdfs-site.xml
yarn-site.xml
在ResourceManager节点(hadoop-0001)上:
<configuration>
<!-- 设置ResourceManager的主机名 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-0001</value> <!-- ResourceManager所在的主机名 -->
</property>
<!-- 设置NodeManager提供的辅助服务,这里是MapReduce所需的shuffle服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value> <!-- 辅助服务名称 -->
</property>
<!-- 设置ResourceManager的Web应用地址 -->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop-0001:8088</value> <!-- ResourceManager Web应用的主机名和端口号,监听所有ip -->
</property>
<!-- 设置YARN的调度器类,这里使用CapacityScheduler -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> <!-- 调度器类名 -->
</property>
<!-- 设置ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop-0001</value> <!-- ResourceManager的主机名 -->
</property>
<!-- 设置ResourceManager调度器的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop-0001</value> <!-- ResourceManager调度器的主机名 -->
</property>
</configuration>
[root@hadoop-0001 hadoop]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0001 hadoop]# vim yarn-site.xml
在NodeManager节点(hadoop-0002)上:
<configuration>
<!-- 设置ResourceManager的主机名 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-0001</value> <!-- ResourceManager所在的主机名 -->
</property>
<!-- 设置ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop-0001</value> <!-- ResourceManager的主机名 -->
</property>
<!-- 设置ResourceManager调度器的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop-0001</value> <!-- ResourceManager调度器的主机名 -->
</property>
<!-- 设置NodeManager提供的辅助服务,这里是MapReduce所需的shuffle服务(与ResourceManager配置一致) -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value> <!-- 辅助服务名称 -->
</property>
<!-- 设置NodeManager可分配给容器的内存大小 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value> <!-- 内存大小,单位MB,根据节点实际内存大小调整,此处给了2G -->
</property>
<!-- 设置NodeManager可分配给容器的虚拟CPU核心数 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value> <!-- 虚拟CPU核心数,根据节点实际CPU核心数调整,此处给了1C -->
</property>
<!-- 设置NodeManager的主机名 -->
<property>
<name>yarn.nodemanager.hostname</name>
<value>hadoop-0002</value> <!-- 对于 hadoop-0002 节点 -->
</property>
<!-- 设置nodemanager的地址 -->
<property>
<name>yarn.nodemanager.address</name>
<value>hadoop-0002</value> <!-- nodemanager的主机名 -->
</property>
</configuration>
[root@hadoop-0002 hadoop]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0002 hadoop]# vim yarn-site.xml
在NodeManager节点(hadoop-0003)上:
<configuration>
<!-- 设置ResourceManager的主机名 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-0001</value> <!-- ResourceManager所在的主机名 -->
</property>
<!-- 设置ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop-0001</value> <!-- ResourceManager的主机名 -->
</property>
<!-- 设置ResourceManager调度器的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop-0001</value> <!-- ResourceManager调度器的主机名 -->
</property>
<!-- 设置NodeManager提供的辅助服务,这里是MapReduce所需的shuffle服务(与ResourceManager配置一致) -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value> <!-- 辅助服务名称 -->
</property>
<!-- 设置NodeManager可分配给容器的内存大小 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value> <!-- 内存大小,单位MB,根据节点实际内存大小调整,此处给了2G -->
</property>
<!-- 设置NodeManager可分配给容器的虚拟CPU核心数 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value> <!-- 虚拟CPU核心数,根据节点实际CPU核心数调整,此处给了1C -->
</property>
<!-- 对于 hadoop-0003 节点,只需将 value 改为 hadoop-0003 -->
<property>
<name>yarn.nodemanager.hostname</name>
<value>hadoop-0003</value>
</property>
<!-- 设置nodemanager的地址 -->
<property>
<name>yarn.nodemanager.address</name>
<value>hadoop-0003</value> <!-- nodemanager的主机名 -->
</property>
</configuration>
[root@hadoop-0003 hadoop]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0003 hadoop]# vim yarn-site.xml
mapred-site.xml
在所有节点上(因为MapReduce客户端可能需要在任何节点上运行):
<configuration>
<!-- 设置MapReduce框架的名称,这里指定为YARN -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value> <!-- 指定MapReduce运行在YARN上 -->
</property>
<!-- <!– 设置MapReduce JobHistory Server的地址(可选,通常与ResourceManager集成) –>-->
<!-- <!– 注意:在Hadoop 3.x中,JobHistory Server通常与ResourceManager集成,因此这些配置可能不是必需的 –>-->
<!-- <property>-->
<!-- <name>mapreduce.jobhistory.address</name> <!– 通常不再需要单独配置 –>-->
<!-- <value>0.0.0.0:10020</value> <!– JobHistory Server的主机名和端口号(如果单独配置) –>-->
<!-- </property>-->
<!-- -->
<!-- <!– 设置MapReduce JobHistory Server的Web应用地址(可选,通常与ResourceManager集成) –>-->
<!-- <property>-->
<!-- <name>mapreduce.jobhistory.webapp.address</name> <!– 通常不再需要单独配置 –>-->
<!-- <value>0.0.0.0:19888</value> <!– JobHistory Server Web应用的主机名和端口号(如果单独配置) –>-->
<!-- </property>-->
</configuration>
[root@hadoop-0001 hadoop]# vim mapred-site.xml
[root@hadoop-0001 hadoop]# for i in 192.168.0.222 192.168.0.252; do scp mapred-site.xml root@$i:/data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop; done
写入works文件
指定哪些主机运行DataNode和NodeManager
在NameNode节点(hadoop-0001)上配置:
写入works文件,workers
文件应该只在主节点上维护一份,用于列出所有参与集群运行的工作节点
[root@hadoop-0001 hadoop-3.4.0]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop
cat workers
hadoop-0001
hadoop-0002
hadoop-0003
for i in 192.168.0.222 192.168.0.252; do scp workers root@$i:/data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop; done
注意:关于mapreduce.jobhistory.address
和mapreduce.jobhistory.webapp.address
的注释,实际上在Hadoop 3.x中,你可能不需要单独配置这些属性,因为JobHistory Server的功能通常已经集成到ResourceManager中。这里的注释是为了解释这些属性在旧版本中的作用,并在实际配置中可能不需要。如果你的集群确实需要单独的JobHistory Server,那么你需要确保它正确配置并运行。
启动 hadoop 集群
给 hadoop 用户授权并设置免密登录
[root@hadoop-0001 ~]# chown -R hadoop:hadoop /data/hadoop/
[root@hadoop-0002 ~]# chown -R hadoop:hadoop /data/hadoop/
[root@hadoop-0003 ~]# chown -R hadoop:hadoop /data/hadoop/
[root@hadoop-0001 ~]# su hadoop
[hadoop@hadoop-0001 root]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:p3BB7jrhPg+3PFN8xdu5a+eHmuStyupGGLg6gCFJiYk hadoop@hadoop-0001
The key's randomart image is:
+---[RSA 2048]----+
|o.. . |
|Eo o |
|.. . o . |
|+ . .. . o |
|o. .ooS.. . o.|
|o ...=.oo . ...|
| . . =.o. .. ..|
| o ..=+o o o.oo|
| . .=*+o.=ooo=|
+----[SHA256]-----+
[hadoop@hadoop-0001 root]$
[hadoop@hadoop-0001 root]$ for i in 192.168.0.141 192.168.0.222 192.168.0.252; do ssh-copy-id $i; done
使用用户 hadoop
在 NameNode 节点格式化 HDFS(对于新集群或重新格式化)
首次启动 HDFS 时,必须对其进行格式化。将新的分布式文件系统格式化为 hdfs
#[hadoop@hadoop-0001 hadoop-3.4.0]$ source /etc/profile
[hadoop@hadoop-0001 hadoop-3.4.0]$ hdfs namenode -format
2024-11-08 23:29:15,654 INFO common.Storage: Storage directory /data/hadoop/hadoop_data/hdfs/namenode has been successfully formatted.
启动 HDFS 的守护进程
如果配置了 ssh 可信访问权限,配置了 etc/hadoop/workers
,则可以使用实用程序脚本启动所有 HDFS 进程。作为 hdfs:etc/hadoop/workers
[hadoop@hadoop-0001 hadoop]$ start-dfs.sh
Starting namenodes on [hadoop-0001]
Starting datanodes
hadoop-0002: WARNING: /data/hadoop/hadoop_soft/hadoop-3.4.0/logs does not exist. Creating.
hadoop-0003: WARNING: /data/hadoop/hadoop_soft/hadoop-3.4.0/logs does not exist. Creating.
Starting secondary namenodes [hadoop-0002]
启动 YARN 守护进程
[hadoop@hadoop-0001 hadoop]$ start-yarn.sh
Starting resourcemanager
Starting nodemanagers
启动 MapReduce JobHistory Server,在指定的 mapred 服务器上(可选)
提供作业历史的查询接口
# 开启
[hadoop@hadoop-0001 hadoop]$ mapred --daemon start historyserver
# 关闭
[hadoop@hadoop-0001 hadoop]$ mapred --daemon stop historyserver
查看集群状态
# 最重要看日志有没有报错
#日志 namenode
#日志 datanode
#日志 resourcemanager
#日志 nodemanager
#日志 secondarynamenode
# 网页查看
http://121.36.222.173:8088/cluster
# 因为没有部署zk,没有实现高可用,所有没有实现HA,显示"Could not find leader elector. Verify both HA and automatic failover are enabled.
[hadoop@hadoop-0001 hadoop]$ curl -s "http://hadoop-0001:8088/ws/v1/cluster/info"
{"clusterInfo":{"id":1731228087052,"startedOn":1731228087052,"state":"STARTED","haState":"ACTIVE","rmStateStoreName":"org.apache.hadoop.yarn.server.resourcemanager.recovery.NullRMStateStore","resourceManagerVersion":"3.4.0","resourceManagerBuildVersion":"3.4.0 from bd8b77f398f626bb7791783192ee7a5dfaeec760 by root source checksum 934da0c5743762b7851cfcff9f8ca2","resourceManagerVersionBuiltOn":"2024-03-04T06:54Z","hadoopVersion":"3.4.0","hadoopBuildVersion":"3.4.0 from bd8b77f398f626bb7791783192ee7a5dfaeec760 by root source checksum f7fe694a3613358b38812ae9c31114e","hadoopVersionBuiltOn":"2024-03-04T06:35Z","haZooKeeperConnectionState":"Could not find leader elector. Verify both HA and automatic failover are enabled."}}[hadoop@hadoop-0001 hadoop]$
# 命令行查看
# 查看 HDFS 的状态,包括数据节点、存储使用情况等信息。
[hadoop@hadoop-0001 hadoop]$ hdfs dfsadmin -report
Configured Capacity: 126421143552 (117.74 GB)
Present Capacity: 96833212416 (90.18 GB)
DFS Remaining: 96833114112 (90.18 GB)
DFS Used: 98304 (96 KB)
DFS Used%: 0.00%
Replicated Blocks:
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
Low redundancy blocks with highest priority to recover: 0
Pending deletion blocks: 0
Erasure Coded Block Groups:
Low redundancy block groups: 0
Block groups with corrupt internal blocks: 0
Missing block groups: 0
Low redundancy blocks with highest priority to recover: 0
Pending deletion blocks: 0
-------------------------------------------------
Live datanodes (3):
Name: 192.168.0.141:9866 (hadoop-0001)
Hostname: hadoop-0001
Decommission Status : Normal
Configured Capacity: 42140381184 (39.25 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 9089748992 (8.47 GB)
DFS Remaining: 31208587264 (29.07 GB)
DFS Used%: 0.00%
DFS Remaining%: 74.06%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Sun Nov 10 16:58:44 CST 2024
Last Block Report: Sun Nov 10 16:40:50 CST 2024
Num of Blocks: 0
Name: 192.168.0.222:9866 (hadoop-0002)
Hostname: hadoop-0002
Decommission Status : Normal
Configured Capacity: 42140381184 (39.25 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 7235203072 (6.74 GB)
DFS Remaining: 33063133184 (30.79 GB)
DFS Used%: 0.00%
DFS Remaining%: 78.46%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Sun Nov 10 16:58:44 CST 2024
Last Block Report: Sun Nov 10 16:40:50 CST 2024
Num of Blocks: 0
Name: 192.168.0.252:9866 (hadoop-0003)
Hostname: hadoop-0003
Decommission Status : Normal
Configured Capacity: 42140381184 (39.25 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 7736942592 (7.21 GB)
DFS Remaining: 32561393664 (30.33 GB)
DFS Used%: 0.00%
DFS Remaining%: 77.27%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Sun Nov 10 16:58:44 CST 2024
Last Block Report: Sun Nov 10 16:51:14 CST 2024
Num of Blocks: 0
# 查看 YARN 节点的状态。
[hadoop@hadoop-0001 hadoop]$ yarn node -list
2024-11-10 16:43:53,668 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop-0001/192.168.0.141:8032
Total Nodes:3
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
hadoop-0003:33976 RUNNING hadoop-0003:8042 0
hadoop-0001:33869 RUNNING hadoop-0001:8042 0
hadoop-0002:41334 RUNNING hadoop-0002:8042 0
# 关于默认队列的一些关键信息,如队列容量、最大容量等
[hadoop@hadoop-0001 hadoop]$ yarn queue -status default
2024-11-10 16:52:02,196 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop-0001/192.168.0.141:8032
Queue Information :
Scheduler Name : CapacityScheduler
Queue Name : default
Queue Path : root.default
State : RUNNING
Capacity : 100.00%
Current Capacity : .00%
Maximum Capacity : 100.00%
Weight : -1.00
Maximum Parallel Apps : 2147483647
Default Node Label expression : <DEFAULT_PARTITION>
Accessible Node Labels : *
Preemption : disabled
Intra-queue Preemption : disabled
# 查看 YARN 应用程序的状态,包括应用程序的状态、用户、队列、启动时间等
# 这个输出表明您的 YARN 集群目前没有任何正在运行、已提交或已接受的应用。这是一个正常的状态,特别是如果您刚刚启动集群或者还没有提交任何作业。
[hadoop@hadoop-0001 hadoop]$ yarn application -list
2024-11-10 16:57:01,829 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop-0001/192.168.0.141:8032
Total number of applications (application-types: [], states: [SUBMITTED, ACCEPTED, RUNNING] and tags: []):0
Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
关闭 hadoop 集群
关闭后再打开,再打开时不是新的集群了,不需要执行格式化操作
先停止 YARN 守护进程
[hadoop@hadoop-0001 hadoop]$ stop-yarn.sh
再停止 HDFS 守护进程
[hadoop@hadoop-0001 hadoop]$ stop-dfs.sh
补充不使用 works 文件的单独启动
对于hdfs节点
使用以下命令在指定为 hdfs 的节点上启动 HDFS NameNode:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
使用以下命令在每个指定为 hdfs 的节点上启动 HDFS DataNode:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
对应yarn节点
使用以下命令启动 YARN,在指定的 ResourceManager 上作为 yarn 运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
运行脚本以 yarn 形式在每个指定的主机上启动 NodeManager:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
WebAppProxy 服务器
启动独立的 WebAppProxy 服务器。在 WebAppProxy 服务器上以 yarn 形式运行。如果多个服务器与负载均衡一起使用,则应在每个服务器上运行:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver
MapReduce JobHistory Server
使用以下命令启动 MapReduce JobHistory Server,在指定的 mapred 服务器上运行:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver
补充不使用 works 文件的单独关闭
对于hdfs节点
使用以下命令停止 NameNode,在指定的 NameNode 上运行 hdfs:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
运行脚本以停止 hdfs 形式的 DataNode:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode
对应yarn节点
使用以下命令停止 ResourceManager,在指定的 ResourceManager 上运行 yarn:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
运行脚本以 yarn 形式停止 worker 上的 NodeManager:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
停止 WebAppProxy 服务器
停止 WebAppProxy 服务器。在 WebAppProxy 服务器上以 yarn 形式运行。如果多个服务器与负载均衡一起使用,则应在每个服务器上运行:
[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver
MapReduce JobHistory Server
使用以下命令停止 MapReduce JobHistory Server,并在指定的服务器上运行,如 mapred:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver
集群扩容
新增一台 datanode 节点
服务器 | IP地址 | 配置 | 系统 | jdk | hadoop | 角色 |
---|---|---|---|---|---|---|
hadoop-0004 | 192.168.0.170 | 2C4G | CentOS 7.9 64bit | jdk-8u421-linux-x64.tar.gz | hadoop-3.4.0.tar.gz | 都作为 DataNode 和 NodeManager |
服务器配置
配置免密登录
[root@hadoop-0001 ~]# ssh-copy-id 192.168.0.170
所有节点配置 hosts文件
# 把127.0.0.1对应的 主机名这行删掉
192.168.0.141 hadoop-0001
192.168.0.222 hadoop-0002
192.168.0.252 hadoop-0003
192.168.0.170 hadoop-0004
[root@hadoop-0001 ~]# for i in 192.168.0.141 192.168.0.222 192.168.0.252 192.168.0.170; do scp /etc/hosts $i:/etc/hosts; done
上传文件
[root@hadoop-0001 ~]# scp hadoop-3.4.0.tar.gz jdk-8u421-linux-x64.tar.gz install_jdk.sh init_server.sh env_hadoop.sh 192.168.0.170:/root
服务器配置初始化
[root@hadoop-0004 ~]# bash init_server.sh
安装jdk
[root@hadoop-0004 ~]# bash install_jdk.sh jdk-8u421-linux-x64.tar.gz
[root@hadoop-0004 ~]# source /etc/profile
安装 hadoop
[root@hadoop-0004 ~]# bash env_hadoop.sh hadoop-3.4.0.tar.gz
配置hadoop
core-site.xml
<configuration>
<!-- 设置Hadoop文件系统的默认名称,即NameNode的URI -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop-0001:9000</value> <!-- 指定NameNode所在的主机名和端口号 或者使用IP地址:hdfs://192.168.0.141:9000 -->
</property>
<!-- 设置Hadoop临时目录的路径,用于存储临时文件 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/hadoop_data/tmp</value> <!-- 临时文件存储的本地目录 -->
</property>
<!-- 设置文件I/O操作的缓冲区大小 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value> <!-- 缓冲区大小,单位字节 -->
</property>
</configuration>
[root@hadoop-0004 ~]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0004 ~]# vim core-site.xml
hdfs-site.xml
<configuration>
<!-- 设置DataNode存储数据块的本地目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/hadoop_data/hdfs/datanode</value> <!-- DataNode数据块目录 -->
</property>
<property>
<name>dfs.namenode.rpc-address</name>
<value>hadoop-0001:9000</value> <!-- 或者直接使用IP地址:192.168.0.141:9000 -->
</property>
<!-- 设置HDFS文件块的复制因子(通常在NameNode上配置,但在这里重复以确保一致性) -->
<property>
<name>dfs.replication</name>
<value>2</value> <!-- 每个文件块在HDFS中的副本数 -->
</property>
</configuration>
[root@hadoop-0004 ~]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0004 ~]# vim hdfs-site.xml
yarn-site.xml
<configuration>
<!-- 设置ResourceManager的主机名 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-0001</value> <!-- ResourceManager所在的主机名 -->
</property>
<!-- 设置ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoop-0001</value> <!-- ResourceManager的主机名 -->
</property>
<!-- 设置ResourceManager调度器的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop-0001</value> <!-- ResourceManager调度器的主机名 -->
</property>
<!-- 设置NodeManager提供的辅助服务,这里是MapReduce所需的shuffle服务(与ResourceManager配置一致) -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value> <!-- 辅助服务名称 -->
</property>
<!-- 设置NodeManager可分配给容器的内存大小 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value> <!-- 内存大小,单位MB,根据节点实际内存大小调整,此处给了2G -->
</property>
<!-- 设置NodeManager可分配给容器的虚拟CPU核心数 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value> <!-- 虚拟CPU核心数,根据节点实际CPU核心数调整,此处给了1C -->
</property>
<!-- 对于 hadoop-0004 节点,只需将 value 改为 hadoop-0004 -->
<property>
<name>yarn.nodemanager.hostname</name>
<value>hadoop-0004</value>
</property>
<!-- 设置nodemanager的地址 -->
<property>
<name>yarn.nodemanager.address</name>
<value>hadoop-0004</value> <!-- nodemanager的主机名 -->
</property>
</configuration>
[root@hadoop-0004 ~]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0004 ~]# vim yarn-site.xml
mapred-site.xml
<configuration>
<!-- 设置MapReduce框架的名称,这里指定为YARN -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value> <!-- 指定MapReduce运行在YARN上 -->
</property>
<!-- <!– 设置MapReduce JobHistory Server的地址(可选,通常与ResourceManager集成) –>-->
<!-- <!– 注意:在Hadoop 3.x中,JobHistory Server通常与ResourceManager集成,因此这些配置可能不是必需的 –>-->
<!-- <property>-->
<!-- <name>mapreduce.jobhistory.address</name> <!– 通常不再需要单独配置 –>-->
<!-- <value>0.0.0.0:10020</value> <!– JobHistory Server的主机名和端口号(如果单独配置) –>-->
<!-- </property>-->
<!-- -->
<!-- <!– 设置MapReduce JobHistory Server的Web应用地址(可选,通常与ResourceManager集成) –>-->
<!-- <property>-->
<!-- <name>mapreduce.jobhistory.webapp.address</name> <!– 通常不再需要单独配置 –>-->
<!-- <value>0.0.0.0:19888</value> <!– JobHistory Server Web应用的主机名和端口号(如果单独配置) –>-->
<!-- </property>-->
</configuration>
[root@hadoop-0004 ~]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0004 ~]# vim mapred-site.xml
配置 works文件
[root@hadoop-0001 hadoop]# cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[root@hadoop-0001 hadoop]# vim workers
hadoop-0001
hadoop-0002
hadoop-0003
hadoop-0004
[root@hadoop-0001 hadoop]# for i in 192.168.0.141 192.168.0.222 192.168.0.252 192.168.0.170; do scp workers $i:/data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/; done
启动 hadoop 集群新节点
# 设置hadoop免密登录新节点
[root@hadoop-0001 ~]# su hadoop
[hadoop@hadoop-0001 hadoop]$ ssh-copy-id 192.168.0.170
# 新节点设置 hadoop 权限
[root@hadoop-0004 ~]# chown -R hadoop:hadoop /data/hadoop/
启动 hdfs 守护进程
[hadoop@hadoop-0004 sbin]$ hdfs --daemon start datanode
启动 yarn 守护进程(启动 NodeManager)
[hadoop@hadoop-0004 sbin]$ yarn --daemon start nodemanager
查看集群状态
# 日志无报错
[hadoop@hadoop-0004 logs]$ less hadoop-hadoop-datanode-hadoop-0004.log
[hadoop@hadoop-0004 logs]$ less hadoop-hadoop-nodemanager-hadoop-0004.log
# 看到 4 个节点
[hadoop@hadoop-0001 hadoop]$ yarn node -list
2024-11-10 18:20:37,147 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop-0001/192.168.0.141:8032
Total Nodes:4
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
hadoop-0003:33976 RUNNING hadoop-0003:8042 0
hadoop-0001:33869 RUNNING hadoop-0001:8042 0
hadoop-0002:41334 RUNNING hadoop-0002:8042 0
hadoop-0004:44057 RUNNING hadoop-0004:8042 0
再次停止四节点集群
关闭后再打开,再打开时不是新的集群了,不需要执行格式化操作
停止 yarn 守护进程
[hadoop@hadoop-0001 hadoop]$ stop-yarn.sh
Stopping nodemanagers
# 这个警告信息是无害的,它只是通知您 SSH 客户端已经更新了 known_hosts 文件。这通常发生在您第一次通过 SSH 连接到一个新的主机时。
hadoop-0004: Warning: Permanently added 'hadoop-0004' (ECDSA) to the list of known hosts.
Stopping resourcemanager
停止 hdfs 守护进程
[hadoop@hadoop-0001 hadoop]$ stop-dfs.sh
Stopping namenodes on [hadoop-0001]
Stopping datanodes
Stopping secondary namenodes [hadoop-0001]
缩容集群
减少一台 datanode 节点
在 Hadoop 集群中移除一个节点通常不会直接导致数据丢失,因为 Hadoop 的 HDFS 设计为高度冗余的分布式文件系统。每个数据块默认会有多个副本(通常是3个),分布在不同的节点上。
确认数据副本
确保所有数据块都有足够数量的副本分布在剩余的节点上。您可以使用以下命令来检查集群的副本分布情况:
[hadoop@hadoop-0001 hadoop]$ hdfs dfsadmin -report
Configured Capacity: 168561524736 (156.99 GB)
Present Capacity: 129906032640 (120.98 GB)
DFS Remaining: 129905901568 (120.98 GB)
DFS Used: 131072 (128 KB)
DFS Used%: 0.00%
Replicated Blocks:
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
Low redundancy blocks with highest priority to recover: 0
Pending deletion blocks: 0
Erasure Coded Block Groups:
Low redundancy block groups: 0
Block groups with corrupt internal blocks: 0
Missing block groups: 0
Low redundancy blocks with highest priority to recover: 0
Pending deletion blocks: 0
-------------------------------------------------
Live datanodes (4):
Name: 192.168.0.141:9866 (hadoop-0001)
Hostname: hadoop-0001
Decommission Status : Normal
Configured Capacity: 42140381184 (39.25 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 9096040448 (8.47 GB)
DFS Remaining: 31202295808 (29.06 GB)
DFS Used%: 0.00%
DFS Remaining%: 74.04%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Sun Nov 10 19:55:41 CST 2024
Last Block Report: Sun Nov 10 18:34:05 CST 2024
Num of Blocks: 0
Name: 192.168.0.170:9866 (hadoop-0004)
Hostname: hadoop-0004
Decommission Status : Normal
Configured Capacity: 42140381184 (39.25 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 7211712512 (6.72 GB)
DFS Remaining: 33086623744 (30.81 GB)
DFS Used%: 0.00%
DFS Remaining%: 78.52%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Sun Nov 10 19:55:40 CST 2024
Last Block Report: Sun Nov 10 18:34:04 CST 2024
Num of Blocks: 0
Name: 192.168.0.222:9866 (hadoop-0002)
Hostname: hadoop-0002
Decommission Status : Normal
Configured Capacity: 42140381184 (39.25 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 7238975488 (6.74 GB)
DFS Remaining: 33059360768 (30.79 GB)
DFS Used%: 0.00%
DFS Remaining%: 78.45%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Sun Nov 10 19:55:40 CST 2024
Last Block Report: Sun Nov 10 18:34:04 CST 2024
Num of Blocks: 0
Name: 192.168.0.252:9866 (hadoop-0003)
Hostname: hadoop-0003
Decommission Status : Normal
Configured Capacity: 42140381184 (39.25 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 7740715008 (7.21 GB)
DFS Remaining: 32557621248 (30.32 GB)
DFS Used%: 0.00%
DFS Remaining%: 77.26%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Sun Nov 10 19:55:40 CST 2024
Last Block Report: Sun Nov 10 18:34:04 CST 2024
Num of Blocks: 0
进入安全模式
安全模式的特点:
- 只读访问:在安全模式下,HDFS 只允许读操作,不允许执行写操作。这意味着用户可以读取数据,但不能写入或删除文件。
- 保护数据完整性:安全模式确保在集群状态不稳定或正在恢复时,不会进行任何可能破坏数据一致性的操作。
- 自动进入和退出:HDFS 可以在启动时自动进入安全模式,直到满足一定的条件(如达到一定的 block 报告比例)后自动退出。管理员也可以手动将 HDFS 设置为安全模式。
安全模式对集群工作的影响:
- 不影响 MapReduce 作业:在安全模式下,HDFS 仍然可以服务于读操作,因此 MapReduce 作业可以继续运行,只要它们不需要写入 HDFS。
- 影响写操作:任何需要写入 HDFS 的操作(如新的 MapReduce 作业、HDFS 文件写入等)将被阻塞,直到安全模式被解除。
- 不影响 YARN 资源管理:ResourceManager 可以继续调度作业,但作业可能会因为 HDFS 的写入限制而无法完成。
在执行缩容操作之前,您可以将 HDFS 设置为安全模式,以防止数据丢失:
# 进入安全模式
[hadoop@hadoop-0001 hadoop]$ hdfs dfsadmin -safemode enter
Safe mode is ON
# 查看安全模式状态
[hadoop@hadoop-0001 hadoop]$ hdfs dfsadmin -safemode get
Safe mode is ON
修改配置添加黑名单
namenode 节点 hdfs-site.xml
[hadoop@hadoop-0001 hadoop]$ cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop
[hadoop@hadoop-0001 hadoop]$ vim hdfs-site.xml
<configuration>
<!-- 设置NameNode存储元数据的本地目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/hadoop_data/hdfs/namenode</value> <!-- NameNode元数据目录 -->
</property>
<property>
<name>dfs.namenode.rpc-address</name>
<value>hadoop-0001:9000</value> <!-- 或者直接使用IP地址:192.168.0.141:9000 -->
</property>
<!-- 设置Secondary NameNode检查点数据的本地目录(可选,通常Secondary NameNode与NameNode的配置分开) -->
<!-- 注意:在Hadoop 2.x及更高版本中,Secondary NameNode主要负责合并NameNode的编辑日志,而不是作为备份 -->
<!-- <property>-->
<!-- <name>dfs.namenode.checkpoint.dir</name> <!– 通常不再需要明确配置,Secondary NameNode有其自己的配置方式 –>-->
<!-- <value>/data/hadoop/hadoop_data/hdfs/namesecondary</value> <!– 可选,用于存放检查点数据 –>-->
<!-- </property>-->
<!-- 设置HDFS文件块的复制因子 -->
<property>
<name>dfs.replication</name>
<value>2</value> <!-- 每个文件块在HDFS中的副本数 -->
</property>
<!-- 设置NameNode的HTTP服务地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop-0001:9870</value> <!-- NameNode HTTP服务的主机名和端口号 -->
</property>
<!-- 设置Secondary NameNode的HTTP服务地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop-0001:9868</value> <!-- Secondary NameNode HTTP服务的主机名和端口号 -->
</property>
<!-- 不需要白名单注释掉-->
<!-- <!– 白名单配置:指定哪些DataNode被允许连接到NameNode –>-->
<!-- <property>-->
<!-- <name>dfs.hosts</name>-->
<!-- <value>/data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/hosts</value>-->
<!-- <description>HDFS白名单文件路径,该文件包含允许连接到NameNode的主机名或IP地址。</description>-->
<!-- </property>-->
<!-- 黑名单配置:指定哪些DataNode被禁止连接到NameNode -->
<property>
<name>dfs.hosts.exclude</name>
<value>/data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/hosts.exclude</value>
<description>HDFS黑名单文件路径,该文件包含禁止连接到NameNode的主机名或IP地址。</description>
</property>
</configuration>
配置黑名单文件 hosts.exclude
黑白名单介绍
- dfs.hosts 文件
- 白名单文件:确实,
dfs.hosts
文件是一个白名单文件,用于指定哪些主机(或DataNode)被允许连接到NameNode。 - 文件不存在:如果
dfs.hosts
文件不存在,则默认行为是允许所有主机连接到NameNode,因为没有明确的白名单限制。 - 文件存在且空白:这里有一点需要纠正。如果
dfs.hosts
文件存在但为空白(即没有列出任何主机),这并不意味着不允许任何主机连接到NameNode。相反,它仍然意味着没有明确的白名单限制,因此默认情况下,所有主机都可以连接到NameNode。白名单为空和不存在白名单在效果上是相同的,即不施加任何限制。
- 白名单文件:确实,
- dfs.hosts.exclude 文件
- 黑名单文件:确实,
dfs.hosts.exclude
文件是一个黑名单文件,用于指定哪些主机被禁止连接到NameNode。 - 文件不存在:如果
dfs.hosts.exclude
文件不存在,则默认行为是不禁止任何主机连接到NameNode,因为没有明确的黑名单限制。 - 文件存在且空白:如果
dfs.hosts.exclude
文件存在但为空白(即没有列出任何主机),这确实意味着不禁止任何主机连接到NameNode。因为没有明确的黑名单项,所以所有主机都可以连接。
- 黑名单文件:确实,
[hadoop@hadoop-0001 hadoop]$ cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop/
[hadoop@hadoop-0001 hadoop]$ vim hosts.exclude
192.168.0.170
刷新集群
[hadoop@hadoop-0001 hadoop]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
[hadoop@hadoop-0001 hadoop]$ yarn rmadmin -refreshNodes
2024-11-10 21:18:31,664 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop-0001/192.168.0.141:8033
确认退役状态
您可以使用以下命令检查退役状态:
# 如果节点已经成功退役,您将看到该节点的状态为“Decommissioned”。
[hadoop@hadoop-0001 hadoop]$ hdfs dfsadmin -report | grep -B 1 Decommission
Hostname: hadoop-0001
Decommission Status : Normal
--
Hostname: hadoop-0004
Decommission Status : Decommissioned
--
Hostname: hadoop-0002
Decommission Status : Normal
--
Hostname: hadoop-0003
Decommission Status : Normal
2024-11-10 21:58:28,577 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop-0001/192.168.0.141:8032
Total Nodes:3
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
hadoop-0003:36025 RUNNING hadoop-0003:8042 0
hadoop-0002:43831 RUNNING hadoop-0002:8042 0
hadoop-0001:41697 RUNNING hadoop-0001:8042 0
停止 DataNode
在确认数据安全后,您可以在要移除的节点上停止 DataNode 服务:
[hadoop@hadoop-0004 hadoop]$ hdfs --daemon stop datanode
# (可选)停止 NodeManager 服务,如果该节点上还运行着 YARN 的 NodeManager 服务
[hadoop@hadoop-0004 hadoop]$ jps
18354 Jps
12687 NodeManager
[hadoop@hadoop-0004 hadoop]$ yarn --daemon stop nodemanager
WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
[hadoop@hadoop-0004 hadoop]$ jps
18526 Jps
[hadoop@hadoop-0004 hadoop]$ yarn --daemon stop nodemanager
[hadoop@hadoop-0004 hadoop]$
从配置中移除节点 hadoop-0004
移除 hosts 文件
[root@hadoop-0001 hadoop]# vim /etc/hosts
192.168.0.141 hadoop-0001
192.168.0.222 hadoop-0002
192.168.0.252 hadoop-0003
[root@hadoop-0001 hadoop]# for i in 192.168.0.222 192.168.0.252; do scp /etc/hosts root@$i:/etc/hosts; done
移除 works 文件
cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop
[root@hadoop-0001 hadoop]# vim workers
hadoop-0001
hadoop-0002
hadoop-0003
[root@hadoop-0001 hadoop]# for i in 192.168.0.222 192.168.0.252; do scp workers root@$i:/data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop; done
清理节点
如果您确定不再需要该节点上的数据,可以清理该节点上的 Hadoop 数据目录甚至释放节点。
退出安全模式
[hadoop@hadoop-0001 hadoop]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
Balancer 操作(可选)
如果集群在移除节点后出现数据不平衡(即某些节点的存储使用率远高于其他节点),您可能需要运行 HDFS Balancer 工具来重新分配数据,使数据在集群中更加均匀分布。使用以下命令启动 Balancer:
[hadoop@hadoop-0001 hadoop]$ hdfs balancer
0
hadoop-0002:43831 RUNNING hadoop-0002:8042 0
hadoop-0001:41697 RUNNING hadoop-0001:8042 0
### 停止 DataNode
在确认数据安全后,您可以在要移除的节点上停止 DataNode 服务:
```shell
[hadoop@hadoop-0004 hadoop]$ hdfs --daemon stop datanode
# (可选)停止 NodeManager 服务,如果该节点上还运行着 YARN 的 NodeManager 服务
[hadoop@hadoop-0004 hadoop]$ jps
18354 Jps
12687 NodeManager
[hadoop@hadoop-0004 hadoop]$ yarn --daemon stop nodemanager
WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
[hadoop@hadoop-0004 hadoop]$ jps
18526 Jps
[hadoop@hadoop-0004 hadoop]$ yarn --daemon stop nodemanager
[hadoop@hadoop-0004 hadoop]$
从配置中移除节点 hadoop-0004
移除 hosts 文件
[root@hadoop-0001 hadoop]# vim /etc/hosts
192.168.0.141 hadoop-0001
192.168.0.222 hadoop-0002
192.168.0.252 hadoop-0003
[root@hadoop-0001 hadoop]# for i in 192.168.0.222 192.168.0.252; do scp /etc/hosts root@$i:/etc/hosts; done
移除 works 文件
cd /data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop
[root@hadoop-0001 hadoop]# vim workers
hadoop-0001
hadoop-0002
hadoop-0003
[root@hadoop-0001 hadoop]# for i in 192.168.0.222 192.168.0.252; do scp workers root@$i:/data/hadoop/hadoop_soft/hadoop-3.4.0/etc/hadoop; done
清理节点
如果您确定不再需要该节点上的数据,可以清理该节点上的 Hadoop 数据目录甚至释放节点。
退出安全模式
[hadoop@hadoop-0001 hadoop]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
Balancer 操作(可选)
如果集群在移除节点后出现数据不平衡(即某些节点的存储使用率远高于其他节点),您可能需要运行 HDFS Balancer 工具来重新分配数据,使数据在集群中更加均匀分布。使用以下命令启动 Balancer:
[hadoop@hadoop-0001 hadoop]$ hdfs balancer