Hadoop分布式集群的搭建

1、概念

1.1大数据

大数据主要解决海量数据的采集、存储和分析计算的问题。

主要具有以下特点:

  1. 数据量大Volume:数据量在TB、PB、EB、ZB、YB、BB、NB、DB之上的数量级,一些大型企业的数据量可达到EB级别,据IDC预测2025年全球数据使用量将达到163ZB
  2. 高速Velocity:需要在较短的响应时间内对庞大的数据量作出处理
  3. 多样Variety:包含以关系型数据库为主的结构化数据和以日志、音视频图像、位置信息等为代表的非结构化数据
  4. 价值密度低Value:数据价值密度的高低与数据总量的大小成反比,所以需要快速地在海量数据中提取有价值的数据信息。

主要应用于数据推荐、用户分析、物流仓储、金融保险、AI、物联网等领域。

大数据部门的任务分工通常由以下构成:

  • 平台管理:负责Hadoop、HBase、Spark、Kafka等框架平台的搭建与调优维护。
  • 数据仓库:负责数据清洗、数据分析、数仓建模
  • 实时计算:实时数据指标分析,性能调优
  • 数据挖掘:推荐算法、用户画像工程师
  • 交互开发:JavaEE、Web前端开发

1.2 Hadoop

Hadoop是由Apache基金会开发的分布式基础架构,主要用于海量数据的存储和分析计算两个关键问题,广义上Hadoop是指围绕Hadoop构建的软件生态圈,还包括HBase、Zookeeper、Hive等其他工具。

  • 从下往上看,首先最下层是数据来源层,包括各种结构化、非结构化和半结构化(具有一定规律,可转换为结构化)的数据。
  • 数据传输层用于和数据来源进行交互的工具,例如Sqoop主要用于在传统关系型数据库和Hadoop的HDFS之间进行数据的导入导出。Flume是一个高可靠的分布式海量日志采集、聚合和传输的系统。Kafka是一种高吞吐量的分布式发布订阅消息系统。
  • 数据存储层完成主要的数据存储任务。例如通过分布式数据库HBase以面向列的方式对非结构化数据进行储存
  • 资源管理层通过YARN对集群资源进行调度管理。
  • 数据计算层完成主要的计算任务。例如通过MapReduce或Spark完成大量数据的查询挖掘,通过Flink进行实时计算,通过Hive进行SQL查询。
  • 贯穿于各层的Zookeeper是一个针对大型分布式系统的可靠协调系统,可提供配置维护、名字服务、分布式同步、组服务等。
    Hadoop软件生态图
    Hadoop起初是由Doung Cutting为了解决全文搜索的问题,在Lucene框架的基础上开发的查询引擎,他在参考Google的GFS、Map-Reduce和BigTable三篇论文的基础上,分别对应开发了HDFS、MR和HBase。

Hadoop有三大发行版本:

  1. Apache:Hadoop在2006年成为apache基金会的开源项目
  2. CDH:2008年,Cloudera公司在Apache版本的基础上,将一些常用的Hadoop软件集成起来,并用web网页实现对集群简易化的管理配置。
  3. CDP:2011年,Hortonworks公司也开发了对应的集成版本HDP,2018年被Cloudera公司收购,推出新的品牌CDP。虽然前期CDH、CDP均提供了免费版本,但在2021年起Cloudera公司要求二者必须升级到收费版本。

Hadoop有如下四个优点:

  • 高可靠性:Hadoop底层维护了多个数据副本,即使某个节点出现故障,也不会导致数据丢失
  • 高扩展性:在不停止服务的基础上实现节点的新增
  • 计算高效:在MapReduce思想下进行并行计算,加快任务处理速度
  • 高容错性:自动将失败的任务重新分配

Hadoop的组成结构:

  1. MapReduce负责主要的计算任务,Map阶段将复杂的任务拆分为多个小任务交给不同的节点进行计算,加速计算的过程,然后在Reduce阶段将计算结果进行汇总。
  2. Yarn(另一种资源协调者,Yet Another Resource Negotiator)是Hadoop的资源管理器,原来集成在MapReduce中,在Hadoop2.0中拆分出来。Yarn通过ResourceManager对整个集群的资源进行管理,而NodeManager只对本节点的资源进行管理。当客户端的发起任务请求后会形成ApplicationMaster对该任务进行整体监控和管理,集群可以同时运行多个任务;之后yarn会将任务拆分为多个虚拟的Container进行执行,Container中包含执行任务所需的各种资源。如下图所示,一个节点上可以存在多个Container,一个任务的不同Container也可以分布在不同的节点上。
    在这里插入图片描述
  3. HDFS(Hadoop Distributed File System)是一个分布式文件系统,负责数据存储。其中NameNode用于存储文件的元数据,如文件名、目录结构、文件属性、数据存储在哪个DataNode等信息,DataNode用于存储具体文件数据,Secondary NameNode用于每隔一段时间对NameNode进行备份。
  4. Common包含一些辅助工具

