一、说明
在前一篇hadoop虚拟机第一次部署完成后,接下来就是搭建hadoop集群,本次搭建三台虚拟机构成一个集群实现完全分布式运行模式,三台虚拟机分别是hadoop112、hadoop213、hadoop214。
二、在hadoop112上安装JDK
1、上传jdk、hadoop安装包
将本地下载好的JDK和Hadoop(为了下面hadoop安装)的jar包通过xftp传到hadoop112虚拟机的 /opt/software 目录下。(jar包下载资源在我博客内,需要的自行下载。)
2、进入/opt/software 目录查看安装包
3、将jdk安装包解压到 /opt/module 目录下
[jojo@hadoop112 software]$ tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module
4、配置jdk环境变量
(1)新建 /etc/profile.d/my_env.sh文件
[jojo@hadoop112 module]$ sudo vim /etc/profile.d/my_env.sh
//一定要加上sudo否则进去编写完后无法保存退出,原因见无法写入并保存的解决方法
在my_env.sh文件中填写下面内容:
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
(2) source一下/etc/profile文件,让新的环境变量PATH生效
[jojo@hadoop112 ~]$ source /etc/profile
(3)查看jdk版本 java -version
安装成功!
注意:如果 java -version 不可用重启一下试试。
三、在hadoop112上安装Hadoop
1、将hadoop安装包解压到 /opt/module 目录下
由于第二步已经将hadoop安装包下载到 /opt/software 目录下,所以只需将hadoop解压到 /opt/module 目录下即可。
[jojo@hadoop112 software]$ tar -zxvf hadoop-3.3.4.tar.gz -C /opt/module
//注意所在目录
2、配置hadoop环境变量
(1)编辑 /etc/profile.d/my_env.sh文件
在文件中追加以下内容:
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.3.4
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
(2) source一下/etc/profile文件,让新的环境变量PATH生效
[jojo@hadoop112 software]$ source /etc/profile
(3)检查是否配置成功
[jojo@hadoop112 software]$ hadoop version
四、克隆虚拟机
1、克隆出hadoop213、hadoop214
通过hadoop112克隆出两台虚拟机,改名为hadoop213和hadoop214。
2、修改hadoop213、hadoop214的主机名和ip
克隆出来的两台虚拟机虽然外面名字已经改为hadoop213和hadoop214,但是登录虚拟机后仍是hadoop112,所以需要更改虚拟机的主机名和ip。
以hadoop214为例:
(1)修改hostname

