文章目录
一、前提说明
因为本人在学习Hadoop的时候,因为web端的yarn的resourcemanager无法连接,在试完网上那些解决方法后发现又把自己web端的HDFS给搞得连接不上了。
- 主机可以ping各节点
- 虚拟机可以ping外网
- 防火墙以关闭
- 配置也没错
最最重要的是我特么忘记保存快照了!
所以,特此借此机会再配置一次Hadoop分布式集群再熟悉熟悉,并把这篇文章当作笔记使用。
二、准备工作
先准备好:虚拟机、Linux镜像、Hadoop压缩包、远程访问工具。
我用的虚拟机是VMware 16、Linux镜像是CentOS 7、远程访问根据是Xshell与xftp
三、开始
1 安装虚拟机
- 先打开VMware,新建虚拟机,选择自定义安装,然后下一步:
- 下一步
- 选择
安装程序映像文件
,然后点击浏览找到准备的Linux镜像,然后下一步:
- 然后来到
命名虚拟机
的界面,第一个框输入这个虚拟机的名称,第二个框是选择虚拟机储存的位置,完成后就下一步:
- 然后来到
处理器配置
页面,按照自己电脑的配置来,电脑垃圾就配低点,电脑牛逼就配高点
打开自己电脑的任务管理器,就可以看到自己的处理器是怎样的了(内存也一样):
因为是要配置集群,这边打算配置三个节点(就是三个虚拟机),所以配给这三个虚拟机的资源总和不能高于自己电脑的! ,最好还余下足够自己电脑运行的配置资源。
不是说给虚拟机配置了多少它就会拿走多少,这里的配置只是设置虚拟机的资源上限,就是怕万一那几台虚拟机都把资源占满了弄崩了系统什么的…这里就不细说了。
-
这里选第二个,然后下一步
-
磁盘容量也是根据自己的电脑配置来的,然后下一步:
-
选择
Install CentOS 7
然后回车(如果要将输入定向到该虚拟机,请在虚拟机内部单机或按Ctrl
+G
):
-
我英文不行,所以选择中文:
-
点击软件选择,来到该页面后选择
虚拟化主机
,这里看个人喜好(如果不适应命令行,可以选择
GNOME桌面
的选项):选择后点击完成
-
然后点击
网络和主机名
,打开网络连接:
-
点击
安装位置
,我选择的是自动分区,虚拟机配置完成后,就点击开始安装
。
然后设置ROOt密码,密码越好记越好,毕竟也没人会来入侵我们这种没有任何价值的电脑。
等待一段时间后就完成了:
-
重启后,这个页面是输入用户名,这里我使用root用户:
再输入密码,这个输入的密码是看不见的,对着键盘按就行了:
虚拟机安装完成! -
使用命令
ifconfig
查看当前虚拟机的IP,然后打开远程连接工具Xshell,新建连接,再根据此虚拟机的IP号填入主机(H)
框:
因为有些命令太长,Linux终端里不能复制粘贴命令,所以使用远程连接软件会好很多。
15. 再然后选择左边的类别下的用户身份验证,输入用户和密码,这样下次就可以无密码连接了:
16. 这里来个快照,如果后面搞砸了可以使用快照回到这一步
右键VMware里的 虚拟机 --> 快照 --> 快照拍摄
2 Hadoop运行环境搭建
2.1 ping
在配置前需要确定虚拟机可以上网:
进入Xshell后,连接虚拟机,然后输入指令
ping baidu.com
,用以测试该虚拟机是否能连上外网:(要停止的话按Ctrl
+C
,强制中断程序)
上图就是可以连接外网,如果不能ping通外网的话建议看看是否操作了“安装虚拟机的第6步和第11步”,
2.2 安装软件
- 安装EPEL-Extra Packages for Enterprise Linux
yum install -y epel-release
文档 - 如果Linux安装的是最小系统版,还需要安装如下工具;如果安装的是Linux桌面标准版,不需要执行 如下操作:
① 安装net-tools工具包
yum install -y net-tools
② 安装vim编辑器
yum install -y vim
2.3 关闭防火墙
关闭防火墙指令:
systemctl stop firewalld
如果需要关闭防火墙开机自启动,可以使用这个指令:
systemctl disable firewalld.service
2.4 创建普通用户
因为root用户的权限太高,可以对Linux做出很多操作,怕万一操作失误把系统弄崩了,所以最好使用普通用户。
-
创建新用户:
useradd 用户名
-
设置新用户的密码:
passwd 用户名
可以看到在/home目录下有了该用户。 -
删除用户:
userdel -r 用户名
,这个命令只能由root用户来执行,所以需要先切换到root用户,然后删除普通用户。
可以看到/home目录下的hh没了。 -
配置用户具有root权限,方便后面执行root权限的命令(这并不代表该用户就是跟root一样了)
修改/etc/sudoers文件:vim /etc/sudoers
在上图的位置添加你的用户名 ALL=(ALL) NOPASSWD:ALL
2.5修改虚拟机IP为静态
刚刚出去吃个饭,回来Xshell就连不上虚拟机了,然后不出所料,虚拟机的IP地址变了:
-
使用指令:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
更改该文件的配置将BOOTPROTO的值更改为“static”
再在末尾添加以下参数:
IPADDR=192.168.10.102
GATEWAY=192.168.10.2
DNS1=192.168.10.2
DNS2=119.29.29.29完成后就是这样的:
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" #将此处的默认值更改为“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="d77fea30-c9d2-4407-bfe6-79b8b51d4ccc" DEVICE="ens33" ONBOOT="yes" # 添加下面的键值 IPADDR=192.168.10.111 GATEWAY=192.168.10.2 DNS1=192.168.10.2 DNS2=8.8.8.8
-
查看Linux虚拟机的虚拟网络编辑器,编辑->虚拟网络编辑器->VMnet8
子网IP:192.168.10.0
子网掩码:255.255.255.0
然后点击NAT设置,将网关IP设置为192.168.10.2
这样就OK了。
3. 查看Windows系统适配器VMware Network Adapter VMnet8的IP地址
保证Linux系统ifcfg-ens33文件中IP地址、虚拟网络编辑器地址和Windows系统VM8网络IP地址相同。
2.6 安装hadoop、JDK
在 /opt目录下创建module、software目录,并修改所属主和所属组:
- 创建目录指令:
mkdir 目录名
(因为截图太麻烦了,所以就复制粘贴控制台)
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir module
[root@localhost opt]# mkdir software
[root@localhost opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 4月 18 19:58 module
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
drwxr-xr-x. 2 root root 6 4月 18 19:58 software
[root@localhost opt]#
module目录
用来储存应用程序
software目录
用来储存应用程序的安装包
- 修改module、software文件夹的所有者和所属组均为hh
指令:chown hh:hh 目录地址
[@localhost opt]# chown hh:hh ./module
[root@localhost opt]# chown hh:hh ./software
[root@localhost opt]# ll
总用量 0
drwxr-xr-x. 2 hh hh 6 4月 18 19:58 module
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
drwxr-xr-x. 2 hh hh 6 4月 18 19:58 software
-
切换用户,使用普通用户进行接下来的操作
指令:su 用户名
-
安装JDK(注意:安装JDK前,一定确保提前删除了虚拟机自带的JDK。)
-
用XShell传输工具将JDK导入到opt目录下面的software文件夹下面
完成后来到/opt/software/目录下,使用指令
ll
查看该目录下是否有JDK的压缩包[hh@192 software]# cd /opt/software/ [hh@192 software]# ll 总用量 219548 -rw-r--r--. 1 hh hh 29800905 4月 18 21:00 hadoop-3.1.3-src.tar.gz -rw-r--r--. 1 hh hh 195013152 4月 18 21:00 jdk-8u212-linux-x64.tar.gz [root@192 software]#
-
解压JDK到/opt/module/目录下
指令:tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
-
配置JDK环境变量,在/etc/profile.d/ 创建文件my_env.sh用来储存自己的配置参数
指令:vim /etc/profile.d/my_env.sh
创建完成后在该文件里添加以下内容:
#JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_212 export PATH=$PATH:$JAVA_HOME/bin
-
让新的环境变量PATH生效
指令:source /etc/profile
-
测试JDK是否安装成功
指令:java -version
[hh@192 ~]# source /etc/profile [hh@192 ~]# java -version java version "1.8.0_212" Java(TM) SE Runtime Environment (build 1.8.0_212-b10) Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode) [hh@192 ~]#
-
-
安装Hadoop
-
用XShell文件传输工具将hadoop-3.1.3.tar.gz导入到opt目录下面的software文件夹下面
-
完成后来到/opt/software/目录下,使用指令
ll
查看该目录下是否有Hadoop的压缩包 -
解压到 /opt/module/ 目录下:
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
-
查看是否解压完成:
ls /opt/module/
-
将Hadoop添加到环境变量
打开/etc/profile.d/my_env.sh文件:sudo vim /etc/profile.d/my_env.sh
在末尾添加以下内容:
#HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-3.1.3 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin
让修改后的文件生效:
source /etc/profile
测试是否安装成功:hadoop version
[hh@192 module]$ sudo vim /etc/profile.d/my_env.sh [hh@192 module]$ source /etc/profile [hh@192 module]$ hadoop version Hadoop 3.1.3 Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r ba631c436b806728f8ec2f54ab1e289526c90579 Compiled by ztang on 2019-09-12T02:47Z Compiled with protoc 2.5.0 From source with checksum ec785077c385118ac91aadde5ec9799 This command was run using /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-common-3.1.3.jar
-
3 本地模式运行
- 来到 /opt/module/hadoop-3.1.3/ 目录下:
创建一个test文件夹:mkdir test
- 在test目录下创建一个文件 word.txt,在里面写入:
保存后退出,回到/opt/module/hadoop-3.1.3/ 目录下,执行Hadoop命令:apple apple banana dog dog apple cat
统计test文件里的每个单词hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount test WCoutput
这个jar文件是Hadoop里统计每个单词出现的数量的程序,在后面学MapReduce会详细学到。 - 在刚刚创建test目录时,hadoop-3.1.3目录下是没有WCoutput目录的:
在执行完统计单词出现次数的命令后,hadoop-3.1.3目录下就多出个 WCoutput目录了:[hh@192 module]$ cd /opt/module/hadoop-3.1.3/ [hh@192 hadoop-3.1.3]$ mkdir test [hh@192 hadoop-3.1.3]$ ls bin etc include lib libexec LICENSE.txt NOTICE.txt README.txt sbin share test
进入到WCoutput目录下,查看输出的统计文件[hh@192 hadoop-3.1.3]$ ls bin etc include lib libexec LICENSE.txt NOTICE.txt README.txt sbin share test WCoutput
part-r-00000
的内容
apple出现了3次、banana出现了1次、cat出现了一次、dog出现了2次[hh@192 hadoop-3.1.3]$ cd WCoutput [hh@192 WCoutput]$ ls part-r-00000 _SUCCESS [hh@192 WCoutput]$ cat part-r-00000 apple 3 banana 1 cat 1 dog 2 [hh@192 WCoutput]$
4 完全分布式搭建
4.1 克隆之前准备好的虚拟机“node1”
步骤:右击node1 --> 管理 --> 克隆(在克隆前记得将虚拟机关闭)–> 创建完整克隆
而至于为什么要准备多台虚拟机,我认为读一下《Hadoop权威指南 4》的 第一章:初识Hadoop 即可做大致的了解。
4.2 修改主机名称
在各个虚拟机的终端里输入命令hostname
和ifconfig
,来查看本机的主机名和地址,但是可以发现,这三个虚拟机的主机名和IP地址是一样的。
所以要将他们的主机名和IP地址更改为不同以避免后面操作的冲突:
-
修改配置文件 /etc/hostname
使用命令
vim /etc/hostname
,然后将该主机的旧名字清空,再写入新名字,保存退出即可。
node1、node2、node3都执行一次我是将第一个虚拟机的主机名称设置为了node1,第二个设置为了node2,第三个node3。
-
修改那两个克隆机的IP地址
使用命令:vim /etc/sysconfig/network-scripts/ifcfg-ens33
来到设置静态地址的地方,只要将文件中,IPADDR参数后的值改为需要的IP地址然后保存退出即可。
我的三个虚拟机分别是:
然后重启各虚拟机,再查看一下主机名称和地址是否都更改为自己设置的了。
4.3 集群分发脚本
用Xshell连接各虚拟机,默认使用普通用户登陆,如果需要root权限修改配置的话使用su root
命令即可。
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器,机器名就是自己配置的各个虚拟机的主机名
for host in 主机名1 主机名2 主机名3
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
以上shell脚本的作用是可以将本节点(本地主机)的文件的修改和添加同步到另外两个节点(另外两个虚拟机)。
不过在此之前,需要先配置主机映射 /etc/hosts:
-
使用命令:
vim /etc/hosts
在文件末尾添加:192.168.10.111 node1 192.168.10.112 node2 192.168.10.113 node3
前面的是IP地址,后面跟着是对应的主机名(记得保存)。
完成后是这样的:
-
在普通用户的家目录下创建一个 bin目录,用来储存脚本程序
命令:mkdir /home/hh/bin/
创建完目录后,进入bin目录,创建脚本文件 xsync
命令:vim xsync
然后将上方的代码复制粘贴进编辑页面处即可。(提醒:注意在粘贴前先让vim进入插入模式,有Linux基础的应该都清楚)添加可执行权限:
chmod +x xsync
注意:一定一定要配置好主机映射文件,如果没配置不仅这个脚本没有用,而且后面集群都开启不了。
-
使用脚本
这时,我一直操作的都是node1,另外两个节点是没有这个/home/hh/bin目录和这个脚本文件的。
将 /home/hh/bin 目录与其它节点同步:xsync /home/hh/bin/
然后根据出现的提示输入对应的值即可。hh@node1’s password: — 就是输入honde1节点中用户hh的密码
Are you sure you want to continue connecting (yes/no)? — 输入yes或者no,yes继续,no中断。完成后看看其它节点上的 /hmoe/hh 目录下是否也有了bin目录,bin目录里是否也有了xsunc脚本。
如果想的话可以将脚本复制到/bin中,以便全局调用:
sudo cp /home/hh/bin/xsync /bin/
然后同步环境配置:sudo ./bin/xsync /etc/profile.d/my_env.sh
最后每个节点都执行命令source /etc/profile
让环境生效
(八千多字了,还没搞完,歇会)
4.4 ssh免密连接
-
ssh连接
命令:ssh 需要连接的主机IP
,
例如:
当然,配置了主机映射是可以直接使用主机名的:ssh 主机名
[hh@node1 ~]$ ssh node2 hh@node2's password: Last login: Tue Apr 19 14:39:50 2022 from node1 [hh@node2 ~]$ hostname node2 [hh@node2 ~]$ exit 登出 Connection to node2 closed. [hh@node1 ~]$
-
配置免密连接
来到 /home/hh/.ssh目录下,使用命令ssh-keygen -t rsa
生产公钥和私钥
如图:id_rsa是私钥,id_rsa.pub是公钥然后再将公钥拷贝到所有虚拟机上,这样才能免密连接其它主机(私钥不要乱给别人):
ssh-copy-id node1 ssh-copy-id node2 ssh-copy-id node3
然后根据提示输入相应的值就行,然后试试用node1看看能不能免密连接node3:
[hh@node1 .ssh]$ ssh node3 Last login: Tue Apr 19 14:36:41 2022 from 192.168.10.15 [hh@node3 ~]$
完成!
但这只是普通用户hh可以免密连接其它机器而已,如果想让root也免密则就需要使用root用户也操作一边。
#第一步:先来到该目录 cd /root/.ssh 第二步:生产密钥和公钥 ssh-keygen -t rsa #第三步:将公钥拷贝到所有虚拟机上 ssh-copy-id node1 ssh-copy-id node2 ssh-copy-id node3
注意:以上的免密操作在node1配置完后,在node2、node3也都要配置一边,以达到三个机器之间可以互相免密连接。
4.5 集群配置
Hadoop框架中主要由三大组件组成:
- HDFS
- Yarn
- MapReduce
- HDFS
HDFS是Hadoop框架中的分布式文件系统,用于存储文件数据,通过目录树来定位文件。
- Yarn
Hadoop集群中的资源调度器,主要作用是给运算任务分配运算资源。
- MapReduce
MapReduce是一个分布式运算程序的编程框架,简单来说作用是用来处理计算文件数据。
当然,我只是提一下这些组件,毕竟这篇文章只是环境配置记录。
4.5.1 配置规划
node1 | node2 | node3 | |
---|---|---|---|
HDFS | NameNode(nn) DataNode | DataNode | SecondaryNameNode(2nn) DataNode |
Yarn | NodeManager | ResourceManager NodeManager | NodeManager |
因为穷啊!不得已让每个节点都当DataNode, | |||
注意:NameNode不能和SecondaryNameNode配在一起,不然SecondaryNameNode的作用就无效了。 |
4.5.2 配置文件
既然来到这里,就不得不说明一下Hadoop中各个目录所储存的文件类型了:
[hh@node1 hadoop]$ cd /opt/module/hadoop-3.1.3/
[hh@node1 hadoop-3.1.3]$ ll
总用量 176
drwxr-xr-x. 2 hh hh 183 9月 12 2019 bin
drwxr-xr-x. 3 hh hh 20 9月 12 2019 etc
drwxr-xr-x. 2 hh hh 106 9月 12 2019 include
drwxr-xr-x. 3 hh hh 20 9月 12 2019 lib
drwxr-xr-x. 4 hh hh 288 9月 12 2019 libexec
-rw-rw-r--. 1 hh hh 147145 9月 4 2019 LICENSE.txt
-rw-rw-r--. 1 hh hh 21867 9月 4 2019 NOTICE.txt
-rw-rw-r--. 1 hh hh 1366 9月 4 2019 README.txt
drwxr-xr-x. 3 hh hh 4096 9月 12 2019 sbin
drwxr-xr-x. 4 hh hh 31 9月 12 2019 share
drwxrwxr-x. 2 hh hh 22 4月 18 21:44 test
drwxr-xr-x. 2 hh hh 88 4月 18 21:50 WCoutput
[hh@node1 hadoop-3.1.3]$
- bin目录:存放对Hadoop相关服务(hdfs,yarn,mapred)进行操作的脚本
- etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
- lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
- sbin目录:存放启动或停止Hadoop相关服务的脚本
- share目录:存放Hadoop的依赖jar包、文档、和官方案例
因此,要配置Hadoop集群,就应该来到etc目录下:
[hh@node1 hadoop-3.1.3]$ cd etc
[hh@node1 etc]$ ls
hadoop
[hh@node1 etc]$ cd hadoop
[hh@node1 hadoop]$ ls
capacity-scheduler.xml httpfs-log4j.properties mapred-site.xml
configuration.xsl httpfs-signature.secret shellprofile.d
container-executor.cfg httpfs-site.xml ssl-client.xml.example
core-site.xml kms-acls.xml ssl-server.xml.example
hadoop-env.cmd kms-env.sh user_ec_policies.xml.template
hadoop-env.sh kms-log4j.properties workers
hadoop-metrics2.properties kms-site.xml yarn-env.cmd
hadoop-policy.xml log4j.properties yarn-env.sh
hadoop-user-functions.sh.example mapred-env.cmd yarnservice-log4j.properties
hdfs-site.xml mapred-env.sh yarn-site.xml
httpfs-env.sh mapred-queues.xml.template
[hh@node1 hadoop]$
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
-
自定义配置文件如下
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml -
默认的配置文件如下:
core-default.xml、hdfs-default.xml、yarn-default.xml、mapred-default.xml
默认配置文件文件存放在Hadoop的jar包中的位置,如果想看可以上这些位置看:
/opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-common-3.1.3.jar/core-default.xml
/opt/module/hadoop-3.1.3/share/hadoop/hdfs/hadoop-hdfs-3.1.3.jar/hdfs-default.xml
/opt/module/hadoop-3.1.3/share/hadoop/yarn/hadoop-yarn-common-3.1.3.jar/yarn-default.xml
/opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml
4.5.3 配置core-site.xml
注意:当前目录位置是:/opt/module/hadoop-3.1.3/etc/hadoop
使用命令:vim core-site.xml
,编辑自定义文件,然后将下面一段参数粘贴到
<configuration></configuration>
标签中然后保存退出。
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为hh -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hh</value>
</property>
我的是这样的:
4.5.4 配置hdfs-site.xml
使用命令:vim hdfs-site.xml
,更改该配置文件,然后将下面一段参数粘贴到
<configuration></configuration>
标签中然后保存退出。
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>node1:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node3:9868</value>
</property>
我的是这样的:
4.5.5 配置yarn-site.xml
使用命令:vim yarn-site.xml
,更改该配置文件,然后将下面一段参数粘贴到
<configuration></configuration>
标签中然后保存退出。
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node2</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>
我的:
4.5.6 配置mapred-site.xml
更改配置文件:vim mapred-site.xml
插入:
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
我的:
4.5.7 同步所有虚拟机的配置
- 因为刚刚我只是在node1上完成配置文件的修改了,但是另外两个主机还是默认的,所以这里就可以用到之前编写的集群分发脚本:
xsync /opt/module/hadoop-3.1.3/etc/hadoop/
意为:同步所有虚拟机上该位置的文件
然后查看一下另外两个虚拟机上的配置文件是否跟node1一样了:
- nod2:
[hh@node2 ~]$ cd /opt/module/hadoop-3.1.3/etc/hadoop/ [hh@node2 hadoop]$ vim yarn-site.xml
- node3:
[hh@node3 ~]$ cd /opt/module/hadoop-3.1.3/etc/hadoop/
[hh@node3 hadoop]$ vim hdfs-site.xml
4.5.8 群起集群
- 先配置workers:
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
粘贴一下内容:
node1
node2
node3
分别是三个主机的名称。
- 同步配置文件workers:
xsync /opt/module/hadoop-3.1.3/etc
- 启动集群
注意:此时,我是在/opt/module/hadoop-3.1.3路径下,使用普通用户nn来操作的;
如果集群是第一次启动,需要在node1虚拟机处格式化NameNode:hdfs namenode -format
启动HDFS(node1):sbin/start-dfs.sh
启动YARN(node2):sbin/start-yarn.sh
关闭所有:sbin/stop-all.sh
查看程序进程(可以查看当前节点上的组件是否成功开启):jps
- Web端查看HDFS的NameNode(主节点)和YARN的ResourceManager
nn:http://node1:9870
rm:http://node2:8088
看图:
4.5.9 web端测试
来到web端的HDFS,点击最右边的Utilities
,然后点击Browse the file system
:
就会来到这个页面:
这就是hadoop的分布式文件系统的具象化(反正我觉得HDFS挺抽象的),可以在这个页面上操作文件数据。
譬如,上传本地(Windows电脑)的文件:
选择要上传的文件,然后点击Upload
即可,如果没反应就刷新一下
4.5.10 节点客户端测试
来到主机node1,使用命令:hadoop fs -mkdir /input
,在集群上创建目录input
上传虚拟机里的jdk安装包到HDFS的 /inpu 目录里去:
hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /input
想要了解更多操作命令可以去Apache Hadoop的官网。
4.6 配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。
来到主机node1。
-
配置mapred-site.xml
命令:vim /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml
然后添加如下参数:<!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop102:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop102:19888</value> </property>
我的是这样的:
然后同步配置:
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
再是开启历史服务器:mr-jobhistory-daemon.sh start historyserver
使用jps
指令查看组件是否成功开启:[hh@node1 ~]$ jps 11074 Jps 11012 JobHistoryServer <--- 这个就是 9237 DataNode 9529 NodeManager 9082 NameNode
-
查看web端jobhistory
http://node1:19888/jobhistory
4.7 配置日志聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
来到node1。
- 配置yarn-site.xml
使用命令:vim /opt/module/hadoop-3.1.3/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://node1:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
-
我的是这样的:
-
然后同步配置:
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
还记得之前本地模式运行的word.txt文件吗?它在 /opt/module/hadoop-3.1.3/test目录里,里面的内容是:
apple apple
banana dog
dog apple
cat
- 这次将该文件上传到集群中的 /input 目录中去:
[hh@node1 test]$ hadoop fs -put /opt/module/hadoop-3.1.3/test/word.txt /input
然后可以看到web端的HDFS上的 /input 目录多出了个 word.txt文件:
5. 然后执行WordCount程序,统计该文件里每个单词出现的次数:
[hh@node1 test]$ cd /opt/module/hadoop-3.1.3/
[hh@node1 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input/word.txt /output
第一行是来到hadoop-3.1.3目录下,第二命令是执行WordCount程序,将集群中的/input/word.txt文件里的单词统计结果放到 /output 目录里。
-
可以看到HDFS里多出了 /output目录,下面00000结尾的文件就是储存的结果
-
查看历史服务地址:http://node1:19888/jobhistory
多出了一条记录,这就是刚刚统计单词的程序的记录:
这就是详细信息:
4.8 集群启动/停止方式总结
- 整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
- 整体启动/停止YARN
start-yarn.sh/stop-yarn.sh
- 分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
- 启动/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
4.9 Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver)
- 脚本代码:主要作用说在一台主机上就能将所有的组件开启,不用去其它主机上开启各个组件
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh node1 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh node2 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh node1 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh node1 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh node2 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh node1 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
-
脚本指令:
启动集群(启动集群上各个节点的所有组件):myhadoop.sh start
关闭集群(关闭集群上各个节点的所有组件):myhadoop.sh stop
-
操作步骤:
[hh@node1 bin]$ cd /home/hh/bin
[hh@node1 bin]$ vim myhadoop.sh
[hh@node1 bin]$ chmod +x myhadoop.sh
[hh@node1 bin]$ myhadoop.sh stop
=================== 关闭 hadoop集群 ===================
--------------- 关闭 historyserver ---------------
--------------- 关闭 yarn ---------------
Stopping nodemanagers
node1: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
node3: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
Stopping resourcemanager
--------------- 关闭 hdfs ---------------
Stopping namenodes on [node1]
Stopping datanodes
Stopping secondary namenodes [node3]
[hh@node1 bin]$ jps
12987 Jps
[hh@node1 bin]$ myhadoop.sh start
=================== 启动 hadoop集群 ===================
--------------- 启动 hdfs ---------------
Starting namenodes on [node1]
Starting datanodes
Starting secondary namenodes [node3]
--------------- 启动 yarn ---------------
Starting resourcemanager
Starting nodemanagers
--------------- 启动 historyserver ---------------
[hh@node1 bin]$ jps
13874 JobHistoryServer
13399 DataNode
13241 NameNode
13690 NodeManager
13947 Jps
[hh@node1 bin]$
4.10 查看所有主机进程脚本
代码如下:主要作用是只在一台主机上使用该脚本就能看到所有主机里的程序进程
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
步骤:
[hh@node1 bin]$ vim jpsall
[hh@node1 bin]$ chmod +x jpsall
[hh@node1 bin]$ jpsall
=============== node1 ===============
1879 Jps
=============== node2 ===============
1881 Jps
=============== node3 ===============
1863 Jps
[hh@node1 bin]$
4.11 集群时间同步
将其它所有节点的时间与NameNode同步,NameNode是几点其它节点的时间也要是几点。
提示:时间服务器配置必须root用户。
-
先查看所有节点ntpd服务状态和开机自启动状态
查看状态:systemctl status ntpd
开启服务:systemctl start ntpd
开机启动:systemctl is-enabled ntpd
如果输入指令发生以下错误,可能是因为没有安装ntp,因此需要先在各个节点安装ntp服务:
安装ntp:yum -y install ntp
-
如图所示,这样才是开启了ntpd服务
-
修改node1(NameNode所在的那个节点)的ntp.conf配置文件
授权192.168.10.0-192.168.10.255网段上的所有机器可以从这台机器上查询和同步时间:
先使用指令:vim /etc/ntp.conf
,来到配置文件里;
然后将:以下字段的注释号(#)去掉: #restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap 将以下字段全部注释起来(添加 # ): server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst 最后将以下字段添加到文件末尾: server 127.127.1.0 fudge 127.127.1.0 stratum 10
如图:原来是这样的
修改之后是这样的:
完成后保存退出。
-
接着修改node1的 /etc/sysconfig/ntpd 文件
使用命令vim /etc/sysconfig/ntpd
,来到对应的文件下;
然后添加内容:SYNC_HWCLOCK=yes
;
再是重启ntpd服务:systemctl start ntpd
;
最后开启ntpd开机自启:systemctl enable ntpd
-
关闭除了node1之外的所有节点上ntp服务和自启动
关闭服务:systemctl stop ntpd
关闭自启动:systemctl disable ntpd
node2和node3都要执行一遍。 -
配置定时任务:
crontab -e
添加一行字段:*/1 * * * * /usr/sbin/ntpdate hadoop102
,保存后退出;
这时就可以更改node2或者node3的时间,测试一下一分钟后他们的时间会不会与node1同步:
node1的时间:可以看到时间是同步的
四、配置完毕
现在我的集群已经弄好了,web端的各组件都可以使用。
不过记得,一定一定要拍快照,不然这从头再配一次是真的难受!