本地Hadoop集群部署
本文存储于Notion个人笔记:本地Hadoop完全分布式部署
零、先看不后悔
友情链接:
💡 需求:用3台虚拟机进行Hadoop集群部署
💡 虚拟机部署规划:
Master | Datanode02 | Datanode03 | |
---|---|---|---|
IP | 192.168.31.200 | 192.168.31.210 | 192.168.31.220 |
HDFS | DataNode NameNode | Datanode | Datanode SecondaryNameNode |
Yarn | NodeManager | NodeManager ResourceManager | NodeManager |
History | HistoryServer |
环境变量规划:
HADOOP_HOME=/opt/hadoop-3.3.3
JAVA_HOME=/usr/java/latest
一、安装虚拟机
1.0 本文用到的软件下载
本文Hadoop部署用到的全部软件及下载地址:
- VMware16.1.0:VMware-workstation-full-16.1.0-17198959.exe(百度网盘)
- CentOS7:CentOS-7-x86_64-DVD-2009.iso(阿里云镜像)
- Hadoop-3.3.3:hadoop-3.3.3.tar.gz(官网)
- JDK8:jdk-8u381-linux-x64(官网)
百度网盘全系软件自取:
Hadoop集群部署软件(提取码:yu6u)
阿里云盘JDK和VMware软件自取:
Hadoop集群部署(提取码: z5c9)
1.1 下载安装VMware
选择自定义安装路径,一路默认安装即可。
1.2 下载安装Centos7版Linux操作系统
下载CentOS7:阿里云镜像站(http://mirrors.aliyun.com/centos/7/isos/x86_64/)
这里可以查看我的CentOS7安装教程:
二、Hadoop配置
2.1 下载安装JDK和Hadoop
2.1.1 下载JDK和Hadoop
在物理机Windows上下载JDK和Hadoop
官网下载:
Hadoop-3.3.3
jdk-8u381-linux-x64.rpm
-
Hadoop官网下载
-
JDK官网下载
输入如下命令创建自己的软件存放目录mysoftwares:
[feng@Master ~]$ cd /home/feng/
[feng@Master ~]$ ls
[feng@Master ~]$ mkdir mysoftwares
[feng@Master ~]$ cd mysoftwares/
[feng@Master mysoftwares]$
直接把文件从物理机Windows拖过去MobaXterm的虚拟机目录中:
2.1.2 卸载Centos自带的JDK
注意:如果你的虚拟机是最小化安装不需要执行这一步。
首先卸载Centos7自带的JDK:
[feng@Master ~]$ su root
# 查看centos自带jdk是否已经安装
[root@Master ~]$ yum list installed | grep java
# 卸载自带jdk
[root@Master ~]$ yum -y remove java-1.8.0-openjdk*
[root@Master ~]$ yum -y remove java-1.7.0-openjdk*
💡 注意:这里除了.noarch作为后缀名的文件,其他带java的都删除即可。但noarch的最好不要删除。
网上还有另外一种卸载的方法,只是不适用于我的虚拟机会报错:
error: package nodeps is not installed
这里给出卸载命令如下:
rpm -qa | grep jdk rpm -e nodeps <java-name>
对如下Linux命令的参数进行解读:
[root@Master ~]# rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
➢ rpm -qa:查询所安装的所有 rpm 软件包
➢ grep -i:忽略大小写
➢ xargs -n1:表示每次只传递一个参数
➢ rpm -e –nodeps:强制卸载软件
2.1.3 安装JDK
安装JDK,命令如下
# 首先回到当前用户
[root@Master ~]$ exit
[feng@Master ~]$
# 安装JDK
[feng@Master ~]$ sudo rpm -ivh /home/feng/mysoftwares/jdk-8u381-linux-x64.rpm
# 检验是否安装成功
[feng@Master ~]$ java -version
[feng@Master ~]$ javac -version
2.1.4 安装Hadoop
使用如下命令分别解压刚刚的Hadoop压缩包和将Hadoop的权限转移给当前用户:
# 解压3.1.1下载得到的Hadoop安装包
[root@Master ~]$ sudo tar -zxvf /home/feng/mysoftwares/hadoop-3.3.3-20220517.tar.gz -C /opt/
# 将Hadoop的权限转移给当前用户
[root@Master ~]$ sudo chown -R feng:feng /opt/hadoop-3.3.3
然后配置HADOOP_HOME,命令如下:
# 配置Hadoop环境变量
[feng@Master ~]$ sudo vi /etc/profile.d/hadoop.sh
[feng@Master ~]$ source /etc/profile
# hadoop.sh中添加的内容:
export HADOOP_HOME=/opt/hadoop-3.3.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
最后,去创建HDFS的工作目录big_data:
# 创建HDFS工作目录
[feng@Master ~]$ ls /var/
[feng@Master ~]$ sudo mkdir /var/big_data
[feng@Master ~]$ ls /var/
# 授予feng用户big_data文件夹的权限
[feng@Master ~]$ sudo chown -R feng:feng /var/big_data
2.2 修改配置文件
首先查看Hadoop的配置文件的位置,在/opt/hadoop-3.3.3/etc/hadoop
目录下:
本节内容主要针对Hadoop的配置文件进行修改,注意修改原则和最开始的部署规划搭建要一致。
2.2.0 全部命令
进入/opt/hadoop-3.3.3/etc/hadoop目录下执行以下命令:
# 首先进入root用户
[feng@Master ~]$ su root
1、为Hadoop提供JAVA解释器路径信息,主要目的是解决远程访问hadoop时候JAVA_HOME无法继承的问题
[root@Master ~]$ vim hadoop-env.sh
export JAVA_HOME=/usr/java/default
2、为Yarn任务、资源管理器提供Java运行环境
[root@Master ~]$ vim yarn-env.sh
export JAVA_HOME=/usr/java/default
3、配置HDFS主节点信息、持久化和数据文件的主目录
[root@Master ~]$ vim core-site.xml
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/var/big_data</value>
</property>
<!-- 配置HDFS网页登陆使用的静态用户为feng -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>feng</value>
<property>
</configuration>
4、配置HDFS默认的数据存放策略
[root@Master ~]$ vim hdfs-site.xml
<configuration>
<!-- nn Web端访问地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>Master:9870</value>
</property>
<!-- 2nn Web端访问地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Datanode03:9868</value>
</property>
</configuration>
5、配置mapreduce任务调度策略
[root@Master ~]$ vim mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
6、配置Yarn资源管理角色的信息
[root@Master ~]$ vim yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Datanode02</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_Y
ARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
7、配置datanode节点信息
[root@Master ~]$ vim slaves
Master
Datanode02
Datanode03
2.2.1 hadoop-env.sh
为Hadoop提供JAVA解释器路径信息,主要目的是解决远程访问hadoop时JAVA_HOME无法继承的问题
2.2.2 yarn-env.sh
为Yarn任务、资源管理器提供Java运行环境
2.2.3 core-site.xml
配置HDFS主节点信息、持久化和数据文件的主目录
2.2.4 hdfs-site.xml:
配置HDFS默认的数据存放策略
2.2.5 mapred-site.xml
配置mapreduce任务调度策略
2.2.6 yarn-site.xml
Yarn资源管理角色的信息
2.2.7 slaves
配置datanode节点信息
2.3 修改主机名并关机
2.3.1 修改主机名
用命令修改节点名/主机名如下:
[feng@Master ~]$ sudo vi /etc/hostname
# 将主机名替换为Master
Master
2.3.2 配置虚拟机域名解析
进入虚拟机的/etc/hosts
文件,设置IP与主机名对应:
[feng@Master ~]$ sudo vi /etc/hosts
# 将里面的全部内容替换为
192.168.31.200 Master
192.168.31.210 Datanode02
192.168.31.220 Datanode03
这里设置好之后,就可以使用ssh 主机名
进行登录啦。
2.3.3 关闭虚拟机
用sudo reboot
命令关闭当前虚拟机feng,或者直接在VMware中关闭虚拟机。
三、克隆
说明:本文采用先配置再克隆的方法,避免了挨个配置虚拟机的麻烦。
3.1 克隆配置好的虚拟机Master
进入VMware的Master的克隆界面,首先克隆第一台虚拟机命名为Datanode02:
然后按如下步骤完成克隆:
Datanode03虚拟机的克隆同理。
3.2 修改节点名和IP
开启Datanode02和Datanode03两台虚拟机,对Datanode02虚拟机,编辑如下:
注:这里因为还没修改hostname,所以虚拟机名称还是Master)
# 这里首先给出全部命令
# 修改主机名
[feng@Master ~]$ sudo vi /etc/hostname
# 仅替换为**Datanode02**即可
# 修改静态IP
[feng@Master ~]$ ifconfig
[feng@Master ~]$ sudo vi /etc/sysconfig/network-scripts/ifcfg-ens32
# 仅将**IPADDR=192.168.31.200**修改**IPADDR=192.168.31.210**这一行即可
# 重启网络服务
[feng@Master ~]$ service network restart
[feng@Master ~]$ ifconfig
修改Datanode02的静态IP,最后看到如下两个红框的IP改变即说明修改成功:
最后,对Datanode03虚拟机进行同样的操作即可:
# 修改主机名
[feng@Master ~]$ sudo vi /etc/hostname
# 仅替换为**Datanode03**即可
# 修改静态IP
[feng@Master ~]$ ifconfig
[feng@Master ~]$ sudo vi /etc/sysconfig/network-scripts/ifcfg-ens32
# 仅将**IPADDR=192.168.31.200**修改**IPADDR=192.168.31.220**这一行即可
# 重启网络服务
[feng@Master ~]$ service network restart
[feng@Master ~]$ ifconfig
四、配置集群ssh免密登录
4.1 配置虚拟机静态IP
Linux中网络配置相关文件的位置:
位置1(网络配置):/etc/sysconfig/network-scripts/ifcfg-ens32 # 这里的ens32也可能是ens33、ens36等等,根据自己虚拟机的网络名称来确定
位置2(DNS配置):/etc/resolv.conf
全部静态IP配置如下:
节点名 IP地址 Master 192.168.31.200 Datanode2 192.168.31.210 Datanode3 192.168.31.220
4.1.1 虚拟机VMware的网络编辑配置
在VMware的虚拟网络编辑器中编辑设置如下:
拓展:在Linux虚拟机中如何查看IP、网关、子网掩码etc
输入命令ifconfig
,可以看到IP、子网掩码和广播地址如下:
查看网关命令为route -n
:
输入ipconfig时报错:-bash: ifconfig: command not found
解决方法:这是因为该虚拟机缺少网络配置的相关组件,所以这里需要下载安装net-tools,命令如下:
[root@Master ~]$ yum search ifconfig
[root@Master ~]$ yum install net-tools.x86_64
4.1.2 编辑虚拟机网卡配置
输入命令对虚拟机网卡进行配置
[root@Master ~]$ vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 以下配置,有的就修改,没有的就加上
TYPE=Ethernet
BOOTPROTO=static
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.31.200
NETMASK=255.255.255.0
GATEWAY=192.168.31.2
DNS1=192.168.31.2
DNS2=114.114.114.114
参数解释
TYPE=Ethernet # 网络类型:以太网,默认就行,不用改 BOOTPROTO=static # ip设置为静态 DEVICE=ens32 # 网卡名,默认即可(也可以在ifconfig中查看) ONBOOT=yes # 设置开机自启动 IPADDR=192.168.31.200 # 自己任意设置的IP地址 NETMASK=255.255.255.0 # 子网掩码,在VMware的网络虚拟编辑器中查看 GATEWAY=192.168.31.2 # 网关,在VMware的网络虚拟编辑器中查看 DNS1=192.168.31.2 # 设置为跟网关一样即可 DNS2=114.114.114.114 # 国内免费DNS DNS3=8.8.8.8 # 谷歌免费DNS(可选)
本人的虚拟机完整参数配置如下,可供参考:
4.1.3 重启网络服务:
有如下两种命令进行网络服务重启
systemctl restart network 和 service network restart
重启后尝试ping一下百度,接收十几个包测试一下就行,手动按Ctrl+C终止ping操作:
但是,如果restart重启报错如下:
Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details.
解决方法:进入network-scripts目录查看该目录下的文件,发现有两个ifcfg-ensxx
,所以这里需要删除一个,根据前面ifconfig命令看到的是ens32,所以这里删除ens33文件夹。
然后再次重启网络服务即可成功,能看到这里的IP已经变为了自己手动设置的IP啦:
4.2 配置Windows域名解析
💡 注:如果这里不配置Windows上的域名解析,后续可能无法使用Windows物理机上的浏览器打开Hadoop网址
在Windows的如下目录C:\Windows\System32\drivers\etc
打开hosts文件,在最末尾添加以下内容:
192.168.31.200 Master
192.168.31.210 Datanode02
192.168.31.220 Datanode03
4.3 密钥配置
4.3.1 密钥生成
分别在三个虚拟机输入如下命令生成私钥、公钥:
# 密钥生成
[root@Master ~]$ ssh-keygen -t rsa # 点击三次enter即可
[root@Master ~]$ ssh Datanode1
[root@Datanode02 ~]$ ssh-keygen -t rsa # 点击三次enter即可
[root@Datanode02 ~]$ ssh Datanode2
[root@Datanode03 ~]$ ssh-keygen -t rsa # 点击三次enter即可
4.3.2 拷贝密钥到Master主机
然后依次退出Datanode02和Datanode03节点,回到Master主机,执行命令:
[root@Master ~]$ ls /home/feng/.ssh/ # 查看初始时.ssh目录下的文件
# 执行以下两行命令分别将Datanode02、Datanode03的密钥拷贝过来Master主机
[root@Master ~]$ scp feng@Datanode02:/home/feng/.ssh/id_rsa.pub /home/feng/.ssh/id_rsa.pub.Datanode02
[root@Master ~]$ scp feng@Datanode03:/home/feng/.ssh/id_rsa.pub /home/feng/.ssh/id_rsa.pub.Datanode03
# 查看是否拷贝成功,可以看到多了“id_rsa.pub.Datanode02 id_rsa.pub.Datanode03”两个文件
[root@Master ~]$ ls /home/feng/.ssh/
4.3.3 密钥交互
在Master主机中执行如下命令授权密钥来进行密钥交互:
[feng@Master ~]$ cd /home/feng/.ssh/ # 进入密钥配置目录
[feng@Master .ssh]$ cat id_rsa.pub >> authorized_keys
[feng@Master .ssh]$ cat id_rsa.pub.Datanode02 >> authorized_keys
[feng@Master .ssh]$ cat id_rsa.pub.Datanode03 >> authorized_keys
[feng@Master .ssh]$ chmod 644 authorized_keys # 更改密钥权限给当前用户(默认仅root用户)
# 复制密钥授权文件
[feng@Master .ssh]$ scp authorized_keys feng@Datanode02:/root/.ssh/authorized_keys
[feng@Master .ssh]$ scp authorized_keys feng@Datanode03:/root/.ssh/authorized_keys
Tips:如果你是在root用户中配置,相应的命令如下:
接着关闭防火墙,命令如下:
# 关闭Master主机的防火墙
[feng@Master ~]$ systemctl stop firewalld
[feng@Master ~]$ ssh Datanode02
# 关闭Datanode02节点的防火墙
[feng@Datanode02 ~]$ systemctl stop firewalld
[feng@Datanode02 ~]$ ssh Datanode03
# 关闭Datanode03节点的防火墙
[feng@Datanode03 ~]$ systemctl stop firewalld
4.4 免密登录测试
依次登录各节点,来测试是否能免密登录。如果能直接登录而不用输入密码,说明免密配置成功。
(严谨的可以按照1—>2、2—>3、3—>2、2—>1、1—>3、3—>1的思路来依次测试)。
五、集群配置
5.1 集群部署规划
Master | Datanode02 | Datanode03 | |
---|---|---|---|
HDFS | DataNode NameNode | Datanode | Datanode SecondaryNameNode |
Yarn | NodeManager | NodeManager ResourceManager | NodeManager |
History | HistoryServer |
5.2 编写xsync集群分发脚本
5.2.1 需求
需求:循环复制文件到所有节点的相同目录下
期望脚本:xsync 要同步的文件名称
5.2.2 脚本实现
在/home/feng/bin目录下创建xsync文件
[feng@Master ~]$ cd /home/feng
[feng@Master ~]$ mkdir bin
[feng@Master ~]$ cd bin
[feng@Master bin]$ vim xsync
在该文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in Master Datanode02 Datanode03
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
然后继续执行
# 1 修改脚本 xsync 具有执行权限
[feng@Master bin]$ chmod +x xsync
# 2 测试脚本
[feng@Master ~]$ xsync /home/feng/bin
# 3 将脚本复制到/bin中,以便全局调用
[feng@Master bin]$ sudo cp xsync /bin/
# 4 同步环境变量配置(root所有者)
[feng@Master ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
注意:如果用了sudo,那么xsync一定要给它的路径补全。
让环境变量生效
[feng@Master bin]$ source /etc/profile
[feng@Master opt]$ source /etc/profile
5.3 群起集群
5.3.1 配置workers
进入目录/opt/hadoop-3.3.3/etc/hadoop/修改workers配置:
# 进入Hadoop安装目录下的etc/hadoop/目录
[feng@Master ~]$ cd /opt/hadoop-3.3.3/etc/hadoop/
[feng@Master hadoop]$ vim workers
# 添加如下内容到末尾
Master
Datanode02
Datanode03
再同步workers配置到另外两个节点:
[feng@Master hadoop]$ xsync /opt/hadoop-3.3.3/etc
5.3.2 启动集群
💡 千万注意!!!
仅在第一次启动集群时,需要采用如下格式化命令。后续启动集群万万不可再次执行格式化,否则会报错,无法启动集群。
首次启动集群时,需要使用如下命令格式化主机节点Master:
[feng@Master hadoop-3.3.3]$ hdfs namenode -format
格式化完后,在配置的HDFS存储目录/var/big_data/
下会产生一个hdfs的文件夹:
然后使用如下命令启动:
# 在Master主节点上执行启动HDFS
[feng@Master hadoop-3.3.3]$ sbin/start-dfs.sh
# 在配置了ResourceManager的Datanode03节点上执行启动YARN
[feng@Datanode02 hadoop-3.3.3]$ sbin/start-yarn.sh
在Web端(可以用虚拟机的浏览器,如果配置了Windows物理机的IP地址映射也可以使用Windows的浏览器查看)查看HDFS的NameNode,查看HDFS的存储信息:http://Master:9870
在Web端查看Yarn的ResouceManager,查看Yarn上运行的Job信息:http://Datanode02:8088
5.3.3 集群基本测试:上传、下载、查看
5.3.3.1 上传
首先在/var/big_data/
目录下新建一个word.txt的文件,并编辑如下内容:
hadoop yarn
hadoop mapreduce
feng
yu
su
然后在hadoop中创建一个文件夹myinput,并上传上述word.txt文件和/home/feng/mysoftwares/
目录下的hadoop安装包(即hadoop-3.3.3-20220517.tar.gz文件)到该文件夹中:
[feng@Master ~]$ cd /var/big_data/
[feng@Master big_data]$ vim word.txt
[feng@Master ~]$ hadoop fs -mkdir /myinput
# 上传文件到myinput文件夹
[feng@Master ~]$ hadoop fs -put /var/big_data/word.txt /myinput
[feng@Master ~]$ hadoop fs -put /home/feng/mysoftwares/hadoop-3.3.3-20220517.tar.gz /myinput
Hadoop中查看创建的文件夹和上传的文件:
5.3.3.2 查看
在Master主节点上查看Hadoop上的word.txt文件内容
[feng@Master ~]$ cd /var/big_data/dfs/data/current/BP-1924136331-192.168.31.200-1691723490018/current/finalized/subdir0/subdir0
[feng@Master subdir0]$ pwd
/var/big_data/dfs/data/current/BP-1924136331-192.168.31.200-1691723490018/current/finalized/subdir0/subdir0
[feng@Master subdir0]$ ll
total 634872
-rw-rw-r-- 1 feng feng 134217728 Aug 11 11:16 blk_1073741825
-rw-rw-r-- 1 feng feng 1048583 Aug 11 11:16 blk_1073741825_1001.meta
-rw-rw-r-- 1 feng feng 134217728 Aug 11 11:16 blk_1073741826
-rw-rw-r-- 1 feng feng 1048583 Aug 11 11:16 blk_1073741826_1002.meta
-rw-rw-r-- 1 feng feng 134217728 Aug 11 11:16 blk_1073741827
-rw-rw-r-- 1 feng feng 1048583 Aug 11 11:16 blk_1073741827_1003.meta
-rw-rw-r-- 1 feng feng 134217728 Aug 11 11:16 blk_1073741828
-rw-rw-r-- 1 feng feng 1048583 Aug 11 11:16 blk_1073741828_1004.meta
-rw-rw-r-- 1 feng feng 108169686 Aug 11 11:17 blk_1073741829
-rw-rw-r-- 1 feng feng 845083 Aug 11 11:17 blk_1073741829_1005.meta
-rw-rw-r-- 1 feng feng 40 Aug 11 11:53 blk_1073741830
-rw-rw-r-- 1 feng feng 11 Aug 11 11:53 blk_1073741830_1006.meta
[feng@Master subdir0]$ cat blk_1073741830
hadoop yarn
hadoop mapreduce
feng
yu
su
[feng@Master subdir0]$
5.3.3.3 下载
首先,重命名hadoop上的word.txt文件,然后下载该myword.txt文件到Master虚拟机中:
[feng@Master ~]$ hadoop fs -mv /myinput/word.txt /myinput/myword.txt
[feng@Master ~]$ hadoop fs -get /myinput/myword.txt /var/big_data/
[feng@Master ~]$ ls /var/big_data/
dfs myword.txt nm-local-dir word.txt
当文件已经存在时,会无法下载覆盖(所以前面需要先重命名):
5.4 配置历史服务器
前提:启动了Hadoop集群。
全部代码执行如下:
# 配置Mapred-site.xml文件
[feng@Master hadoop]$ vim mapred-site.xml
# 分发配置
[feng@Master hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
# 启动历史服务器
[feng@Master hadoop]$ mapred --daemon start historyserver
# 查看历史服务器是否启动
[feng@Master hadoop]$ jps
文件Mapred-site.xml中添加如下配置(完整配置如下图):
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
在浏览器中http://master:19888/jobhistory
查看结果(前面Mapred-site.xml配置的19888端口):
5.5 配置日志的聚集
注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和 HistoryServer。
全部代码如下:
# 1、编辑并分发配置文件
[feng@Master ~]$ cd /opt/hadoop-3.3.3/etc/hadoop/
[feng@Master hadoop]$ vim yarn-site.xml
[feng@Master hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarnsite.xml
# 2、停止yarn服务
[feng@Master ~]$ ssh datanode02
[feng@Datanode02 ~]$ stop-yarn.sh
[feng@Datanode02 ~]$ exit
# 3、停止historyserver服务并重启hdfs服务
[feng@Master ~]$ mapred --daemon stop historyserver
[feng@Master ~]$ start-dfs.sh
# 4、重启yarn服务
[feng@Master ~]$ ssh datanode02
[feng@Datanode02 ~]$ start-yarn.sh
[feng@Datanode02 ~]$ jps
[feng@Datanode02 hadoop]$ exit
# 5、重启historyserver服务
[feng@Master ~]$ mapred --daemon start historyserver
[feng@Master ~]$ jps
# 6、删除已经存在的输出文件
[feng@Master ~]$ hadoop fs -rm -r /output
# 7、执行wordcount程序
[feng@Master ~]$ hadoop jar /opt/hadoop-3.3.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar wordcount /myinput /output
对yarn-site.xml文件的配置如下:
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://Master:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
执行wordcount程序:
查看wordcount结果:
运行结束查看Job作业运行历史记录:
历史服务器地址:http://master:19888/jobhistory
查看历史任务列表:
查看任务运行日志:
查看日志详情:
5.6 集群启动/停止方式汇总
根据前述资源规划:
Master | Datanode02 | Datanode03 | |
---|---|---|---|
HDFS | DataNode NameNode | Datanode | DataNode SecondaryNameNode |
Yarn | NodeManager | NodeManager ResourceManager | NodeManager |
History | HistoryServer |
首先,我们可以使用jps
命令查看当前正在运行的服务组件(注:以下为开启全部HDFS和Yarn组件后分别在三个节点输出的结果):
[feng@Master ~]$ jps
3825 NodeManager
2706 DataNode
6009 NameNode
6669 Jps
[feng@Datanode02 ~]$ jps
6480 ResourceManager
7144 Jps
4044 NodeManager
[feng@Datanode03 ~]$ jps
4608 Jps
4241 SecondaryNameNode
4329 NodeManager
集群整体启动/停止的命令:
# 整体启动/停止HDFS
[feng@Master ~]$ start-dfs.sh
[feng@Master ~]$ stop-dfs.sh
# 整体启动/停止Yarn
[feng@Datanode02 ~]$ start-yarn.sh
[feng@Datanode02 ~]$ stop-yarn.sh
如果想单独启动/停止某个服务组件,命令如下:
# HDFS的(下面的namenode可替换为datanode、secondarynamenode)
[feng@Master ~]$ hdfs --daemon start namenode
[feng@Master ~]$ hdfs --daemon stop namenode
# Yarn的(下面的resourcemanager可替换为nodemanager)
[feng@Datanode02 ~]$ yarn --daemon start resourcemanager
[feng@Datanode02 ~]$ yarn --daemon stop resourcemanager
5.7 配置Hadoop集群常用脚本
首先需要开启root权限编辑,否则无法保存脚本文件。全部命令如下:
# 开启root权限编辑,否则无法保存脚本文件
[feng@Master ~]$ su root
Password:
# 将自己编写的脚本文件全部保存至/home/feng/bin目录下
[root@Master feng]# cd /home/feng/bin
[root@Master bin]# pwd
/home/feng/bin
[root@Master bin]# ls
xsync
# hadoop启停脚本
[root@Master bin]# vim myhadoop.sh
# Java进程查看脚本
[root@Master bin]# vim jpsall
# 赋予两个脚本文件执行权限
[root@Master bin]# chmod +x myhadoop.sh
[root@Master bin]# chmod +x jpsall
[root@Master bin]# ls
jpsall myhadoop.sh xsync
# 分发脚本至另外两个节点,保证自定义脚本在三台机器上都可以使用
[root@Master bin]# xsync /home/feng/bin/
==================== Master ====================
root@master's password:
root@master's password:
sending incremental file list
sent 127 bytes received 17 bytes 41.14 bytes/sec
total size is 1,928 speedup is 13.39
==================== Datanode02 ====================
root@datanode02's password:
root@datanode02's password:
sending incremental file list
bin/
bin/jpsall
bin/myhadoop.sh
sent 1,429 bytes received 58 bytes 424.86 bytes/sec
total size is 1,928 speedup is 1.30
==================== Datanode03 ====================
root@datanode03's password:
root@datanode03's password:
sending incremental file list
bin/
bin/jpsall
bin/myhadoop.sh
sent 1,429 bytes received 58 bytes 594.80 bytes/sec
total size is 1,928 speedup is 1.30
[root@Master bin]#
5.7.1 Hadoop集群启停脚本:myhadoop.sh
注释:包含HDFS、Yarn、Historysever的启动与停止
编辑的myhadoop.sh脚本文件如下:
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input!"
exit;
fi
case $1 in
"start")
echo "\n================= 启动 hadoop集群 ================="
echo " ------------------- 启动 hdfs --------------------"
ssh Master "/opt/hadoop-3.3.3/sbin/start-dfs.sh"
echo " ------------------- 启动 yarn --------------------"
ssh Datanode02 "/opt/hadoop-3.3.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh Master "/opt/hadoop-3.3.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo "================= 关闭 hadoop集群 ================="
echo " --------------- 关闭 historyserver ---------------"
ssh Master "/opt/hadoop-3.3.3/bin/mapred --daemon stop historyserver"
echo " ------------------- 关闭 yarn --------------------"
ssh Datanode02 "/opt/hadoop-3.3.3/sbin/stop-yarn.sh"
echo " ------------------- 关闭 hdfs --------------------"
ssh Master "/opt/hadoop-3.3.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error!"
;;
esac
5.7.2 查看三台服务器Java进程脚本:jpsall
编辑的jpsall脚本文件内容如下:
#!/bin/bash
for host in Master Datanode02 Datanode03
do
echo =============== $host ===============
ssh $host jps
done
5.8 集群时间同步
说明:如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
5.8.1 主节点Master配置
# 1、查看所有节点ntpd服务状态和开机自启动状态
[feng@Master ~]$ sudo systemctl status ntpd
[feng@Master ~]$ sudo systemctl start ntpd
[feng@Master ~]$ sudo systemctl is-enabled ntpd
# 2、修改Master的ntp.conf配置文件
[feng@Master ~]$ sudo vim /etc/ntp.conf
# 3、修改Master的/etc/sysconfig/ntpd文件
[feng@Master ~]$ sudo vim /etc/sysconfig/ntpd
# 4、重新启动ntpd服务
[feng@Master ~]$ sudo systemctl start ntpd
# 5、设置ntpd服务开机自启动
[feng@Master ~]$ sudo systemctl enable ntpd
-
对/etc/ntp.conf配置文件修改如下①②,添加③,共三处:
-
对/etc/sysconfig/ntpd文件添加如下内容:
SYNC_HWCLOCK=yes
5.8.2 其他两个节点的配置
对Datanode02节点进行配置:
# 1、关闭所有节点上的ntp服务和自启动
[feng@Datanode02 ~]$ sudo systemctl stop ntpd
[sudo] password for feng:
[feng@Datanode02 ~]$ sudo systemctl disable ntpd
# 2、在Datanode02节点配置每隔一分钟与时间服务器同步一次
[feng@Datanode02 ~]$ sudo crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
# 编辑定时任务命令如下:【*/1 * * * * /usr/sbin/ntpdate Master】
# 3、修改为任意时间来测试
[feng@Datanode02 ~]$ sudo date -s "2022-11-11 11:11:11"
Fri Nov 11 11:11:11 CST 2022
# 4、一分钟后查看机器是否已经与时间服务器同步
[feng@Datanode02 ~]$ sudo date
Thu Aug 17 18:39:38 CST 2023
编辑定时任务命令如下:
*/1 * * * * /usr/sbin/ntpdate Master
在Datanode03节点上的配置同理。
Last、一些可能的报错情况
报错1:集群启动异常
原因:
2023-08-11 09:26:35,196 ERROR conf.Configuration: error parsing conf core-site.xml
在/opt/hadoop-3.3.3/etc/hadoop/
目录下找到core-site.xml文件,如下,显然是细节问题
解决:
将core-site.xml文件中如上部分的<property>
修改为</property>
,然后保存修改,并使用xsync分发修改到另外两个节点即可解决问题。
[feng@Master hadoop-3.3.3]$ xsync /opt/hadoop-3.3.3/etc/hadoop/
报错02:Windows物理机无法解析虚拟机地址
原因:
Windows物理机中未添加虚拟机的IP地址映射。
解决:
在C:\Windows\System32\drivers\etc
目录下配置hosts文件,添加如下的IP地址映射,即可解决问题。