标签搜索

目 录CONTENT

文章目录

Hadoop集群搭建(三台虚拟机为例)

陈铭
2023-01-16 / 0 评论 / 0 点赞 / 381 阅读 / 3,225 字 / 正在检测是否收录...

虚机准备

启动CentOS7虚拟机

首先去官网下载x86_64架构mini版本的iso镜像(当然可选择标准版的,就是iso文件大一些)。
使用Vmware启动虚拟机(启动过程略),这边的虚拟配置是:

  • 20G硬盘
  • 4核(每核1线程,不开启虚拟化)
  • 4G内存(2G可能也行,没尝试过)

配置网络信息

配置静态ip

vim /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" # 设置为静态
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="3fc01f0a-bd12-4b1b-85e1-a5785b26ac55"
DEVICE="ens33"
ONBOOT="yes"

# 固定ip为100,192.168.217.x 是Vmware的NAT网段
IPADDR=192.168.217.100
# 自行查看Vmware的虚拟网络编辑器的NAT设置
GATEWAY=192.168.217.2
# 随便扔两个常见DNS,第一个是谷歌的,第二个是电信的
DNS1=8.8.8.8
DNS2=114.114.114.114

配置主机名(hostname)

# 因为ip是100结尾的,就取hadoop100,整个文件就hadoop100这一行!!
vim /etc/hostname

hadoop100

配置host

添加最后三行(hadoop100 - hadoop102),头两行默认自带的。即添加三个host映射,到时候要起这三台虚机组集群嘛

vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.217.100 hadoop100
192.168.217.101 hadoop101
192.168.217.102 hadoop102

安装yum依赖

# mini镜像没有防火墙功能,需要安装net-tools
yum install -y epel-release vim net-tools rsync
# 关闭防火墙,为后续搭建集群省去防火墙的相关操作
# 关闭防火墙服务
systemctl stop firewalld
# 去除软链接,本质上是关闭防火墙的开机自启
systemctl disable firewalld.service

增加用户

使用root用户启动Hadoop集群需要额外配置,比较麻烦,这里直接创建一个新的用户,并赋予它root的权限

# 添加用户cm
useradd cm
# 用户cm的密码设置
passwd cm

赋予root权限,在%wheel这行下面添加一行。
注意: cm这一行不要直接放到root行下面,因为所有用户都属于wheel组,你先配置了cm具有免密功能(NOPASSWD:ALL),但是程序执行到%wheel行时,该功能又被覆盖回需要密码。所以cm要放到%wheel这行下面

vim /etc/sudoers

## Allow root to run any commands anywhere
root    ALL=(ALL)     ALL

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
cm   ALL=(ALL)     NOPASSWD:ALL

安装JDK

删除原装JDK

如果虚机内自带JDK请先删除

rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps 

下载JDK

这边使用tar包安装JDK(jdk-8u212-linux-x64.tar.gz),自行百度

安装JDK

上述操作已配置好一个新用户cm,接下来所有的命令都是在cm下运行,之前则是在root上运行。我们的JDK就是要解压到 /opt/module,而下载好的tar包则放在了

su cm
sudo mkdir /opt/module
sudo mkdir /opt/software
sudo chown cm:cm /opt/module
sudo chown cm:cm /opt/software

# 解压tar包
cd /opt/software
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/

设置环境变量
su root

vim /etc/profile
# 在文件最底下添加上
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin

# 修改完毕后重现加载环境变量
source /etc/profile
# 测试JAVA_HOME
su cm # 返回cm用户
java -version

安装Hadoop

下载Hadoop的tar包

下载链接,目前最新是3.3.4版本,tar包放置到 /opt/software

安装Hadoop

# 解压
cd /opt/software/
tar -zxvf hadoop-3.3.4.tar.gz -C /opt/module/

# 配置环境变量
su root

vim /etc/profile
# 在文件最底下添加上
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.3.4
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

# 修改完毕后重现加载环境变量
source /etc/profile
# 测试HADOOP_HOME
su cm # 返回cm用户
hadoop version

克隆虚拟机

