【Hadoop 3】图文详解:搭建Hadoop完全分布式运行模式
文章目录
- 一、流程分析
- 二、虚拟机准备
- 三、拷贝 JDK、Hadoop 目录:scp 命令
- 四、分发环境变量配置:编写集群分发脚本 xsync
- 五、SSH 免密登录
- 六、集群配置
- 七、群起测试
- 八、配置历史服务器
- 九、配置日志聚集功能
- 十、编写常用脚本
- 十一、知识点:常用端口号、配置文件
- 十二、集群时间同步
一、流程分析
(1)配置一台客户机,如主机名为 hadoop102(关闭防火墙,配置IP),创建目录 /opt/software、/opt/module,并修改这两个目录的属主和属组都为当前用户,如用户 zlc;
(2)再拷贝出两台客户机,如主机名为 hadoop103,hadoop104;
(3)只在 hadoop102 客户机上:安装 JDK、Hadoop,安装包路径为 /opt/software,解压路径为 /opt/module,并配置二者的环境变量;
(4)将 hadoop102 上的 JDK、Hadoop 目录及配置拷贝到另外两台客户机 hadoop103、hadoop104 上
(5)配置集群
(6)单点启动
(7)配置 ssh
(8)群起并测试集群
二、虚拟机准备
1、配置一台客户机,如主机名为 hadoop102(关闭防火墙,配置IP),创建目录 /opt/software、/opt/module
2、再拷贝出两台客户机,如主机名为 hadoop103,hadoop104;
3、只在 hadoop102 客户机上:安装 JDK、Hadoop,安装包路径为 /opt/software,解压路径为 /opt/module,并配置二者的环境变量;
三、拷贝 JDK、Hadoop 目录:scp 命令
1、因为在 hadoop102 上,已经安装好了 JDK、Hadoop,因此,hadoop103、hadoop104 不必再安装一遍了,可以直接使用 scp 命令,将 hadoop102 上的 JDK、Hadoop 目录及配置拷贝到另外两台客户机上。



2、需要用到 scp 安全拷贝命令,该命令可以实现服务器与服务器之间的数据拷贝,基本语法:scp -r 要拷贝的文件路径/名称 目的地用户@主机:目的路径/名称,例如
# 拷贝 hadoop102 的 jdk 到 hadoop103
scp -r /opt/module/jdk1.8.0_212 zlc@hadoop103:/opt/module
# 拷贝 hadoop102 的 hadoop 到 hadoop103
scp -r hadoop-3.1.3/ zlc@hadoop103:/opt/module/
(注:scp 不仅支持从源机器到目的机器的推送式拷贝,也支持从目的机器到源机器的拉取式拷贝,即可以在hadoop102中,将文件拷贝给hadoop103,也可以在hadoop103上拉取hadoop102的文件。另外,也可以在 hadoop103上,将hadoop102的文件拷贝到 hadoop104)
3、下图为在 hadoop102 中,将 JDK 拷贝给 hadoop103:

同理在 hadoop102 中,将 Hadoop 拷贝给 hadoop103。
4、在 hadoop103上,将hadoop102的文件拷贝到 hadoop104:

扩展补充
远程同步工具:rsync 命令
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
语法:rsync -av 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
例如:
# 删除hadoop103中/opt/module/hadoop-3.1.3/wcinput
rm -rf wcinput/# 同步hadoop102中的/opt/module/hadoop-3.1.3到hadoop103
rsync -av hadoop-3.1.3/ zlc@hadoop103:/opt/module/hadoop-3.1.3/
四、分发环境变量配置:编写集群分发脚本 xsync
1、编写 xsync 脚本:用于集群分发脚本,循环复制文件到所有节点的相同目录下,
期望脚本在任何路径都能使用,因此脚本要放在声明了全局环境变量的路径下:

因此,可在 /home/zlc/bin 路径下创建脚本 xsync

