一、安装JDK
1.1 下载JDK1.8
链接:https://pan.baidu.com/s/1TFGr2sZO1rZdvUJ9MeqfIQ
提取码:6666
1.2 上传至 /opt/software目录中
1.3 解压到 /opt/module中
tar -zxvf jdk1.8.0_201.tar.gz -C /opt/module/
1.4 配置环境变量
vim /etc/profile.d/my_env.sh
#添加如下内容
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_201
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
1.5 测试
java -version
二、安装Hadoop3.3.1
2.1 下载
下载地址:Index of /dist/hadoop/common/hadoop-3.3.1
Index of /apache/hadoop/core/hadoop-3.3.1
2.2 上传到服务器并解压到/opt/module中
2.3 添加环境变量到/etc/profile.d/my_env.sh文件中
2.4 测试
hadoop version
三、Hadoop 目录结构解析
四、完全分布式模式
4.1 编写集群分发脚本xsync
(1)在/bin目录下创建xsync文件
[root@ggl201 bin]# cd /bin
[root@ggl201 bin]# vim xsync
#添加如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in ggl201 ggl202 ggl203
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
(2)修改脚本 xsync 具有执行权限
[root@ggl201 bin]# chmod +x xsync
(3)测试脚本
[root@ggl201 bin]# xsync /bin/xsync
如果报错 rsync: command not found 安装一下rsync
yum -y install rsync
4.2 SSH 无密码登录配置
(2) 生成公钥和私钥
[root@ggl201 .ssh]# pwd
/root/.ssh
[root@ggl201 .ssh]# ssh-keygen -t rsa
(3)将公钥拷贝到要免密登录的目标机器上
[root@ggl201 .ssh]# ssh-copy-id ggl201
[root@ggl201 .ssh]# ssh-copy-id ggl202
[root@ggl201 .ssh]# ssh-copy-id ggl203
注意:
还需要在 ggl202 上 配置一下无密登录到 ggl201、ggl203 服务器上。
还需要在 ggl203 上 配置一下无密登录到 ggl201、ggl202 服务器上。
操作步骤同上
(4).ssh 文件夹下(~/.ssh)的文件功能解释
4.3 集群配置
4.3.1 集群部署规划
注意:
(1)NameNode 和 SecondaryNameNode 不要安装在同一台服务器
(2)ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在
ggl201 | ggl202 | ggl203 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager |
ResourceManager
NodeManager | NodeManager |
4.3.2 配置文件说明
要获取的默认文件
| 文件存放在 Hadoop 的 jar 包中的位置 |
[core-default.xml]
| hadoop-common-3.3.1.jar/core-default.xml |
[hdfs-default.xml]
| hadoop-hdfs-3.3.1.jar/hdfs-default.xml |
[yarn-default.xml]
| hadoop-yarn-common-3.3.1.jar/yarn-default.xml |
[mapred-default.xml]
| hadoop-mapreduce-client-core-3.3.1.jar/mapred-default.xml |
4.3.3 配置集群
(1)核心配置文件
[root@ggl201 hadoop]# pwd
/opt/module/hadoop-3.3.1/etc/hadoop
[root@ggl201 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://ggl201:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.3.1/data</value>
</property>
<!-- 删除检查点后的分钟数。如果为零,则垃圾桶功能被禁用 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 hadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
</configuration>
[root@ggl201 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>ggl201:9870</value>
</property>
<!-- 2nn web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>ggl203:9898</value>
</property>
<!-- NN目录地址-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/dfs/name</value>
</property>
<!-- DN目录地址-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/dfs/data</value>
</property>
<!-- 权限 -->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
[root@ggl201 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>ggl202</value>
</property>
<!-- 根据机器情况设置内存和核数 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<!-- RM保留的最大已完成应用程序数 -->
<property>
<name>yarn.resourcemanager.max-completed-applications</name>
<value>150</value>
</property>
<!-- RM上每个容器请求的最大(小)分配(以MBs为单位)根据机器配置可以调大内存和核数 -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>4</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<!-- 日志聚合 hdfs上存储目录 -->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/data/yarn/logs</value>
</property>
<!-- 开启日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 聚合日志保留检查之间的等待时间 -->
<property>
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
<value>604800</value>
</property>
<!-- 在删除聚合日志之前保留聚合日志的时间 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 日志聚合服务器的URL -->
<property>
<name>yarn.log.server.url</name>
<value>http://ggl201:5024/jobhistory/logs</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
</property>
</configuration>
[root@ggl201 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>
<property>
<name>mapreduce.jobhistory.address</name>
<value>ggl202:10020</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/data/yarn/local</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>/opt/module/hadoop-3.3.1/etc/hadoop,/opt/module/hadoop-3.3.1/share/hadoop/common/*,/opt/module/hadoop-3.3.1/share/hadoop/common/lib/*,/opt/module/hadoop-3.3.1/share/hadoop/hdfs/*,/opt/module/hadoop-3.3.1/share/hadoop/hdfs/lib/*,/opt/module/hadoop-3.3.1/share/hadoop/mapreduce/*,/opt/module/hadoop-3.3.1/share/hadoop/mapreduce/lib/*,/opt/module/hadoop-3.3.1/share/hadoop/yarn/*,/opt/module/hadoop-3.3.1/share/hadoop/yarn/lib/*</value>
</property>
</configuration>
4.3.4 在集群上分发配置好的 Hadoop 配置文件
[root@ggl201 hadoop]# xsync /opt/module/hadoop-3.3.1/etc/hadoop/
4.4 集群启动
4.4.1 配置 workers
[root@ggl201 hadoop]# vim /opt/module/hadoop-3.3.1/etc/hadoop/workers
ggl201
ggl202
ggl203
[root@ggl201 hadoop]# xsync /opt/module/hadoop-3.3.1/etc/hadoop/workers
4.4.2 启动集群
化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。)
[root@ggl201 hadoop-3.3.1]# hdfs namenode -format
[root@ggl201 hadoop-3.3.1]# sbin/start-dfs.sh
报错信息如下:
因为使用的用户是root 需要用hadoop用户启动
使用hadoop用户启动依然是报错 !!!
原因是 ssh的时候不通 当时用的root来创建的秘钥
解决方法如下:
1、把root下的.ssh copy到 /home/hadoop/下
[root@ggl201 ~]# cp -r .ssh/ /home/hadoop/
2、修改所属用户和用户组
[hadoop@ggl201 ~]$ sudo chown hadoop:hadoop -R .ssh/
3、分发
[hadoop@ggl201 ~]$ sudo xsync .ssh/
再次启动 成功
(3)在配置了 ResourceManager 的节点(ggl202)启动 YARN
[hadoop@ggl202 hadoop-3.3.1]$ sbin/start-yarn.sh
访问地址:http://ggl202:8088/
4.5 配置历史服务器
4.5.1 配置 mapred-site.xml
[hadoop@ggl201 hadoop]$ pwd
/opt/module/hadoop-3.3.1/etc/hadoop
[hadoop@ggl201 hadoop]$ vim mapred-site.xml
添加内容如下:
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>ggl201:10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>ggl201:19888</value>
</property>
4.5.2 分发配置
[hadoop@ggl201 hadoop]$ xsync mapred-site.xml
4.5.3 在 ggl201 启动历史服务器
[hadoop@ggl201 hadoop]$ mapred --daemon start historyserver
4.5.4 查看历史服务器是否启动
4.5.5 查看 JobHistory
访问链接: http://ggl201:19888/jobhistory
4.6 配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。
开启日志聚集功能具体步骤如下:
4.6.1 配置 yarn-site.xml
[hadoop@ggl201 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://ggl201:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
4.6.2 分发
[hadoop@ggl201 hadoop]$ xsync yarn-site.xml
4.6.3 关闭 NodeManager 、ResourceManager 和 HistoryServer
[hadoop@ggl202 hadoop-3.3.1]$ sbin/stop-yarn.sh
[hadoop@ggl201 hadoop-3.3.1]$ mapred --daemon stop historyserver
4.6.4 启动 NodeManager 、ResourceManage 和 HistoryServer
[hadoop@ggl202 hadoop-3.3.1]$ sbin/start-yarn.sh
[hadoop@ggl201 hadoop-3.3.1]$ mapred --daemon start historyserver
4.6.5 执行 WordCount 程序
[hadoop@ggl201 hadoop-3.3.1]$ hadoop fs -put word.txt /input
[hadoop@ggl201 hadoop-3.3.1]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /input /output
报错如下:
解决方法如下:
[hadoop@ggl201 hadoop-3.3.1]$ hadoop classpath
[hadoop@ggl201 hadoop-3.3.1]$ vim etc/hadoop/mapred-site.xml
修改mapred-site.xml文件
[hadoop@ggl201 hadoop-3.3.1]$ vim etc/hadoop/mapred-site.xml
增加内容如下:
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.1/etc/hadoop:/opt/module/hadoop-3.3.1/share/hadoop/common/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/common/*:/opt/module/hadoop-3.3.1/share/hadoop/hdfs:/opt/module/hadoop-3.3.1/share/hadoop/hdfs/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/hdfs/*:/opt/module/hadoop-3.3.1/share/hadoop/mapreduce/*:/opt/module/hadoop-3.3.1/share/hadoop/yarn:/opt/module/hadoop-3.3.1/share/hadoop/yarn/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/yarn/*</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.1/etc/hadoop:/opt/module/hadoop-3.3.1/share/hadoop/common/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/common/*:/opt/module/hadoop-3.3.1/share/hadoop/hdfs:/opt/module/hadoop-3.3.1/share/hadoop/hdfs/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/hdfs/*:/opt/module/hadoop-3.3.1/share/hadoop/mapreduce/*:/opt/module/hadoop-3.3.1/share/hadoop/yarn:/opt/module/hadoop-3.3.1/share/hadoop/yarn/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/yarn/*</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.3.1/etc/hadoop:/opt/module/hadoop-3.3.1/share/hadoop/common/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/common/*:/opt/module/hadoop-3.3.1/share/hadoop/hdfs:/opt/module/hadoop-3.3.1/share/hadoop/hdfs/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/hdfs/*:/opt/module/hadoop-3.3.1/share/hadoop/mapreduce/*:/opt/module/hadoop-3.3.1/share/hadoop/yarn:/opt/module/hadoop-3.3.1/share/hadoop/yarn/lib/*:/opt/module/hadoop-3.3.1/share/hadoop/yarn/*</value>
</property>
分发配置
[hadoop@ggl201 hadoop-3.3.1]$ xsync etc/hadoop/mapred-site.xml
再次运行成功
4.6.6 查看日志
页面链接:http://ggl201:19888/jobhistory
4.7 集群启动/停止方式总结
4.7.1 各个模块分开启动/停止(配置 ssh 是前提)常用
start-dfs.sh/stop-dfs.sh
start-yarn.sh/stop-yarn.sh
4.7.2 各个服务组件逐一启动/停止
hdfs --daemon start/stop namenode/datanode/secondarynamenode
yarn --daemon start/stop resourcemanager/nodemanager
4.8 编写 Hadoop 集群常用脚本
4.8.1 Hadoop 集群启停脚本(包含 HDFS,YARN,HistoryServer):my_hadoop
[hadoop@ggl201 bin]$ pwd
/home/hadoop/bin
[hadoop@ggl201 bin]$ vim my_hadoop
内容如下:
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop 集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh ggl201 "/opt/module/hadoop-3.3.1/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh ggl202 "/opt/module/hadoop-3.3.1/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh ggl201 "/opt/module/hadoop-3.3.1/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop 集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh ggl201 "/opt/module/hadoop-3.3.1/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh ggl202 "/opt/module/hadoop-3.3.1/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh ggl201 "/opt/module/hadoop-3.3.1/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
增加执行权限
[hadoop@ggl201 bin]$ chmod +x my_hadoop
测试报错
解决办法
删除 /opt/module/hadoop-3.3.1/etc/hadoop/workers 下 localhost等无用字段 只写你的集群主机名
4.8.2 查看三台服务器 Java 进程脚本:jpsall
[hadoop@ggl201 root]$ cd /home/hadoop/bin/
[hadoop@ggl201 bin]$ vim jps_all
内容如下:
#!/bin/bash
for host in ggl201 ggl202 ggl203
do
echo =============== $host ===============
ssh $host jps
done
增加执行权限
[hadoop@ggl201 bin]$ chmod +x jps_all
脚本分发
[hadoop@ggl201 bin]$ xsync jps_all
4.9 常用端口说明
4.10 集群时间同步
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
4.10.1 时间服务器配置(必须 root 用户)
[root@ggl203 ~]# systemctl status ntpd
[root@ggl203 ~]# systemctl start ntpd
[root@ggl203 ~]# systemctl is-enabled ntpd
如果报错 Unit ntpd.service could not be found.
yum -y install ntp
[root@ggl201 ~]# vim /etc/ntp.conf
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
为 restrict 192.168.221.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 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
(3) 修改 ggl201 的/etc/sysconfig/ntpd 文件 增加内容如下(让硬件时间与系统时间一起同步)
[root@ggl201 ~]# vim /etc/sysconfig/ntpd
#增加内容
SYNC_HWCLOCK=yes
[root@ggl201 ~]# systemctl start ntpd
[root@ggl201 ~]# systemctl enable ntpd
4.10.2 其他机器配置(必须 root 用户)
[root@ggl202 ~]# systemctl stop ntpd
[root@ggl202 ~]# systemctl disable ntpd
[root@ggl203 ~]# systemctl stop ntpd
[root@ggl203 ~]# systemctl disable ntpd
*/1 * * * * /usr/sbin/ntpdate ggl201
[root@ggl202 ~]# date -s "2021-11-01 11:22:33"
(4)1 分钟后查看机器是否与时间服务器同步