(2) 修改ip地址
(3)重启虚拟机,完成配置
3、修改linux和windows系统中的host文件
(1)linux
hadoop112、hadoop213、hadoop214均需修改。添加以下内容:
hadoop112
hadoop213
hadoop214
[jojo@hadoop112 ~]$ sudo vim /etc/hosts
(2)windows
在windows系统下的 C:\Windows\System32\drivers\etc 目录中找到hosts文件,在里面追加以下内容:
192.168.10.112 hadoop112
192.168.10.213 hadoop213
192.168.10.214 hadoop214
重复的就不用再添加(例如之前添加过hadoop112就可以不用再添加一遍)。
五、编写集群分发脚本 xsync
为了方便集群的搭建,编写一个集群分发脚本用于分发所修改的文件。
1)创建xsync文件
(1)查看环境变量
输入 echo $PATH 命令查看环境变量,看到 /home/jojo/bin 目录在环境变量中,可以直接在这个目录下创建xsync文件。
(2)创建 /home/jojo/bin 目录
可以看出 /home/jojo 目录下并没有 bin 目录,创建bin目录
[jojo@hadoop112 ~]$ mkdir /home/jojo/bin
(3)创建 xsync 文件
[jojo@hadoop112 bin]$ vim xsync
在 xsync 文件中添加以下内容:
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop112 hadoop213 hadoop214
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
保存并退出。
(4)给 xsync 文件添加执行权限
[jojo@hadoop112 bin]$ chmod u+x xsync
2)注意!
检查hadoop213、hadoop214的 /opt/module 目录下是否有 hadoop-3.3.4 和 jdk1.8.0_212
如果是空的,在hadoop112上分发一下这俩目录:
[jojo@hadoop112 bin]$ xsync /opt/module/hadoop-3.3.4
[jojo@hadoop112 bin]$ xsync /opt/module/jdk1.8.0_212
并且把自己写的环境变量文件 my_env.sh文件分发给hadoop213、hadoop214。
要是失败,就分别去hadoop213、hadoop214虚拟机的 /etc/profile.d 目录下创建my_env.sh
文件并编写下述内容:
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin#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文件,让新的环境变量PATH生效
[jojo@hadoop213 profile.d]$ source /etc/profile
[jojo@hadoop214 profile.d]$ source /etc/profile
六、配置SSH免密登录
1)进入 /home/jojo/.ssh 目录
通过 ll -a 命令查看 /home/jojo 目录下有个 .ssh 文件:
注意:要是没有.ssh文件就让hadoop112先登录一下hadoop213然后再退出来,就会自动生成个.ssh文件。
输入以下命令 :
ssh hadoop213
输入 yes
输入hadoop213上的登录密码
登录上后按 Ctrl+d 登出,回到hadoop112上继续操作。
进入 .ssh 文件进行以下操作
2)生成公钥和私钥
[jojo@hadoop112 .ssh]$ ssh-keygen -t rsa
输入 ssh-keygen -t rsa 命令后一直敲回车(三个)就好,就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)。
3)将公钥拷贝到要免密登录的目标机器上
[jojo@hadoop112 .ssh]$ ssh-copy-id hadoop112
[jojo@hadoop112 .ssh]$ ssh-copy-id hadoop213
[jojo@hadoop112 .ssh]$ ssh-copy-id hadoop214
4)每台虚拟机都要做2)、3)步。
注意:
还需要在hadoop213上采用jojo账号配置一下无密登录到hadoop112、hadoop213、hadoop214服务器上。
还需要在hadoop214上采用jojo账号配置一下无密登录到hadoop112、hadoop213、hadoop214服务器上。
还需要在hadoop112上采用jojo账号,配置一下无密登录到hadoop112、hadoop213、hadoop214服务器上。
现在三台虚拟机就可以实现相互免密登录,例如:
[jojo@hadoop214 .ssh]$ ssh hadoop213
输入 exit 就可以退出
七、集群配置
1) 修改Hadoop的配置文件(在hadoop112下)
(1)核心配置文件
配置core-site.xml。
[jojo@hadoop112 bin]$ cd $HADOOP_HOME/etc/hadoop
[jojo@hadoop112 hadoop]$ vim core-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop112:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.3.4/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为jojo -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>jojo</value>
</property>
</configuration>
(2)HDFS配置文件
配置hdfs-site.xml。
[jojo@hadoop112 hadoop]$ vim hdfs-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop112:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop214:9868</value>
</property>
</configuration>
(3)YARN配置文件
配置yarn-site.xml
[jojo@hadoop112 hadoop]$ vim yarn-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop213</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>
</configuration>
(4)MapReduce配置文件
配置mapred-site.xml。
[jojo@hadoop112 hadoop]$ vim mapred-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
2)在集群上分发配置好的Hadoop配置文件
[jojo@hadoop112 hadoop]$ xsync /opt/module/hadoop-3.3.4/etc/hadoop/
3)去103和104上查看文件分发情况
[jojo@hadoop213 ~]$ cat /opt/module/hadoop-3.3.4/etc/hadoop/core-site.xml
[jojo@hadoop214 ~]$ cat /opt/module/hadoop-3.3.4/etc/hadoop/core-site.xml
八、群起集群
1)配置workers
[jojo@hadoop112 hadoop]$ vim /opt/module/hadoop-3.3.4/etc/hadoop/workers
文件内容如下:
hadoop112
hadoop213
hadoop214
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有结点的配置文件:
[jojo@hadoop112 hadoop]$ xsync /opt/module/hadoop-3.3.4/etc
2)启动集群
(1)第一次启动
如果集群是第一次启动,需要在hadoop112节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的 //opt/module/hadoop-3.3.4 目录下的data和logs目录,然后再进行格式化。)
[jojo@hadoop112 hadoop-3.3.4]$ hdfs namenode -format
(2)启动HDFS
[jojo@hadoop112 hadoop-3.3.4]$ sbin/start-dfs.sh
(3)在配置了ResourceManager的节点(hadoop213)启动YARN
[jojo@hadoop213 hadoop-3.3.4]$ start-yarn.sh
(4)Web端查看HDFS的NameNode
①浏览器中输入:http://hadoop112:9870
②查看HDFS上存储的数据信息
(5) Web端查看YARN的ResourceManager
①浏览器中输入:http://hadoop213:8088
②查看YARN上运行的Job信息
3)集群基本测试
(1)上传文件到集群
进入 Browse Directory 页面
创建目录 input
上传文件
在电脑桌面创建一个 a.txt 文件用于测试,里面内容随意写。
(2)执行 wordcount 程序
[jojo@hadoop112 hadoop-3.3.4]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input /output
在yarn上查看任务:
去HDFS上查看生成的文件:
查看 output 目录下的 part-r-00000 文件可看到a.txt的文件内容:
(3)关闭集群命令
在hadoop213上关闭YARN
[jojo@hadoop213 hadoop-3.3.4]$ stop-yarn.sh
在hadoop112上关闭HDFS
[jojo@hadoop112 hadoop-3.3.4]$ stop-dfs.sh
九、配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
1)配置mapred-site.xml
[jojo@hadoop112 hadoop]$ vim mapred-site.xml
在该文件里面增加如下配置。
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop112:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop112:19888</value>
</property>
2)分发配置
[jojo@hadoop112 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
3)在hadoop112启动历史服务器
[jojo@hadoop112 hadoop]$ mapred --daemon start historyserver
4)查看历史服务器是否启动
[jojo@hadoop112 hadoop]$ jps
5)查看JobHistory
十、 配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。
开启日志聚集功能具体步骤如下:
1)配置yarn-site.xml
[jojo@hadoop112 hadoop]$ vim yarn-site.xml
在该文件里面增加如下配置。
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop112:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2)分发配置
[jojo@hadoop112 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
3)关闭NodeManager 、ResourceManager和HistoryServer
[jojo@hadoop213 ~]$ stop-yarn.sh
[jojo@hadoop112 hadoop]$ mapred --daemon stop historyserver
4)启动NodeManager 、ResourceManage和HistoryServer
[jojo@hadoop213 ~]$ start-yarn.sh
[jojo@hadoop112 hadoop]$ mapred --daemon start historyserver
5)删除HDFS上已经存在的输出文件
[jojo@hadoop112 hadoop]$ hadoop fs -rm -r /output
6)执行WordCount程序
[jojo@hadoop112 hadoop-3.3.4]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input /output
7)查看日志
(1)历史服务器地址
http://hadoop102:19888/jobhistoryhttp://hadoop112:19888/jobhistory
(2)历史任务列表
(3)查看任务运行日志
(4)运行日志详情
十一、编写Hadoop集群常用脚本
1)Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver):myhadoop.sh
[jojo@hadoop112 home]$ cd /home/jojo/bin
[jojo@hadoop112 bin]$ vim myhadoop.sh
输入以下内容:
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
ficase $1 in
"start")
echo " ============= 启动 hadoop集群 ================"echo " --------------- 启动 hdfs ---------------"
ssh hadoop112 "/opt/module/hadoop-3.3.4/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop213 "/opt/module/hadoop-3.3.4/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop112 "/opt/module/hadoop-3.3.4/bin/mapred --daemon start historyserver"
;;
"stop")
echo " ============== 关闭 hadoop集群 ================"echo " --------------- 关闭 historyserver ---------------"
ssh hadoop112 "/opt/module/hadoop-3.3.4/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop213 "/opt/module/hadoop-3.3.4/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop112 "/opt/module/hadoop-3.3.4/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
保存后退出,然后赋予脚本执行权限:
[jojo@hadoop112 bin]$ chmod +x myhadoop.sh
2)查看三台服务器Java进程脚本:jpsall
[jojo@hadoop112 bin]$ cd /home/jojo/bin
[jojo@hadoop112 bin]$ vim jpsall
输入以下内容:
#!/bin/bash
for host in hadoop112 hadoop213 hadoop214
do
echo =============== $host ===============
ssh $host jps
done
保存后退出,然后赋予脚本执行权限
[jojo@hadoop112 bin]$ chmod +x jpsall
3)分发/home/jojo/bin目录,保证自定义脚本在三台机器上都可以使用
[jojo@hadoop112 bin]$ xsync /home/jojo/bin/
十二、集群时间同步配置
如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
1)时间服务器配置(必须root用户)
(1)将hadoop102配置成时间服务器
①停止ntpd服务 : sudo systemctl stop ntpd
②修改配置文件 /etc/ntp.conf
sudo vim /etc/ntp.conf
将 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
③修改配置文件/etc/sysconfig/ntpd
sudo vim /etc/sysconfig/ntpd
添加如下内容:
SYNC_HWCLOCK=yes
④ 启动ntpd服务
sudo systemctl start ntpd
sudo systemctl enable ntpd
---------------------------------------------------------
如果需要时间服务器去互联网同时间 ①关闭ntpd服务 ②同步时间sudo ntpdate xxxx.xxx.xxx
③再次开启ntpd服务
-------------------------------------------------------
(2)让其他节点去hadoop112同步时间
①测试先把hadoop213的时间修改
sudo date -s "2020-10-10 10:10:10"
然后再输入以下命令同步时间:
sudo ntpdate hadoop112
注意:如果输入 sudo ntpdate hadoop112 命令后提示 sudo: ntpdate:找不到命令
下载该插件即可,下载命令:
sudo install ntpdate
②开启定时任务
可以设置一个定时任务来在固定时间同步一次hadoop112的时间
[jojo@hadoop213 ~]$ sudo systemctl start crond
[jojo@hadoop214 ~]$ sudo systemctl start crond
③编辑定时任务
sudo crontab -e
添加如下内容 -- 只是为了演示才每分钟同步一次
*/1 * * * * sudo ntpdate hadoop112