3.Hadoop---集群配置

1. 集群配置

1)集群部署规划

注意:
 NameNode和SecondaryNameNode不要安装在同一台服务器
 ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。

在这里插入图片描述

2)配置文件说明

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

在这里插入图片描述
(2)自定义配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。

3)配置集群

(1)核心配置文件
配置core-site.xml

cd $HADOOP_HOME/etc/hadoop
vi core-site.xml

原始内容

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
</configuration>

改为

<?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>
</configuration>

hadoop.tmp.dir默认是放在了/tmp 路径下,而这个路径应该是一天就自动清掉了(不是很确定)

这里我们配置的是hadoop102上内部的NameNode
接下来需要配置用户外部访问hadoop102上的NameNode的通道---NameNode web访问地址,暴露的接口是9870

且在Hadoop104上安装 2NN (SecondaryNameNode),2NN就是NameNode的小秘

(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配置文件

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配置文件

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>

4)在集群上分发配置好的Hadoop配置文件

xsync /opt/module/hadoop-3.1.3/etc/hadoop/

2. 群起集群

1)配置workers

hadoop102上
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:
hadoop102
hadoop103
hadoop104

注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。

同步所有节点配置文件

xsync /opt/module/hadoop-3.1.3/etc/hadoop/workers

2)启动集群

(1)如果集群是第一次启动,需要在hadoop102节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。)

[root@hadoop102 hadoop-3.1.3]$ hdfs namenode -format

初始化完毕以后,/opt/module/hadoop-3.1.3目录下就增加data和logs目录

[root@hadoop102 current]# pwd
/opt/module/hadoop-3.1.3/data/dfs/name/current
[root@hadoop102 current]# ll
总用量 16
-rw-r–r–. 1 root root 391 9月 6 20:52 fsimage_0000000000000000000
-rw-r–r–. 1 root root 62 9月 6 20:52 fsimage_0000000000000000000.md5
-rw-r–r–. 1 root root 2 9月 6 20:52 seen_txid
-rw-r–r–. 1 root root 216 9月 6 20:52 VERSION
[root@hadoop102 current]#

VERSION中内容

#Tue Sep 06 20:52:47 CST 2022
namespaceID=1599792918
clusterID=CID-adf25c71-8953-4c4f-aecd-3856c4e361ae
cTime=1662468767846
storageType=NAME_NODE
blockpoolID=BP-232670589-10.1.218.102-1662468767846
layoutVersion=-64

(2)启动HDFS

[root@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh

报错了

[root@hadoop102 hadoop-3.1.3]# sbin/start-dfs.sh
Starting namenodes on [hadoop102]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [hadoop104]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.

解决方案

vi /etc/profile.d/my_env.sh
添加
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
然后source /etc/profile生效

启动成功以后
hadoop102上

[root@hadoop102 sbin]# jps
19184 NameNode
20355 Jps
19383 DataNode

hadoop103上

[root@hadoop103 hadoop]# jps
20419 Jps
19918 DataNode

hadoop104上

[root@hadoop104 hadoop]# jps
7683 DataNode
7908 SecondaryNameNode
8075 Jps

这个时候可以访问http://hadoop102:9870,查看HDFS上存储的数据信息
在这里插入图片描述

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

[root@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

此时hadoop102上
[root@hadoop102 sbin]# jps
19184 NameNode
1349 Jps
19383 DataNode
1000 NodeManager


hadoop103上
[root@hadoop103 sbin]# jps
2455 ResourceManager
2668 NodeManager
19918 DataNode
3087 Jps


hadoop104上
[root@hadoop104 hadoop]# jps
21746 NodeManager
7683 DataNode
7908 SecondaryNameNode
22153 Jps

此时就符合我们最开始的规划
在这里插入图片描述

Web端查看YARN的ResourceManager
浏览器中输入:http://hadoop103:8088
在这里插入图片描述

3) 集群测试

(1)上传文件到集群
 上传小文件

[root@hadoop102 hadoop-3.1.3]# hadoop fs -mkdir /wcinput
刷新,发现hdfs web端有了wcinput
在这里插入图片描述
上传文件
[root@hadoop102 hadoop-3.1.3]# hadoop fs -put wcinput/word.txt /wcinput
2022-09-07 14:41:21,201 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
在这里插入图片描述
且有三个副本

 上传大文件

[root@hadoop102 ~]$ hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /

(2)上传文件后查看文件存放在什么位置

数据会存放在datanode中

查看HDFS文件存储路径
[root@hadoop102 subdir0]$ pwd
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1436128598-192.168.10.102-1610603650062/current/finalized/subdir0/subdir0
查看HDFS在磁盘存储文件内容
[root@hadoop102 subdir0]$ cat blk_1073741825
ss ss
cls cls
banzhang
hello world

(3)拼接
-rw-rw-r--. 1 root root 134217728 5月  23 16:01 blk_1073741836
-rw-rw-r--. 1 root root   1048583 5月  23 16:01 blk_1073741836_1012.meta
-rw-rw-r--. 1  root root   63439959 5月  23 16:01 blk_1073741837
-rw-rw-r--. 1  root root     495635 5月  23 16:01 blk_1073741837_1013.meta
[root@hadoop102 subdir0]$ cat blk_1073741836>>tmp.tar.gz
[root@hadoop102 subdir0]$ cat blk_1073741837>>tmp.tar.gz
[root@hadoop102 subdir0]$ tar -zxvf tmp.tar.gz
(4)下载
[root@hadoop104 software]$ hadoop fs -get /jdk-8u212-linux-x64.tar.gz ./

(5)执行wordcount程序

[root@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /tempout1

http://10.1.218.103:8088/cluster 页面上会提示成功了
在这里插入图片描述

查看hdfs web页面,发现已经输出了
在这里插入图片描述

4)配置历史服务器

为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:

1)配置mapred-site.xml

