当前位置: 首页 > article >正文

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地址配置系统jdkhadoop
hadoop-0001192.168.0.1412C4GCentOS 7.9 64bitjdk-8u421-linux-x64.tar.gzhadoop-3.4.0.tar.gz
hadoop-0002192.168.0.2222C4GCentOS 7.9 64bitjdk-8u421-linux-x64.tar.gzhadoop-3.4.0.tar.gz
hadoop-0003192.168.0.2522C4GCentOS 7.9 64bitjdk-8u421-linux-x64.tar.gzhadoop-3.4.0.tar.gz

服务器角色分配

服务器角色
hadoop-0001NameNode 和 ResourceManager,都作为 DataNode 和 NodeManagerNameNode通常单独主机,ResourceManager通常单独主机
hadoop-0002Secondary NameNode,都作为 DataNode 和 NodeManagerSecondary NameNode非NameNode主机
hadoop-0003都作为 DataNode 和 NodeManagerNodeManager运行在每个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 82.7.x 到 2.10.x 的 Apache Hadoop 同时支持 Java 78
Linux x64 Compressed Archive139.93 MBjdk-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.xmlhdfs-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> &lt;!&ndash; 通常不再需要明确配置,Secondary NameNode有其自己的配置方式 &ndash;&gt;-->
<!--        <value>/data/hadoop/hadoop_data/hdfs/namesecondary</value> &lt;!&ndash; 可选,用于存放检查点数据 &ndash;&gt;-->
<!--    </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>
    
<!--    &lt;!&ndash; 设置MapReduce JobHistory Server的地址(可选,通常与ResourceManager集成) &ndash;&gt;-->
<!--    &lt;!&ndash; 注意:在Hadoop 3.x中,JobHistory Server通常与ResourceManager集成,因此这些配置可能不是必需的 &ndash;&gt;-->
<!--    <property>-->
<!--        <name>mapreduce.jobhistory.address</name> &lt;!&ndash; 通常不再需要单独配置 &ndash;&gt;-->
<!--        <value>0.0.0.0:10020</value> &lt;!&ndash; JobHistory Server的主机名和端口号(如果单独配置) &ndash;&gt;-->
<!--    </property>-->
<!--    -->
<!--    &lt;!&ndash; 设置MapReduce JobHistory Server的Web应用地址(可选,通常与ResourceManager集成) &ndash;&gt;-->
<!--    <property>-->
<!--        <name>mapreduce.jobhistory.webapp.address</name> &lt;!&ndash; 通常不再需要单独配置 &ndash;&gt;-->
<!--        <value>0.0.0.0:19888</value> &lt;!&ndash; JobHistory Server Web应用的主机名和端口号(如果单独配置) &ndash;&gt;-->
<!--    </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.addressmapreduce.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 进程。作为 hdfsetc/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地址配置系统jdkhadoop角色
hadoop-0004192.168.0.1702C4GCentOS 7.9 64bitjdk-8u421-linux-x64.tar.gzhadoop-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>
    
<!--    &lt;!&ndash; 设置MapReduce JobHistory Server的地址(可选,通常与ResourceManager集成) &ndash;&gt;-->
<!--    &lt;!&ndash; 注意:在Hadoop 3.x中,JobHistory Server通常与ResourceManager集成,因此这些配置可能不是必需的 &ndash;&gt;-->
<!--    <property>-->
<!--        <name>mapreduce.jobhistory.address</name> &lt;!&ndash; 通常不再需要单独配置 &ndash;&gt;-->
<!--        <value>0.0.0.0:10020</value> &lt;!&ndash; JobHistory Server的主机名和端口号(如果单独配置) &ndash;&gt;-->
<!--    </property>-->
<!--    -->
<!--    &lt;!&ndash; 设置MapReduce JobHistory Server的Web应用地址(可选,通常与ResourceManager集成) &ndash;&gt;-->
<!--    <property>-->
<!--        <name>mapreduce.jobhistory.webapp.address</name> &lt;!&ndash; 通常不再需要单独配置 &ndash;&gt;-->
<!--        <value>0.0.0.0:19888</value> &lt;!&ndash; JobHistory Server Web应用的主机名和端口号(如果单独配置) &ndash;&gt;-->
<!--    </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

进入安全模式

安全模式的特点:

  1. 只读访问:在安全模式下,HDFS 只允许读操作,不允许执行写操作。这意味着用户可以读取数据,但不能写入或删除文件。
  2. 保护数据完整性:安全模式确保在集群状态不稳定或正在恢复时,不会进行任何可能破坏数据一致性的操作。
  3. 自动进入和退出: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> &lt;!&ndash; 通常不再需要明确配置,Secondary NameNode有其自己的配置方式 &ndash;&gt;-->
<!--        <value>/data/hadoop/hadoop_data/hdfs/namesecondary</value> &lt;!&ndash; 可选,用于存放检查点数据 &ndash;&gt;-->
<!--    </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>
<!--    不需要白名单注释掉-->
<!--        &lt;!&ndash; 白名单配置:指定哪些DataNode被允许连接到NameNode &ndash;&gt;-->
<!--    <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

黑白名单介绍

  1. dfs.hosts 文件
    • 白名单文件:确实,dfs.hosts文件是一个白名单文件,用于指定哪些主机(或DataNode)被允许连接到NameNode。
    • 文件不存在:如果dfs.hosts文件不存在,则默认行为是允许所有主机连接到NameNode,因为没有明确的白名单限制。
    • 文件存在且空白:这里有一点需要纠正。如果dfs.hosts文件存在但为空白(即没有列出任何主机),这并不意味着不允许任何主机连接到NameNode。相反,它仍然意味着没有明确的白名单限制,因此默认情况下,所有主机都可以连接到NameNode。白名单为空和不存在白名单在效果上是相同的,即不施加任何限制。
  2. 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

http://www.kler.cn/a/388357.html

相关文章:

  • 【Qt】在 Qt Creator 中使用图片资源方法(含素材网站推荐)
  • 弹性盒子布局(Flexbox)详细介绍
  • 文件上传漏洞--理论
  • LeetCode【0016】最接近的三数之和
  • Leetcode 找出字符串中第一个匹配项的下标
  • Linux权限和开发工具(3)
  • 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--访问权限中间件
  • 深度学习:NAT Decoder 详解
  • 【GPTs】EmojiAI:轻松生成趣味表情翻译
  • Java进阶嵌套循环:十.冒泡与选择算法排序
  • 命令行工具PowerShell使用体验
  • 【C++】STL中的list容器详解及常用函数用法
  • UOS启动器
  • CI/CD 实践总结
  • HTB:Explore[WriteUP]
  • [Android]查找java类中声明为native方法的具体实现方法
  • 「QT」几何数据类 之 QPolygon 多边形类
  • 增删改查基础项目总结
  • 智能机器人技术:AI 如何赋予机器智能行动
  • 如何使用 Puppeteer 和 Browserless 抓取亚马逊产品数据?
  • 【SQL实验】更新操作
  • 量子计算及其在密码学中的应用
  • Element UI组件Dialog显示闪动问题【解决方案】
  • The First项目报告:MANTRA如何实现世界金融区块链化?
  • 统信UOS开发环境支持Perl
  • 力扣第46题“全排列”