上述操作安装了yum依赖、JDK和Hadoop。其实集群每个节点都需要安装这些,所以我们对该机器进行克隆(Vmware自带的虚机克隆)
但是新的虚机要配置下新的hostname和静态ip,见上述的配置网络信息,就不多赘述了

配置同步脚本

cd /home/cm
mkdir bin
cd bin
# 创建脚本
vim xsync

脚本如下,里面用到了rsync 命令,最早的yum依赖安装过这个,所以三台虚机都有这个命令

#!/bin/bash

#1. 判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi

#2. 遍历集群所有机器
for host in hadoop100 hadoop101 hadoop102
do
    echo ====================  $host  ====================
    #3. 遍历所有目录,挨个发送

    for file in $@
    do
        #4. 判断文件是否存在
        if [ -e $file ]
            then
                #5. 获取父目录
                pdir=$(cd -P $(dirname $file); pwd)

                #6. 获取当前文件的名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file does not exists!
        fi
    done
done

设置执行权限

chmod +x xsync
# 测试脚本,测试过程中要手动输入密码,所以后续配置了ssh免密
xsync /home/atguigu/bin

# 将脚本复制到/bin中,以便全局调用,/bin下有这个脚本,在root用户下也能使用。不复制的话就在cm的home下,这里建议三台机器都拷贝下
sudo cp xsync /bin/

配置ssh免密

这里用hadoop100这台主机设置免密,hadoop101和hadoop102都要设置的

cd /home/cm/.ssh
# 生成ssh公钥,连敲三次回车,都用默认的设置
ssh-keygen -t rsa
# 三台主机都推送一下公钥
ssh-copy-id hadoop100
ssh-copy-id hadoop101
ssh-copy-id hadoop102

当然公钥的发送需要在三台虚机上都做一遍(ssh-keygen -t和ssh-copy-id),但这也是针对cm这个用户的免密。如果切换到root用户,则需要重新设置下免密!

启动集群

配置文件

配置文件放置在/opt/module/hadoop-3.3.4/etc/hadoop,有四个配置文件:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml。
首先,NameNode将配置在hadoop100,SecondNameNode将配置在hadoop102,ResourceManager将配置在hadoop101

core-site.xml

核心配置文件

<configuration>
    <!-- 指定NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop100:8020</value>
    </property>

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

    <!-- 配置HDFS网页登录使用的静态用户为cm -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>cm</value>
    </property>
</configuration>

hdfs-site.xml

HDFS配置文件

<configuration>
    <!-- nn web端访问地址-->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop100:9870</value>
    </property>
    <!-- 2nn web端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop102:9868</value>
    </property>
</configuration>

yarn-site.xml

YARN配置文件

<configuration>
    <!-- 指定MR走shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!-- 指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop101</value>
    </property>
</configuration>

mapred-site.xml

MapReduce配置文件

<configuration>
    <!-- 指定MapReduce程序运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

配置节点

vim /opt/module/hadoop-3.3.4/etc/hadoop/workers
# 里面就这三行,也就是集群的三个节点
hadoop100
hadoop101
hadoop102

分发配置文件

使用上述做的分发脚本分发这些配置文件(四个配置文件+workers)

xsync /opt/module/hadoop-3.3.4/etc/hadoop/ 

启动集群

启动HDFS

# 如果是第一次启动集群,在NameNode节点初始化HDFS
# 以后启动不要初始化,会删掉数据的
hdfs namenode -format
# 启动HDFS
cd /opt/module/hadoop-3.3.4
sbin/start-dfs.sh

如果启动 start-dfs.sh,出现Error: JAVA_HOME is not set and could not be found.,手动配置上JAVA_HOME

vim /opt/module/hadoop-3.3.4/etc/hadoop/hadoop-env.sh
# 找到export JAVA_HOME这一行,修改成:
export JAVA_HOME=/opt/module/jdk1.8.0_212

# 修改完分发脚本
xsync /opt/module/hadoop-3.3.4/etc/hadoop/
# 分发完执行脚本
cd /opt/module/hadoop-3.3.4
sbin/start-dfs.sh