内容如下(学习自尚硅谷的 Hadoop 教程):
#!/bin/bash#1. 判断参数个数
if [ $# -lt 1 ]
thenecho Not Enough Arguement!exit;
fi#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
doecho ==================== $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:$pdirelseecho $file does not exists!fidone
done
但目前并没有可执行权限,可使用命令:chmod 777 xsync,赋予其 execute 权限


2、利用 xsync 脚本 将 /home/zlc/bin 下的 xsync 脚本,也就是它自己,同步到另外的两台客户机上(hadoop103、hadoop104)

hadoop103 上:

hadoop104 上:

3、将自定义的环境变量配置文件同步到另外两台客户机的相同目录下(此处需要用管理员权限才能进行配置文件目录的写入):

4、在另外两台客户机上(即hadoop103、hadoop104)进行配置文件目录的更新,并进行检验:


五、SSH 免密登录
1、先用 hadoop102 ssh 访问 hadoop 103

这样,在 hadoop102 的 ~ 目录下就会有一个 .ssh 隐藏目录,

同样,在 hadoop103 的 ~ 目录下也会有一个 .ssh 隐藏目录,

2、进入 hadoop102 的 .ssh 目录下,执行
ssh-keygen -t rsa
生成 hadoop102 客户机的公钥和私钥



3、将 hadoop102 的公钥发给 hadoop103 、 hadoop104(也可配置自己免密访问自己)


被免密连接的一方将会生成 authorized_keys 认证文件,因此此处是配置 hadoop102 免密访问自己,因此,也是在本机下生成 authorized_keys 认证文件

4、同理,我们在 hadoop103、hadoop104 上也重复上述配置
5、进行分发测试,在 hadoop102 客户机上分发文件到 hadoop103、hadoop104

六、集群配置
1、集群配置规划:NameNode 和 SecondaryNameNode 不要安装在同一台服务器
ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在同一台机器上。例如,我的集群配置规划为:

2、配置文件说明:Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
-
默认配置文件:

-
自定义配置文件:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
3、配置集群:
核心配置文件 core-site.xml

各文件自定义内容如下:
核心配置文件 core-site.xml
<configuration><property><name>fs.defaultFSname><value>hdfs://hadoop102:8020value>property><property><name>hadoop.tmp.dirname><value>/opt/module/hadoop-3.1.3/datavalue>property><property><name>hadoop.http.staticuser.username><value>atguiguvalue>property>
configuration>
HDFS 配置文件 hdfs-site.xml
<configuration><property><name>dfs.namenode.http-addressname><value>hadoop102:9870value>property><property><name>dfs.namenode.secondary.http-addressname><value>hadoop104:9868value>property>
configuration>
YARN 配置文件 yarn-site.xml
<configuration><property><name>yarn.nodemanager.aux-servicesname><value>mapreduce_shufflevalue>property><property><name>yarn.resourcemanager.hostnamename><value>hadoop103value>property><property><name>yarn.nodemanager.env-whitelistname><value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOMEvalue>property>
configuration>
MapReduce配置文件 mapred-site.xml
<configuration><property><name>mapreduce.framework.namename><value>yarnvalue>property>
configuration>
4、在集群上分发配置好的Hadoop配置文件:

5、去 hadoop103 和 hadoop104 上查看文件分发情况:


七、群起测试
1、配置 workers (注意,不要有多余的空格或空行)

2、分发此文件到集群的所有结点

3、启动集群:
(1)如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode

初始化完成后,会在 hadoop 目录下生成 data、logs 目录

(2)启动 HDFS
在 hadoop102 中:

在 hadoop103 中:

在 hadoop104 中:

对比一下上面的集群配置规划表,HDFS 一行是正确的:

也可以在网页图形化界面中进行 hadoop 可视化管理:
http://hadoop102:9870



(3)在配置了 ResourceManager 的节点(hadoop103)启动 YARN

在 hadoop102 中:

在 hadoop103 中:

在 hadoop104 中:

对比一下上面的集群配置规划表,两行都是正确的:

也可以在网页图形化界面中进行 YARN 可视化管理:
http://hadoop103:8088

4、集群基本测试
(1)创建目录
在 hadoop104 中创建目录

在 hadoop102 中的 hdfs 的图形化管理页面查看

(2)上传客户机的本地文件到 hdfs 中

可在可视化页面中看到


(3)上传客户机的本地大文件到 hdfs 中


(4)查看 HDFS 文件存储路径
上传文件后查看文件存放在什么位置

(5)查看 HDFS 文件的备份情况
在 hadoop102 中:

在 hadoop103 中:

在 hadoop104 中:

(6)下载 HDFS 文件:例如 JDK
方法一:可直接在物理文件中读出来

解压 JDK 压缩包


方法二:也可以利用命令 hadoop fs -get 源 目的


(7)执行程序
执行 mapreduce 的一个用于计数单词的例子(注意最后两个参数表示的源路径与目的路径,是基于 hdfs 中的路径

任务在执行过程中,可以在 yarn 的图形化页面中看到:

上述命令的执行图解:

已将统计的结果输出到了 wcoutput 目录的数据文件中

八、配置历史服务器
历史服务器:用于记录程序的历史运行情况
1、添加历史服务器配置
首先在 hadoop102 中:

增加如下配置内容
<property><name>mapreduce.jobhistory.addressname><value>hadoop102:10020value>
property>
<property><name>mapreduce.jobhistory.webapp.addressname><value>hadoop102:19888value>
property>
2、分发配置给集群的其他客户机

3、重启 hdfs、yarn
在 hadoop102 中启动 hdfs:

在 hadoop103 中启动 yarn:

4、在 hadoop102 中启动历史服务器

5、测试,并查看JobHistory



九、配置日志聚集功能
日志聚集功能:所有客户机服务器程序运行日志信息上传到 HDFS 上,从而方便查看程序运行详情,方面进行调试与监控。
(注意:开启日志聚集功能,需要重新启动 yarn 和历史服务器 historyserver,另外,只有在配置并开启了日志聚集功能之后,执行的任务才会有此功能的记录,之前的任务是没有的)
(声明:下图截图自尚硅谷的Hadoop教程)

1、添加日志聚集功能的配置

添加如下内容:
<property><name>yarn.log-aggregation-enablename><value>truevalue>
property>
<property> <name>yarn.log.server.urlname> <value>http://hadoop102:19888/jobhistory/logsvalue>
property>
<property><name>yarn.log-aggregation.retain-secondsname><value>604800value>
property>
2、分发配置

3、重新启动 yarn 和历史服务器 historyserver
在 hadoop102 中,停止历史服务器 historyserver

在 hadoop103 中,停止 yarn

在 hadoop103 中,启动 yarn

在 hadoop102 中,启动历史服务器 historyserver

4、执行任务,并检测日志聚集功能
在 hadoop102 中执行 mapreduce 任务

进入 yarn 的 web 页面,并进入历史服务器日志

进入 logs 日志

以下就是日志聚集功能对此次任务记录的具体内容

十、编写常用脚本
1、编写集群的启停脚本:myhadoop.sh,用于封装启动与停止集群的繁琐命令

myhadoop.sh 内容如下:
(此脚本学习自尚硅谷教程)
#!/bin/bashif [ $# -lt 1 ]
thenecho "No Args Input..."exit ;
ficase $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
赋予此脚本权限

测试脚本

2、编写集群的进程情况查看脚本:jps 命令

jpsall 内容如下:
(此脚本学习自尚硅谷教程)
#!/bin/bashfor host in hadoop102 hadoop103 hadoop104
doecho =============== $host ===============ssh $host jps
done
赋予权限

脚本测试

3、将上述两个脚本分发给集群所有客户机

十一、知识点:常用端口号、配置文件

十二、集群时间同步
如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
1、先查看时间同步服务的状态,发现是 inactive (dead),因此需要启动

2、启动 ntpd 服务

3、再次查看状态,是在运行的,启动成功

4、设置开机自启动
今后我们不希望每次都要手动启动,因此设置开机自动启动
先用如下命令查看,确实默认不是开机自动启动的

因此,为了持久化这个自启动功能,我们需要去配置文件中进行修改
(1)在 ntp.conf 中:

-
去掉注释:

-
加上注释:

-
添加如下内容,当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步

-
保存退出
(2)在 ntpd 中:
修改hadoop102的/etc/sysconfig/ntpd 文件
- 增加如下内容,让硬件时间与系统时间一起同步

- 保存退出
(3)重新启动ntpd服务

(4)设置ntpd服务开机启动

5、其他机器的配置(必须 root 用户)
配置完了时间服务器所在机器,还要配置另外的其他机器,让另外那些机器的时间同步于前者。
因为其他客户机可能会正在与外网进行时间同步,而当我们再让他们与时间服务器所在机器的时间同步,那么就会冲突,因为一个集群里的机器只能是与外网同步或是只能与内网同步,因此,我们需要关闭其他机器与外网的时间同步。
1、在 hadoop103、hadoo104 中,关闭 ntpd 服务


2、在其他机器配置 1 分钟与时间服务器同步一次

编写定时任务如下:
*/1 * * * * /usr/sbin/ntpdate hadoop102
3、修改任意机器时间

1 分钟后,与 hadoop102 中时间同步

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
