虚机准备
启动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端可看到
可能存在的问题
在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任务的进度
可能存在的问题
出现报错:错误: 找不到或无法加载主类 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上就能看到日志聚集了
评论区