启动YARN

在hadoop101上启动YARN,因为ResourceManager配置在这个节点上

cd /opt/module/hadoop-3.3.4	
sbin/start-yarn.sh

测试集群

测试Web控制台

Web端查看HDFS的NameNode

访问 http://192.168.217.100:9870

Web端查看YARN的ResourceManager

访问 http://192.168.217.101:8088

测试上传文件

hadoop fs -mkdir /input
# 在/opt下随便放一个txt
hadoop fs -put /opt/word.txt /input

在HDFS的Web端可看到
image

可能存在的问题

在web端进行预览、上传或者下载,会报错。因为浏览器会使用hadoop100 - hadoop101这三个hostname进行访问,所以win11需要配置下这三个host。
C:\Windows\System32\drivers\etc\hosts 末尾增加内容:

192.168.217.100       hadoop100
192.168.217.101       hadoop101
192.168.217.102       hadoop102

测试wordcount

hadoop jar /opt/module/hadoop-3.3.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input /output

Yarn的web上也能看到当前这个wordcount的MapReduce任务的进度
image

可能存在的问题

出现报错:错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster

# 先关闭集群,见下方所写的命令
# 在yarn-site.xml上添加配置:
# 类路径用命令查看:hadoop classpath,填到下方的 <value>中
<property>
         <name>yarn.application.classpath</name>
         <value>你的路径信息(刚才复制的路径信息)</value>
</property>

# 三台虚机重新分发yarn-site.xml,再启动集群

开启/关闭集群

到各个节点执行all的脚本(但最推荐的还是去对应节点执行HDFS和Yarn的启停)

cd /opt/module/hadoop-3.3.4

# 关闭集群
# 等同于去对应节点执行了start-dfs.sh和start-yarn.sh
sbin/start-all.sh

# 关闭集群
# 等同于去对应节点执行了stop-dfs.sh和stop-yarn.sh
sbin/stop-all.sh

单独启停某一节点组件

在某一节点主机上执行命令:

# 分别启动/停止HDFS组件
hdfs --daemon start/stop namenode
hdfs --daemon start/stop datanode
hdfs --daemon start/stop secondarynamenode
# 分别启动/停止YARN组件
yarn --daemon start/stop  resourcemanager
yarn --daemon start/stop  nodemanager

重置集群(出问题时可以试试)

# 在每台虚机上操作:
# 删除HDFS的文件和集群缓存
cd /opt/module/hadoop-3.3.4
rm -rf data
rm -rf logs
rm -rf /tmp/*
# 三台虚机都重启
reboot

# 到NameNode节点上操作(即hadoop100):
# 重新格式化HDFS
hdfs namenode -format

# 后面就可以根据上述操作正常启动HDFS和Yarn

配置历史服务器

配置mapred-site.xml

在hadoop100上配置mapred-site.xml

vim /opt/module/hadoop-3.3.4/etc/hadoop/mapred-site.xml
# 添加上如下配置
<!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop100:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop100:19888</value>
</property>

# 分发给三个虚机
xsync /opt/module/hadoop-3.3.4/etc/hadoop/mapred-site.xml

启动历史服务器

# 开启,--daemon是后台开启
mapred --daemon start historyserver
# 关闭
mapred --daemon stop historyserver 

启动完毕后,访问 http://hadoop100:19888/jobhistory ,会失败。
因为历史服务器是记录MapReduce记录的,需要执行一下一个新的MR任务,然后就能访问了

配置日志聚集

配置yarn-site.xml

在hadoop100上配置yarn-site.xml

vim /opt/module/hadoop-3.3.4/etc/hadoop/yarn-site.xml
# 添加上如下配置
<!-- 开启日志聚集功能 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>  
    <name>yarn.log.server.url</name>  
    <value>http://hadoop100:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>

# 分发给三个虚机
xsync /opt/module/hadoop-3.3.4/etc/hadoop/yarn-site.xml

启动日志聚集

日志聚集是依赖于历史服务器的,配置好了之后,启动历史服务器在其web上就能看到日志聚集了