2 Hadoop安装

2.1 模板虚拟机

首先需要准备一台装有CentOS的模板虚拟机,虚拟机的安装配置过程记录:https://blog.csdn.net/theVicTory/article/details/124121175

1、通过yum安装epel-release

Extra Packages for Enterprise Linux是为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux。相当于是一个软件仓库,大多数rpm包在官方 repository 中是找不到的。

yum install -y epel-release

如果安装的是最简版本的centos,还需要安装net-tool、vim等软件包。net-tool为网络工具包,包含ifconfig等命令,vim是常用的文本编辑器。

2、关闭防火墙

在集群开发时,通常单个服务器的防火墙时关闭的,通过整体对外会设置非常安全的防火墙

systemctl stop firewalld
systemctl disable firewalld.service

3、配置IP映射
修改/etc/hosts文件,在其中设置主机映射名字hadoop101~104,以便之后节点之间进行连接配置

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104

4、为用户赋root权限
用vim编辑/etc/sudoers文件,在%wheel下新增一行,如下所示,为用户tory赋予root权限。

Wheel源自俚语big wheel,意味大人物。在Linux中指的是加入该组的用户,可以通过输入密码或不输入密码的方式将权限提升为root。

在这里插入图片描述
5、创建文件安装目录

在/opt目录下创建module、software文件夹,所有者和所属组均为tory用户,成功后通过ll命令可以看到文件的所属者与所属组都已改为tory

mkdir /opt/module
mkdir /opt/software
chown tory:tory /opt/module/
chown tory:tory /opt/software/

[root@hadoop01 opt]# ll
总用量 8
drwxr-xr-x. 2 tory tory 4096 413 23:08 module
drwxr-xr-x. 3 tory tory 4096 412 12:22 software

6、卸载虚拟机自带JDK
通过grep命令找出所有Java相关的rpm包,然后依次作为参数传入,进行卸载

rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps 

其中,

  • rpm -qa:查询所安装的所有rpm软件包
  • grep -i:忽略大小写
  • xargs -n1:表示每次只传递一个参数
  • rpm -e –nodeps:强制卸载软件
    完成后通过reboot命令重启虚拟机

2.2 克隆虚拟机

克隆虚拟机就是根据模板虚拟机Hadoop100再复制出多个相同的虚拟机副本Hadoop102、Hadoop103和Hadoop104
节点分布
1、克隆虚拟机
在克隆之前首先需要关闭模板虚拟机,然后在VMware右键模板虚拟机->管理->克隆,创建完整克隆,然后按照引导完成克隆

在这里插入图片描述

在这里插入图片描述
2、修改虚拟机IP

分别将克隆出来的虚拟机IP分别修改为固定IP192.168.10.102、103、104

编辑文件ifcfg-ens33,在其中对IPADDR、GATEWAY、DNS1进行设置

vim /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=395308bc-7855-44c6-957c-cc65ded2c21a
DEVICE=ens33
ONBOOT=yes

#IP地址
IPADDR=192.168.10.102
#网关
GATEWAY=192.168.10.2
#域名解析器
DNS1=192.168.10.2

再将主机名分别修改为hadoop102、103、104

vim /etc/hostname

hadoop102

此外还要保证VMware的子网、网关和DNS与之前配置好的一样,在VMware工具栏中编辑->虚拟网络编辑器->VMnet8
在这里插入图片描述
还需要修改Windows系统适配器VMware Network Adapter VMnet8的IPv4协议设置
在这里插入图片描述
设置完成后,重启hadoop102

2.3 安装Hadoop

在Java官网http://www.oracle.com/technetwork/java/javase/downloads,下载jdk-8u321-linux-x64.tar.gz,
在Hadoop官网https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/,下载hadoop-3.1.3.tar.gz

将下载好的压缩文件发送到hadoop102的/opt/software文件夹下,并进行解压到/opt/module目录下

tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/

