一、服务器准备

  • 选择【产品】下的【云服务器ECS】->【立即购买】

  • 按需选择配置以,其中价格【包年包月】>【按量付费】>【抢占式实例】

    • 【包年包月】一次性付费

    • 【按量付费】用多少付多少

    • 【抢占式实例】一次用完,超过1小时后面再用可能实例被释放了

  • 【地域】选一个离所在地近的,或者便宜的,这里我选择 广州

  • 实例和镜像

  • 扩展程序不选择(如果懒得自己装Java,也可以这里直接选上)

  • 存储:100GB

  • 网络和安全

  • 管理设置:【自定义密码】(后面远程链接虚拟机的密码)

  • 确认下单即可

  • 进入【产品控制台】可以看到刚刚下单的机器

二、统一基础环境配置(所有节点执行)

0.集群规划

节点名称

角色分配

内网IP(示例)

namenode

NameNode、DataNode、ResourceManager、NodeManager、HistoryServer

172.16.0.10

datanode1

DataNode、SecondaryNameNode、NodeManager

172.16.0.11

datanode2

DataNode、NodeManager

172.16.0.12

1. 连接服务器(这里我用的是xshell链接)

  • 来到【用户身份验证】:用户名:root、密码:刚刚购买界面设定的密码

2. 创建标准目录结构

# 创建软件压缩包存放目录
sudo mkdir -p /opt/software
# 创建软件安装目录
sudo mkdir -p /opt/module
# 修改目录权限为当前用户
sudo chown -R $USER:$USER /opt/software
sudo chown -R $USER:$USER /opt/module

3. 关闭防火墙

# 停止防火墙
sudo ufw stop
# 禁用防火墙开机自启
sudo ufw disable
# 验证防火墙状态(显示inactive)
sudo ufw status

4. 关闭SELinux

# 临时关闭
sudo setenforce 0
# 永久关闭
sudo vim /etc/selinux/config

将SELINUX=enforcing修改为SELINUX=disabled,保存退出后重启:

sudo reboot

5. 配置主机名

namenode节点:
sudo vim /etc/hostname

删除原有内容,输入:namenode,保存退出后重启:

sudo reboot
datanode1节点:
sudo vim /etc/hostname

删除原有内容,输入:datanode1,保存退出后重启:

sudo reboot
datanode2节点:
sudo vim /etc/hostname

删除原有内容,输入:datanode2,保存退出后重启:

sudo reboot

6. 配置主机映射

所有节点执行:

sudo vim /etc/hosts

添加以下内容(替换为实际内网IP,不是公网IP):

172.16.0.10  namenode
172.16.0.11  datanode1
172.16.0.12  datanode2

验证配置:

ping datanode1 -c 3  # 应能正常ping通
ping datanode2 -c 3

7. 配置SSH免密登录

namenode节点操作:
# 生成密钥对(连续按三次回车)
ssh-keygen -t rsa

# 分发公钥到所有节点
ssh-copy-id namenode
ssh-copy-id datanode1
ssh-copy-id datanode2

(执行过程中需要输入对应节点的登录密码)

datanode1节点操作:
ssh-keygen -t rsa
ssh-copy-id namenode
ssh-copy-id datanode1
ssh-copy-id datanode2
datanode2节点操作:
ssh-keygen -t rsa
ssh-copy-id namenode
ssh-copy-id datanode1
ssh-copy-id datanode2

验证免密登录(以namenode节点为例):

ssh datanode1  # 无需密码即可登录
exit  # 退出登录
ssh datanode2
exit

三、JDK安装与配置

1. namenode节点操作

# 上传JDK压缩包到/opt/software(可使用SFTP工具如:Xftp)
# 解压JDK到/opt/module目录
cd /opt/software
tar -zxvf jdk-8u311-linux-x64.tar.gz -C /opt/module/

# 重命名JDK目录
cd /opt/module
mv jdk1.8.0_311 jdk

2. 同步JDK到从节点

在namenode节点执行:

# 同步到datanode1
scp -r /opt/module/jdk datanode1:/opt/module/
scp /opt/software/jdk-8u311-linux-x64.tar.gz datanode1:/opt/software/

# 同步到datanode2
scp -r /opt/module/jdk datanode2:/opt/module/
scp /opt/software/jdk-8u311-linux-x64.tar.gz datanode2:/opt/software/

3. 配置JDK环境变量(所有节点)

sudo vim /etc/profile

在文件末尾添加:

# JDK环境变量
export JAVA_HOME=/opt/module/jdk
export PATH=$JAVA_HOME/bin:$PATH

# Hadoop环境变量
export HADOOP_HOME=/opt/module/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

使配置生效:

source /etc/profile

验证JDK安装:

java -version  # 应显示java version "1.8.0_311"

四、Hadoop安装与配置

1. namenode节点操作

# 上传hadoop-2.10.2.tar.gz到/opt/software(可使用SFTP工具)
# 解压Hadoop到/opt/module目录
cd /opt/software
tar -zxvf hadoop-2.10.2.tar.gz -C /opt/module/

# 重命名Hadoop目录
cd /opt/module
mv hadoop-2.10.2 hadoop

2. 配置Hadoop(仅namenode节点)

进入Hadoop配置文件目录:

cd /opt/module/hadoop/etc/hadoop
(1)修改hadoop-env.sh
vim hadoop-env.sh

