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" ]; thenecho "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" ]; thenecho "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-0003for 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: 1Now 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: 1Now 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: 1Now 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" >&2exit 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" ]]; thenhandle_error "未传入JDK安装包的文件名作为参数。用法:$0 jdk-文件名.tar.gz"
fi# 检查JDK安装包是否在当前目录
if [[ ! -f "$JDK_TAR_GZ" ]]; thenhandle_error "未在当前目录找到JDK安装包 $JDK_TAR_GZ。"
fi# 检查是否已经安装了JDK并获取版本
if command -v java &> /dev/null; thenINSTALLED_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 -versionif [[ "$INSTALLED_JDK_VERSION_MAJOR_MINOR" != "1.8" ]]; thenhandle_info "警告:已安装的JDK版本不是1.8,而是 $INSTALLED_JDK_VERSION。"# 提供卸载非JDK 1.8版本的指导if rpm -qa | grep -q "jdk|java"; thenhandle_info "发现通过rpm安装的JDK,可以使用以下命令卸载:"handle_info "rpm -e --nodeps $(rpm -qa | grep -E 'jdk|java')"elif yum list installed | grep -q "jdk|java"; thenhandle_info "发现通过yum安装的JDK,可以使用以下命令卸载:"handle_info "yum remove $(yum list installed | grep -E 'jdk|java' | awk '{print $1}')"elsehandle_info "无法确定JDK的安装方式,可能需要手动卸载。请查找相关安装文档。"firead -p "是否继续安装新版本的JDK?(y/n): " choiceif [[ "$choice" != "y" && "$choice" != "Y" ]]; thenhandle_info "取消安装。"exit 0fifi
elsehandle_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 ]]; thenhandle_error "未找到解压后的JDK目录。"
elif [[ ${#JDK_DIRS[@]} -gt 1 ]]; thenhandle_warning "警告:发现多个可能的JDK目录,选择第一个(${JDK_DIRS[0]}):"for dir in "${JDK_DIRS[@]}"; dohandle_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; thenhandle_info "JDK安装成功,版本信息如下:"java -versionhandle_info "安装和配置已完成。环境变量已写入/etc/profile。"handle_info "对于当前用户,为了使更改立即生效,请执行'source /etc/profile'。"handle_info "对于后续登录的用户,新的环境变量将在他们登录时自动生效。"
elsehandle_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" >&2exit 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" ]; thenhandle_error "No Hadoop tar.gz file provided!"elif [ ! -f "$HADOOP_TAR_GZ" ]; thenhandle_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}}}; dohandle_info "Created directory: $dir"donehandle_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
EOFsource /etc/profile || handle_error "Failed to source /etc/profile."# 检查环境变量是否设置成功(可选)if [ -z "${HADOOP_HOME-}" ]; thenhandle_error "HADOOP_HOME environment variable not set!"fihandle_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; docp "$file" "${file}.$(date +%F-%H%M%S).bak" || handle_error "Failed to backup $file."donecp 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."
elsehandle_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_confighandle_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><!-- 设置DataNode存储数据块的本地目录 --><property><name>dfs.datanode.data.dir</name><value>/data/hadoop/hadoop_data/hdfs/datanode</value> <!-- DataNode数据块目录 --></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-0003for 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: 0Blocks with corrupt replicas: 0Missing blocks: 0Missing blocks (with replication factor 1): 0Low redundancy blocks with highest priority to recover: 0Pending deletion blocks: 0
Erasure Coded Block Groups:Low redundancy block groups: 0Block groups with corrupt internal blocks: 0Missing block groups: 0Low redundancy blocks with highest priority to recover: 0Pending 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: 0Name: 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: 0Name: 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:3Node-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.defaultState : RUNNINGCapacity : 100.00%Current Capacity : .00%Maximum Capacity : 100.00%Weight : -1.00Maximum Parallel Apps : 2147483647Default Node Label expression : <DEFAULT_PARTITION>Accessible Node Labels : *Preemption : disabledIntra-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: []):0Application-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:4Node-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: 0Blocks with corrupt replicas: 0Missing blocks: 0Missing blocks (with replication factor 1): 0Low redundancy blocks with highest priority to recover: 0Pending deletion blocks: 0
Erasure Coded Block Groups:Low redundancy block groups: 0Block groups with corrupt internal blocks: 0Missing block groups: 0Low redundancy blocks with highest priority to recover: 0Pending 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: 0Name: 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: 0Name: 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: 0Name: 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 : Normal2024-11-10 21:58:28,577 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop-0001/192.168.0.141:8032
Total Nodes:3Node-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