在/opt/module/hadoop-3.1.3目录下可以看到hadoop相关的文件夹,其中

  1. bin目录:存放对Hadoop内部服务(hdfs,yarn,mapred)进行操作的脚本
  2. sbin目录:存放启动或停止整个Hadoop相关服务的脚本
  3. etc目录:Hadoop的配置文件目录
  4. lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
  5. share目录:存放Hadoop的依赖jar包、文档、和官方案例

配置环境变量

之前环境变量会直接修改path变量或者是在/etc/profile进行配置,通过profile文件中的如下shell代码可以看到,它会循环读取profile.d目录下的.sh脚本,并添加到全局变量

for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

在/etc/profile.d目录下新建一个my_env.sh文件,并添加如下内容

#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_321
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更新全局变量,测试安装成功

[root@hadoop102 hadoop-3.1.3]# java -version
java version "1.8.0_321"
Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode)

[root@hadoop102 hadoop-3.1.3]# hadoop version
Hadoop 3.1.3
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r ba631c436b806728f8ec2f54ab1e289526c90579
Compiled by ztang on 2019-09-12T02:47Z
Compiled with protoc 2.5.0
From source with checksum ec785077c385118ac91aadde5ec9799
This command was run using /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-common-3.1.3.jar

3 运行Hadoop

Hadoop有三种运行模式

  1. 本地模式:在一台主机上运行,使用本地文件系统,无需任何守护进程,所有的程序都运行在同一个JVM上执行。在独立模式下调试MapReduce程序非常高效方便。所以该模式主要用于学习或者开发阶段调试 。
  2. 伪分布式模式:在一台主机上模拟多台主机,Hadoop的守护程序在本地计算机上运行,模拟集群环境,这种模式常用来开发测试Hadoop程序的执行是否正确。
  3. 完全集群模式:正式标准的集群环境,在真实的场景中有无数个服务器,而不是在同一台主机上运行。

3.1 本地模式

通过Hadoop的mapreduce统计一个文件中单词出现的次数,这也是Hadoop官方的一个样例程序,如下所示document目录下有一个文档word.txt

hadoop yarn
hadoop mapreduce
hadoop hdfs

执行share目录下的example程序中的wordcount功能,统计document目录下的文件中单词数量,并且输出到counts目录

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount document counts

查看输出文件如下所示

cat ./counts/part-r-00000 

hadoop	3
hdfs	1
hdfshadoop	1
mapreduce	1
yarn	1

3.2 集群模式

3.2.1 文件分发

之前在2.2中已经克隆了多个虚拟机集群,并且在在2.3中安装了hadoop相关软件,这里只在hadoop102一台虚拟机上安装,所以需要通过scp命令将软件复制到hadoop103和hadoop104