找到并修改:

export JAVA_HOME=/opt/module/jdk
(2)修改mapred-env.sh
vim mapred-env.sh

添加:

export JAVA_HOME=/opt/module/jdk
(3)修改yarn-env.sh
vim yarn-env.sh

添加:

export JAVA_HOME=/opt/module/jdk
  • 下列xml配置文件中的端口以及后续访问UI端口,注意hadoop2.x和hadoop3.x差别

(4)修改core-site.xml
vim core-site.xml

在<configuration>标签内添加:

    <!-- 指定NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://namenode:9000</value>
    </property>

    <!-- 指定hadoop数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop/data/tmp</value>
    </property>

(5)修改hdfs-site.xml
vim hdfs-site.xml

在<configuration>标签内添加:

<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>
<!-- nn web端访问地址-->
<property>
        <name>dfs.namenode.http-address</name>
        <value>namenode:50070</value>
</property>
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>datanode1:50090</value>
</property>
<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>
<property>
    <name>dfs.namenode.name.dir</name>
    <value>/opt/module/hadoop/data/namenode</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>/opt/module/hadoop/data/datanode</value>
</property>
(6)修改mapred-site.xml
# 复制模板文件
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml

在<configuration>标签内添加:

<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>namenode:10020</value>
</property>
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>namenode:19888</value>
</property>
(7)修改yarn-site.xml
vim yarn-site.xml

在<configuration>标签内添加:

    <!-- 指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>namenode</value>
    </property>
    <!-- 指定MR走shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>
        <!-- 环境变量的继承 -->
        <property>
            <name>yarn.nodemanager.env-whitelist</name>
            <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
  • 执行用户配置start-dfs.sh、stop-dfs.sh、start-yarn.sh、stop-yarn.sh

 vim start-dfs.sh
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

vim stop-dfs.sh
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

vim start-yarn.sh
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

vim stop-yarn.sh
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
(8)修改slaves文件
vim slaves

删除原有内容,添加:

namenode
datanode1
datanode2
(9)创建数据目录
mkdir -p /opt/module/hadoop/data/tmp
mkdir -p /opt/module/hadoop/data/namenode
mkdir -p /opt/module/hadoop/data/datanode

3. 同步Hadoop到从节点

在namenode节点执行:

# 同步Hadoop安装目录到datanode1
scp -r /opt/module/hadoop datanode1:/opt/module/
scp /opt/software/hadoop-2.10.2.tar.gz datanode1:/opt/software/

# 同步Hadoop安装目录到datanode2
scp -r /opt/module/hadoop datanode2:/opt/module/
scp /opt/software/hadoop-2.10.2.tar.gz datanode2:/opt/software/

4. 从节点补充操作

datanode1和datanode2节点分别执行:

# 创建数据目录
mkdir -p /opt/module/hadoop/data/tmp
mkdir -p /opt/module/hadoop/data/datanode

# 确保环境变量生效
source /etc/profile

五、Hadoop集群初始化与启动

1. 格式化HDFS(仅namenode节点)

hdfs namenode -format

出现INFO common.Storage: Storage directory /opt/module/hadoop/data/namenode has been successfully formatted.提示即为成功。

2. 启动HDFS集群(namenode节点)

${HADOOP_HOME}/sbin/start-dfs.sh

3. 启动YARN集群(namenode节点)

${HADOOP_HOME}/sbin/start-yarn.sh

4. 启动历史服务器(namenode节点)

${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh start historyserver

5.若datanode未正常启动,可在每个节点单独执行以下命令

${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
  • 如果成功,后续注意排查secure机制以及start-dfs.sh后的执行日志

  • 如果失败,需要另外查询初始化或者其他执行logs

六、集群状态验证

1. 进程验证

namenode节点执行jps:

应显示以下进程:

NameNode
DataNode
ResourceManager
NodeManager
JobHistoryServer
Jps
datanode1节点执行jps:

应显示以下进程:

DataNode
SecondaryNameNode
NodeManager
Jps
datanode2节点执行jps:

应显示以下进程:

DataNode
NodeManager
Jps

2. 网页验证

HDFS管理界面:

在本地浏览器访问:http://namenode公网IP:50070\

  • 检查左侧导航栏"Datanodes",应显示3个节点

  • 检查集群状态应为"Live Nodes: 3"

YARN管理界面:

在本地浏览器访问:http://namenode公网IP:8088\

  • 检查左侧导航栏"Nodes",应显示3个节点

  • 集群健康状态应为"healthy"

历史服务器界面:

在本地浏览器访问:http://namenode公网IP:19888\

  • 可查看已完成的MapReduce作业历史

3. 功能验证(namenode节点)

# 在HDFS上创建测试目录
hdfs dfs -mkdir /test

# 上传本地文件到HDFS
hdfs dfs -put /etc/profile /test

# 查看HDFS文件
hdfs dfs -ls /test

# 从HDFS下载文件
hdfs dfs -get /test/profile /tmp/profile_download

# 检查下载文件
ls -l /tmp/profile_download

七、集群停止命令(如需)

在namenode节点执行:

# 停止历史服务器
mr-jobhistory-daemon.sh stop historyserver

# 停止YARN集群
stop-yarn.sh

# 停止HDFS集群
stop-dfs.sh

至此,基于阿里云ECS的Hadoop 2.10.2完全分布式集群安装完成并验证通过。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