[root@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)分发配置

[root@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml

3)在hadoop102启动历史服务器

[root@hadoop102 hadoop]$ mapred --daemon start historyserver

4)查看历史服务器是否启动

[root@hadoop102 hadoop]$ jps

5)查看JobHistory

http://hadoop102:19888/jobhistory

5) 集群损坏–解决办法

如下方式限于本机玩,不建议用于生产环境中

1.先停止集群的所有hadoop相关进程
2.删除多个服务的data logs 文件,三台服务器都要删除
3.进行namenode格式化
4.重新启动

为什么要清除data目录呢?
namenode 有版本号
datanode也有版本号,二者是一一对应的
如果只删除某个服务的data,而没有三处另一个服务的data,这样重新格式化的时候,就会用新的namenode的版本去找其他服务上的datanode的数据,发现找不到,就会挂掉

6) 配置日志的聚集

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
在这里插入图片描述
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。

注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。

开启日志聚集功能具体步骤如下:
1)配置yarn-site.xml

[root@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)分发配置

[root@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml

3)关闭NodeManager 、ResourceManager和HistoryServer

[root@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh
这个会停止掉NodeManager和ResourceManager

[root@hadoop102 hadoop-3.1.3]$ mapred --daemon stop historyserver

4)启动NodeManager 、ResourceManage和HistoryServer
[root@hadoop103 ~]$ start-yarn.sh
[root@hadoop102 ~]$ mapred --daemon start historyserver

5)删除HDFS上已经存在的输出文件

[root@hadoop102 ~]$ hadoop fs -rm -r /wcoutput

6)执行WordCount程序

[root@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput

7)查看日志
(1)历史服务器地址
http://hadoop102:19888/jobhistory

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7) 集群启动/停止方式总结

1)各个模块分开启动/停止(配置ssh是前提)常用
(1)整体启动/停止HDFS

start-dfs.sh/stop-dfs.sh

(2)整体启动/停止YARN

start-yarn.sh/stop-yarn.sh

2)各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件

hdfs --daemon start/stop namenode/datanode/secondarynamenode

(2)启动/停止YARN

yarn --daemon start/stop resourcemanager/nodemanager

3. 编写集群常用脚本

1)Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver):myhadoop.sh

[root@hadoop102 hadoop-3.1.3]# cd /home/yanweiling/bin/
[root@hadoop102 bin]# vi 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

注意,关闭的顺序要和开启的顺序相反

 保存后退出,然后赋予脚本执行权限

[root@hadoop102 bin]# chmod +x myhadoop.sh

2)查看三台服务器Java进程脚本:jpsall

[root@hadoop102 bin]# vi jpsall

#!/bin/bash

for host in hadoop102 hadoop103 hadoop104
do
        echo =============== $host ===============
        ssh $host jps 
done

赋予执行权限

[root@hadoop102 bin]# chmod 777 jpsall

分发

xsync /home/atguigu/bin/

尝试执行

[root@hadoop102 bin]# jpsall
=============== hadoop102 ===============
19184 NameNode
19383 DataNode
19019 JobHistoryServer
18206 NodeManager
8334 Jps
=============== hadoop103 ===============
4100 NodeManager
26389 Jps
3895 ResourceManager
19918 DataNode
=============== hadoop104 ===============
7683 DataNode
7908 SecondaryNameNode
28217 Jps
5946 NodeManager
[root@hadoop102 bin]#

[root@hadoop102 ~]# myhadoop.sh stop 关闭集群
[root@hadoop102 ~]# myhadoop.sh start 开启集群

4. 常用端口号说明

在这里插入图片描述

5. 集群时间同步

如果是本机的虚拟机,不用操作集群时间同步,因为本身就是联网的

如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;
如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。

1)需求
找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,生产环境根据任务对时间的准确程度要求周期同步。测试环境为了尽快看到效果,采用1分钟同步一次。
在这里插入图片描述
2)时间服务器配置(必须root用户)

(1)查看所有节点ntpd服务状态和开机自启动状态 ntpd就是时间服务器

[root@hadoop102 ~]$ systemctl status ntpd
[root@hadoop102 ~]$ systemctl start ntpd
[root@hadoop102 ~]$ systemctl is-enabled ntpd

(2)修改hadoop102的ntp.conf配置文件

[root@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 文件

[root@hadoop102 ~]$ sudo vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes

(4)重新启动ntpd服务

[root@hadoop102 ~]$ sudo systemctl start ntpd

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

[root@hadoop102 ~]$ sudo systemctl enable ntpd

3)其他机器配置(必须root用户)

(1)关闭所有节点上ntp服务和自启动

[root@hadoop103 ~]$ sudo systemctl stop ntpd
[root@hadoop103 ~]$ sudo systemctl disable ntpd
[root@hadoop104 ~]$ sudo systemctl stop ntpd
[root@hadoop104 ~]$ sudo systemctl disable ntpd

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

[root@hadoop103 ~]$ sudo crontab -e

编写定时任务如下:

*/1 * * * * /usr/sbin/ntpdate hadoop102

(3)修改任意机器时间

[root@hadoop103 ~]$ sudo date -s “2021-9-11 11:11:11”

(4)1分钟后查看机器是否与时间服务器同步

[root@hadoop103 ~]$ sudo date

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值