准备3台客户机(关闭防火墙、静态IP、主机名称)
先安装一台模板机的虚拟机系统全部以CentOS-7.5为例
使用yum安装需要虚拟机可以正常上网
ping www.baidu.com
能ping通就行
安装epel-release
现在centos7 很多镜像网不能用了需要配置一下
yum install -y epel-release
如果Linux安装的是最小系统版,还需要安装如下工具;如果安装的是Linux桌面标准版,不需要执行如下操作
yum install -y net-tools
yum install -y vim
关闭防火墙
关闭防火墙,关闭防火墙开机自启
systemctl stop firewalld
systemctl disable firewalld.service
IP地址192.168.10.100、主机名称hadoop100
创建用户
创建user用户,并修改user用户的密码(后续hadoop不允许root用户启动hdfs)
useradd user
passwd 123456
配置user用户具有root权限,方便后期加sudo执行root权限的命令
vim /etc/sudoers
修改/etc/sudoers文件,在%wheel这行下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
user ALL=(ALL) NOPASSWD:ALL
确定软件安装目录
在/opt目录下创建module、software文件夹
[root@hadoop100 ~]# mkdir /opt/module
[root@hadoop100 ~]# mkdir /opt/software
(2)修改module、software文件夹的所有者和所属组均为user用户
[root@hadoop100 ~]# chown user:user /opt/module
[root@hadoop100 ~]# chown user:user /opt/software
卸载虚拟机自带的JDK
[root@hadoop100 ~]# rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
rpm -qa:查询所安装的所有rpm软件包
grep -i:忽略大小写
xargs -n1:表示每次只传递一个参数
rpm -e –nodeps:强制卸载软件
到这里需要的备用centos7的模板机虚拟机就备用好了
准备克隆虚拟机
利用模板机,克隆三台虚拟机:hadoop102 hadoop103 hadoop104
我们先克隆一个hadoop102出来
修改静态ip
修改克隆机主机名
(1)修改主机名称
vim /etc/hostname
修改成相应的名字
(2)配置Linux克隆机主机名称映射hosts文件,打开/etc/hosts,添加如下内容
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
(3)修改windows的主机映射文件(hosts文件)先拷贝出来,修改保存以后,再覆盖即可
打开hosts文件并添加如下内容,然后保存
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
安装JDK
找到对应版本的jdk 和hadoop的对应的版本,
上传到虚拟机 ,都解压到/opt/module/ 这里以 jdk-8u212-linux-x64.tar.gz为例
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
安装Hadoop
找到对应版本的jdk 和hadoop的对应的版本,
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
配置环境变量
Hadoop添加到环境变量和配置JDK环境变量
打开建立自己的环境变量:/etc/profile.d/my_env.sh
sudo vim /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.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
source一下/etc/profile文件,让新的环境变量PATH生效
source /etc/profile
测试hadoop 和jdk
java -version
hadoop version
配置xsync集群分发脚本
需求:循环复制文件到所有节点的相同目录下
期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径)
[user@hadoop102 ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/atguigu/.local/bin:/home/user/bin:/opt/module/jdk1.8.0_212/bin
脚本实现
a)在/home/userr/bin目录下创建xsync文件
[user@hadoop102 opt]$ cd /home/user
[user@hadoop102 ~]$ mkdir bin
[user@hadoop102 ~]$ cd bin
[user@hadoop102 bin]$ vim xsync
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
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
修改脚本 xsync 具有执行权限
chmod +x xsync
现在就可以用xsync了,
用处 :例如xsync /etc/module
这个可以拷贝到hadoopx
其他里面去对应相应文件里面
复制虚拟机hadoop3 hadoop4
先复制之前准备的克隆虚拟机两个分别为hadoop3 hadoop4
最后目的ip和主机名
IP地址192.168.10.102、主机名称hadoop102
IP地址192.168.10.103、主机名称hadoop103
IP地址192.168.10.104、主机名称hadoop104
以hadoop3 为例
1.修改静态IP
修改它的IPADDR 就行 对应修改为192.168.10.103
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改主机名为hadoop103
vim /etc/hostname
hadoop4 以上操作一样
配置集群
我们现在有三台主机分布为:
IP地址192.168.10.102、主机名称hadoop102
IP地址192.168.10.103、主机名称hadoop103
IP地址192.168.10.104、主机名称hadoop104
ssh 无密码登陆配置
先配置hadoop102的ssh的登陆,因为后续的hdfs需要非root用户我们现在用user用户
先来到.ssh目录:
/home/user/.ssh
在运行下列命令,在按三个回车,生成公钥和私钥
ssh-keygen -t rsa
将公钥拷贝到要免密登录的目标机器上 继续使用一下命令,这个过程需要你输入对应的密码输入就行
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
现在就配置好hadoop的ssh无密码登陆,在换到hadoop3 和hadoop4 分布执行以上几个命令
.ssh文件夹下(~/.ssh)的文件功能解释:
known_hosts 记录ssh访问过计算机的公钥(public key)
id_rsa 生成的私钥
id_rsa.pub 生成的公钥
authorized_keys 存放授权过的无密登录服务器公钥
集群部署规划
注意
NameNode和SecondaryNameNode不要安装在同一台服务器
ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
配置文件说明
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
(1)默认配置文件:
要获取的默认文件 文件存放在Hadoop的jar包中的位置
[core-default.xml] hadoop-common-3.1.3.jar/core-default.xml
[hdfs-default.xml] hadoop-hdfs-3.1.3.jar/hdfs-default.xml
[yarn-default.xml] hadoop-yarn-common-3.1.3.jar/yarn-default.xml
[mapred-default.xml] hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml
(2)自定义配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
四个配置文件存放在$HADOOP_HOME/etc/hadoop
这个路径上,用户可以根据项目需求重新进行修改配置。
配置集群
(1)核心配置文件,配置core-site.xml
cd $HADOOP_HOME/etc/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://hadoop102:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为user -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>user</value>
</property>
</configuration>
(2)HDFS配置文件
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>hadoop102:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
(3)YARN配置文件,配置yarn-site.xml
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>hadoop103</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
```java
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>
(5)在集群上分发配置好的Hadoop配置文件,让hadoop103 和hadoop104都存在
xsync /opt/module/hadoop-3.1.3/etc/hadoop/
群起集群
(1) 配置workers
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:
hadoop102
hadoop103
hadoop104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
xsync /opt/module/hadoop-3.1.3/etc
启动集群
如果集群是第一次启动
:需要在hadoop102
节点格式化NameNode
在hadoop的根目录:
hdfs namenode -format
注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。
在hadoop的根目录,启动HDFS
sbin/start-dfs.sh
(3)在配置了ResourceManager的节点(hadoop103)启动YARN
[user@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
启动完成:
用jps
命令检测各个节点是否配置完毕
Web端查看HDFS的NameNode
(a)浏览器中输入:http://hadoop102:9870
(b)查看HDFS上存储的数据信息
Web端查看YARN的ResourceManager
(a)浏览器中输入:http://hadoop103:8088
(b)查看YARN上运行的Job信息
集群基本测试
(1)上传文件到集群
在hadoop上面建立文件夹:
在本地路径下上传word.txt文件到hadoop
hadoop fs -mkdir /input
# 上传小文件
hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input
# 上传大文件
hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz
(2)上传文件后查看文件存放在什么位置
大概位置:
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1436128598-192.168.10.102-1610603650062/current/finalized/subdir0/subdir0
(3) 查看HDFS在磁盘存储文件内容
注意这里的文件名字不同
cat blk_1073741825
大文件需要拼接 注意这里的文件名字不同
cat blk_1073741836>>tmp.tar.gz
cat blk_1073741837>>tmp.tar.gz
tar -zxvf tmp.tar.gz
(4)下载
hadoop fs -get /jdk-8u212-linux-x64.tar.gz ./
(5)执行wordcount程序
要在hadoop根目录执行:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
1)配置mapred-site.xml
[user@hadoop102 hadoop]$ vim 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>
2)分发配置
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
3)在hadoop102启动历史服务器
[user@hadoop102 hadoop]$ mapred --daemon start historyserver
4)查看历史服务器是否启动
[user@hadoop102 hadoop]$ jps
5)查看JobHistory
http://hadoop102:19888/jobhistory
配置日志的聚集
志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
注意:开启日志聚集功能,需要重新启动NodeManager
、ResourceManager
和HistoryServer
。
开启日志聚集功能具体步骤如下:
1)配置yarn-site.xml
[user@hadoop102 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://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2)分发配置
[user@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
3)关闭NodeManager 、ResourceManager和HistoryServer
[user@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh
[user@hadoop102 hadoop-3.1.3]$ mapred --daemon stop historyserver
4)启动NodeManager 、ResourceManage和HistoryServer
[user@hadoop103 ~]$ start-yarn.sh
[user@hadoop102 ~]$ mapred --daemon start historyserver
5)删除HDFS上已经存在的输出文件
[user@hadoop102 ~]$ hadoop fs -rm -r /output
6)执行WordCount程序
[user@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
7)查看日志
http://hadoop102:19888/jobhistory
集群启动/停止方式总结
1整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh/stop-yarn.sh
2各个服务组件逐一启动/停止
分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
启动/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
编写Hadoop集群常用脚本
1.Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver):myhadoop.sh
[user@hadoop102 ~]$ cd /home/user/bin
[user@hadoop102 bin]$ sudo vim myhadoop.sh
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
给权限
sudo chmod +x myhadoop.sh
# 停止
myhadoop.sh stop
# 启动
myhadoop.sh start
2.查看三台服务器Java进程脚本:jpsall
sudo vim jpsall
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
给权限
sudo chmod +x jpsall
测试:
jspall
分发/home/user/bin目录,保证自定义脚本在三台机器上都可以使用
xsync /home/user/bin/
集群时间同步
如果服务器在公网环境(能连接外网),可以不采用集群时间同步
,因为服务器会定期和公网时间进行校准
时间服务器配置(必须root用户)
(1)查看所有节点ntpd服务状态和开机自启动状态
[user@hadoop102 ~]$ sudo systemctl status ntpd
[user@hadoop102 ~]$ sudo systemctl start ntpd
[user@hadoop102 ~]$ sudo systemctl is-enabled ntpd
(2)修改hadoop102的ntp.conf配置文件
[user@hadoop102 ~]$ sudo vim /etc/ntp.conf
修改内容如下
(a)修改1(授权192.168.10.0-192.168.10.255网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap 修改为restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
(b)修改2(集群在局域网中,不使用其他互联网上的时间)
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 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
(c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改hadoop102的/etc/sysconfig/ntpd 文件
[user@hadoop102 ~]$ sudo vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4)重新启动ntpd服务
[user@hadoop102 ~]$ sudo systemctl start ntpd
(5)设置ntpd服务开机启动
[user@hadoop102 ~]$ sudo systemctl enable ntpd
其他机器配置(必须root用户)
(1)关闭所有节点上ntp服务和自启动
[user@hadoop103 ~]$ sudo systemctl stop ntpd
[user@hadoop103 ~]$ sudo systemctl disable ntpd
[user@hadoop104 ~]$ sudo systemctl stop ntpd
[user@hadoop104 ~]$ sudo systemctl disable ntpd
(2)在其他机器配置1分钟与时间服务器同步一次
[user@hadoop103 ~]$ sudo crontab -e
编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop102
(3)修改任意机器时间
[user@hadoop103 ~]$ sudo date -s "2021-9-11 11:11:11"
(4)1分钟后查看机器是否与时间服务器同步
[user@hadoop103 ~]$ sudo date