#   递归  文件源用户@主机:路径/文件名称    目的地用户@主机:目的地路径/名称
scp -r   root@hadoop102:/opt/module/*  tory@hadoop103:/opt/module
scp -r   root@hadoop102:/opt/module/*  tory@hadoop104:/opt/module

可以通过xsync命令来同步两个虚拟机之间的文件,与scp不同,xsync只会更新存在差异的文件而不是全部复制。由于节点较多,这里写一个脚本mysync来将hadoop102的文件同步到hadoop103和hadoop104

#!/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

为了使全局都能调用mysync命令,可以将其放在环境变量中的目录下,例如放在/bin/,然后将其赋予可执行权限,最后调用脚本将环境变量的配置文件my_env.sh分发到其他节点

# 添加可执行权限
chomod +x mysync
# 复制到bin目录
cp mysync /bin/
# 进行分发
mysync /etc/profile.d/my_env.sh

在子节点刷新环境变量以生效

[tory@hadoop103 bin]$ source /etc/profile
[tory@hadoop104 opt]$ source /etc/profile

由于上述脚本在使用ssh登录主机时频繁提示输入密码,这里使用ssh配置免密登录,在当前用户家目录下的.ssh文件夹下生成公钥和私钥,并将公钥发送到目标主机

[atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa

[tory@hadoop102 .ssh]$ ssh-copy-id hadoop102
[tory@hadoop102 .ssh]$ ssh-copy-id hadoop103
[tory@hadoop102 .ssh]$ ssh-copy-id hadoop104

同理,在hadoop102和hadoop103两台主机上执行相同的操作以实现集群之间互相进行免密登录。

3.2.2 集群配置

在各个集群安装Hadoop之后,需要对其进行配置。将三台Hadoop节点按照如下表格进行功能分配,考虑到运行内存消耗,NameNode、SecondaryNameNode和ResourceManager分别安装在不同的节点上

hadoop102hadoop103hadoop104
HDFSNameNode 、DataNodeDataNodeSecondaryNameNode 、DataNode
YARNNodeManagerResource Manager、NodeManagerNodeManager

hadoop的配置文件存放在其安装目录下/etc/hadoop目录内,一般主要对core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个文件进行配置。按照上面的角色分配,对四个文件的配置内容如下:
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网页登录使用的静态用户-->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>tory</value>
    </property>
</configuration>

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>

yarn-site.xml,其中环境变量的集成是由于hadoop3.1.3进行的修正,3.2之后的版本不需要配置

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

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>

如果不对配置文件进行自定义,hadoop将使用默认配置,上面四个文件对应的默认配置文件分别位于

默认文件在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

例如core-default.xml文件中默认的hadoop.tmp.dir值为/tmp/hadoop-${user.name},即hadoop默认的数据存放目录在/tmp目录下,这个目录会被定期清除,因此需要在core-site.xml文件中将其修改到自定义目录下。

配置workers
在workers文件中添加三个节点主机

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

hadoop102
hadoop103
hadoop104

在hadoop102配置完成后,使用之前的分发脚本mysync将hadoop的配置文件分发到其他节点

[tory@hadoop102 hadoop]$ mysync /opt/module/hadoop-3.1.3/etc/hadoop/

3.2.3 启动集群

1.格式化NameNode

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

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

格式化之后会在hadoop目录下新建data、logs文件夹用于存放数据和日志
2.启动HDFS

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

3.启动yarn,注意在ResourceManager所在节点hadoop103执行

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

通过jps可以看到后台相应的程序已经在运行了

[tory@hadoop103 hadoop-3.1.3]$ jps
5425 NodeManager
5285 ResourceManager
5799 Jps
4078 DataNode

同理,在hadoop102、hadoop104节点,后台Java进程也可以看到

[tory@hadoop102 hadoop]$ jps
5700 Jps
4806 DataNode
4663 NameNode
5531 NodeManager

[tory@hadoop104 ~]$ jps
2803 DataNode
4564 Jps
4378 NodeManager
2876 SecondaryNameNode

4.上传文件

在hdfs系统中创建文件夹document,并将一个txt文件上传到该目录下

[tory@hadoop102 ~]$ hadoop fs -mkdir /document
[tory@hadoop102 ~]$ hadoop fs -put /home/tory/document/word.txt /document

在data目录下可以看到刚上传的文件,由于Hadoop存储的冗余性,该文件在三个节点上存在备份。可以看到blk_1073741828
中的内容就是刚上传的word.txt

[tory@hadoop103 ~]$ cat /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1373278190-192.168.10.102-1650123209152/current/finalized/subdir0/subdir0/blk_1073741828

hadoop hdfshadoop yarn
hadoop mapreduce
hadoop hdfs

在之前的集群配置中我们设置了Hadoop的Web管理页面,通过NameNode的9870端口可以进行查看:http://hadoop102:9870
在这里插入图片描述
在其中的Utilities选项卡中的Browse the file system可以查看HDFS文件系统,如下可以看到刚上传的jdk文件,并且可以对其进行下载、删除。其中Block Size是指文件块的最大容量而不是实际大小,当我们上传的文件大于128M时会被拆分为多个Block。
在这里插入图片描述

5.运行任务

运行Hadoop样例程序wordcount,与单机模式不同,这里的源文件和目标文件夹都是hdfs中的位置,统计刚上传到document文件夹下单词出现次数

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /document /output

之前在集群配置时设置ResourceManager所在节点hadoop103,可以看到YARN资源调度信息:http://hadoop103:8088
在这里插入图片描述集群崩溃处理

在集群崩溃之后,首先需要停止所有相关进程,可以通过jps命令查看。之后删除掉所有节点中的data和logs文件,然后再格式化namenode节点,最后才可用重启节点。
这是由于每个NameNode和DataNode都有一一对应的版本号,如果不彻底删除干净,访问会导致版本号不匹配,从而无法正常启动。

启动脚本

Hadoop常用组件的启动停止命令有:

# 整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
# 整体启动/停止YARN
start-yarn.sh/stop-yarn.sh

# 单独启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
# 单独启动/停止YARN组件
yarn --daemon start/stop  resourcemanager/nodemanager

通过以上命令启动/停止Hadoop集群需要切换到对应的节点并执行相关命令,我们可以把这些命令写到一个脚本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

此外,由于我们需要通过jps命令来查看hadoop组件的运行情况,每次需要单独切换到每个节点执行jps,我们可以将其写入一个脚本jpsall遍历所有节点查看jps

#!/bin/bash

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

保存之后为以上两个文件赋予执行权限

chmod +x myhadoop.sh
chmod +x jpsall.sh

使用以上两个命令启动Hadoop集群并进行查看

[tory@hadoop102 bin]$ myhadoop start
 =================== 启动 hadoop集群 ===================
 --------------- 启动 hdfs ---------------
Starting namenodes on [hadoop102]
Starting datanodes
Starting secondary namenodes [hadoop104]
 --------------- 启动 yarn ---------------
Starting resourcemanager
Starting nodemanagers
 --------------- 启动 historyserver ---------------
[tory@hadoop102 bin]$ jpsall 
=============== hadoop102 ===============
14913 JobHistoryServer
14418 DataNode
14274 NameNode
14754 NodeManager
15048 Jps
=============== hadoop103 ===============
13765 Jps
13034 DataNode
13375 NodeManager
13231 ResourceManager
=============== hadoop104 ===============
11392 DataNode
11490 SecondaryNameNode
11627 NodeManager
11807 Jps
错误排查

如果集群启动失败,可以尝试如下错误排查:

  1. 防火墙没关闭、或者没有启动YARN,INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
  2. 主机名称配置错误
  3. IP地址配置错误
  4. ssh没有配置好
  5. 启动集群使用的用户不统一
  6. 不识别主机名称,报错java.net.UnknownHostException: hadoop102: hadoop102
  7. DataNode和NameNode进程同时只能工作一个,二者版本号发生冲突,彻底删除所有节点data文件并重新格式化

3.2.4 历史服务器

为了再ResourceManager中查看程序的历史运行情况,需要启动历史服务器。具体步骤如下:

1.配置mapred-site.xml

[tory@hadoop102 ~]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/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>

修改后需要将文件同步到其他节点

[tory@hadoop102 ~]$ mysync /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml 

2.启动历史服务器

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

在历史服务器的运行节点hadoop102可以查看web页面:http://hadoop102:19888/jobhistory
在这里插入图片描述

3.2.5 日志聚集

Hadoop的日志分散记录在各个节点的logs文件夹中,如果我们希望集中查看就需要开启日志聚集功能。

首先对日志聚集进行配置,修改hadoop配置文件的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>

修改完成后需要重启整个Hadoop集群才能查看日志。在JobHistory页面点击logs按钮,

在这里插入图片描述
可以看到聚集的日志信息
在这里插入图片描述

3.2.6 时间同步

Hadoop节点在执行任务时需要使用统一的时间才能保证任务的正常执行,一帮情况下,节点会通过外网进行时间同步,从而保证所有节点的时间相同。但是如果Hadoop集群运行在内部网络,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。对于Linux系统,可以采用ntp服务来进行节点之间的时间同步。

例如选取Hadoop102作为时间服务器,Hadoop103和Hadoop104周期性地与时间服务器进行同步,保证时间一致。

  1. 修改ntp的配置文件/etc/ntp.conf
# 允许192.168.10网段上的所有机器可以从这台机器上查询和同步时间
restrict 192.168.10.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 127.127.1.0
fudge 127.127.1.0 stratum 10

之后修改/etc/sysconfig/ntpd文件,增加如下内容

# 同步系统硬件与软件时间
SYNC_HWCLOCK=yes
  1. 在hadoop102上开启ntp服务
# 查看服务状态
[tory@hadoop102 ~]$ sudo systemctl status ntpd
# 开启服务
[tory@hadoop102 ~]$ sudo systemctl start ntpd
# 开机自启动
[tory@hadoop102 ~]$ sudo systemctl is-enabled ntpd
  1. 关闭其他节点上的ntp服务
[tory@hadoop103 ~]$ sudo systemctl stop ntpd
[tory@hadoop103 ~]$ sudo systemctl disable ntpd
[tory@hadoop104 ~]$ sudo systemctl stop ntpd
[tory@hadoop104 ~]$ sudo systemctl disable ntpd
  1. 使用crontab定期同步时间,在其中编写定时任务如下,每分钟使用ntpdate向hadoop102进行时间同步
[tory@hadoop103 ~]$ sudo crontab -e

*/1 * * * * /usr/sbin/ntpdate hadoop102
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值