1、概述

Hadoop是什么?

  1. Hadoop是一个由Apache基金会所开发的分布式系统基础架构
  2. 主要解决,海量数据的存储和海量数据的分析计算问题。
  3. 广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈

    Hadoop优势

    高可靠性

  4. Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。

    高扩展性

  5. 在集群间分配任务数据,可方便的扩展数以千计的节点。

    高效性

  6. 在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。

    高容错性

  7. 能够自动将失败的任务重新分配。

    Hadoop组成

    image.png

    Hadoop1.x

  8. Hadoop中的MapReduce同时处理业务逻辑运算和资源的调度,耦合性较大。

    Hadoop2.x

  9. 增加了Yarn,Yarn只负责资源的调度,MapReduce只负责运算。

    Hadoop3.x

  10. 组成上没有变化。

    HDFS架构概述

    Hadoop Distributed File System,简称HDFS,是一个分布式文件系统。

NameNode(nn)

  1. 存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表块所在的DataNode等。

    DataNode(dn)

  2. 在本地文件系统存储文件块数据,以及块数据的校验和

    Secondary NameNode(2nn)

  3. 每隔一段时间对NameNode元数据备份

    YARN架构概述

    Yet Another Resource Negotiator 简称YARN,另一种资源协调者,是Hadoop的资源管理器。

image.png

ResourceManager(RM)

  1. 整个集群资源(内存、CPU等)的老大

    NodeManager(NM)

  2. 单个节点服务器资源老大

    ApplicationMaster(AM)

  3. 单个任务运行的老大

    Container

  4. 容器,相当一台独立的服务器,里面封装了任务运行所需的资源,如内存、CPU、磁盘、网络等

    MapReduce架构概述

    将计算过程分为两个阶段:Map和Reduce

image.png

Map

  1. Map阶段并行处理输入数据

    Reduce

  2. Reduce阶段对Map结果进行汇总

    HDFS、YARN、MapReduce三者关系

    image.png

    大数据技术生态体系

    image.png

  3. Sqoop

    1. 主要用于在Hadoop、Hive与传统的数据库(MySQL)间进行数据的传递,可以将一个关系型数据库中的数据导进导Hadoop的HDFS中,也可以将HDFS的数据导进导关系型数据库中。
  4. Flume
    1. 是一个高可用,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据。
  5. Kafka
    1. 是一种高吞吐量的分布式发布订阅消息系统
  6. Spark
    1. 是当前最流行的开源大数据内存计算框架。可以基于Hadoop上存储的大数据进行计算。
  7. Flink
    1. 是当前最流行的开源大数据内存计算框架。用于实时计算的场景较多。
  8. Oozie
    1. 是一个管理Hadoop作业(job)的工作流程调度管理系统。
  9. Hbase
    1. 是一个分布式的、面向列的开源数据库。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。
  10. Hive
    1. 是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
  11. ZooKeeper

    1. 是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。

      推荐系统框架图

      image.png

      2、Hadoop运行环境搭建

      修改主机名和hosts文件

      修改主机名称

      1. [root@localhost ~]# vim /etc/hostname
      2. hadoop100

      配置hosts文件

      172.16.13.100 hadoop100
      172.16.13.101 hadoop101
      172.16.13.102 hadoop102
      172.16.13.103 hadoop103
      172.16.13.104 hadoop104
      172.16.13.105 hadoop105
      172.16.13.106 hadoop106
      172.16.13.107 hadoop107
      172.16.13.108 hadoop108
      
  12. reboot重启虚拟机

    安装各类工具

    yum install -y epel-release
    yum install -y net-tools
    yum install -y vim

    关闭防火墙和开机自启

    systemctl stop firewalld
    systemctl disable firewalld.service

    在/opt目录下创建文件夹

    mkdir /opt/module
    mkdir /opt/software

    卸载虚拟机自带的JDK

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

    SSH免密登录配置

    image.png

  • 命令 ssh-keygen -t rsa 会在/root/.ssh 用户根目录下创建出id_rsa(私钥)、id_rsa.pub(公钥)
  • 将公钥拷贝到免密登录的目标机器上
    • ssh-copy-id hadoop102
    • ssh-copy-id hadoop103
    • ssh-copy-id hadoop104
  • 在hadoop103、hadoop104重复上述步骤

    3、软件安装(Hadoop102)

    安装JDK

  • 解压

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

配置JDK环境变量

  • 新建/etc/pfofile.d/my_env.sh文件
    • vim /etc/profile.d/my_env.sh
  • 添加如下内容

    #JAVA_HOME
    export JAVA_HOME=/opt/module/jdk1.8.0_212
    export PATH=$PATH:$JAVA_HOME/bin
    
  • 使配置文件生效

    • source /etc/profile

      安装Hadoop

  • 解压

    • tar -zxvf hadoop-3.1.3.tar -C /opt/module/

      配置环境变量

      #HADOOP_HOME
      export HADOOP_HOME=/opt/module/hadoop-3.1.3
      export PATH=$PATH:$HADOOP_HOMDE/bin
      export PATH=$PATH:$HADOOP_HOMDE/sbin
      

      Hadoop目录结构

      image.png
  • bin目录:存放对Hadoop相关服务进行操作的脚本

  • etc目录:存放Hadoop的配置文件目录,存放Hadoop的配置文件
  • lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
  • sbin目录:存放启动或停止Hadoop相关服务的脚本
  • share目录:存放Hadoop的依赖jar包、文档和官方案例

    4、Hadoop运行模式

  • 本地模式:单机运行,数据存储在linux下

  • 伪分布式:也是单机运行,数据存储在HDFS
  • 完全分布式:多台服务器组成分布式环境

    完全分布式运行模式

    scp 安全拷贝

  • 在 hadoop102 推数据到 hadoop103

    scp -r /opt/module/jdk1.8.0_212/ root@hadoop103:/opt/module/
    
  • 在 hadoop103 拉 hadoop的数据

    scp -r root@hadoop102:/opt/module/hadoop-3.1.3 /opt/module/
    
  • 在 hadoop103 将hadoop中/opt/module 目录下所有目录拷贝到hadoop104上

    scp -r root@hadoop102:/opt/module/* root@hadoop104:/opt/module
    

    rsync远程同步工具

    主要用于备份和镜像、避免复制相同内容,对差异文件做更新

  • 安装软件

    • yum -y install rsync
    • systemctl start rsyncd.service
    • systemctl enable rsyncd.service
  • 在 hadoop102 上 把/opt/module/hadoop-3.1.3 同步到hadoop103
    rsync -av hadoop-3.1.3/ root@hadoop103:/opt/module/hadoop-3.1.3/
    

    xsync集群分发脚本

    循环复制文件到所有节点的相同目录下

脚本实现

  • /home目录下创建xsync文件 ```shell

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


- 修改脚本具有执行权限
   - `chmod +x xsync`
- 将脚本复制到/bin中,以便全局调用
   - `cp xsync /bin/`
- <br />
<a name="rNwI9"></a>
### 集群配置
<a name="jTm2t"></a>
#### 集群部署规划
> NameNode和SecondaryNameNode不要安装在同一台服务器。
> ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。

| <br /> | hadoop102  | hadoop103 | hadoop104 |
| --- | --- | --- | --- |
| HDFS<br /> | NameNode<br />DataNode | <br /><br />DataNode | SecondaryNameNode<br />DataNode |
| YARN | <br /><br />NodeManager | ResourceManager<br />NodeManager | <br /><br />NodeManager |

<a name="h3jJz"></a>
#### 配置文件说明

- 默认配置文件
| 要获取的默认文件 | 文件存放在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-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml**四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
<a name="Q6zBe"></a>
#### 配置集群(hadoop102)

- 核心配置文件
   - 配置core-site.xml
   - `cd $HADOOP_HOME/etc/hadoop`
   - `vi core-site.xml`
```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>
</configuration>
  • HDFS配置文件
    • vi hdfs-site.xml ```xml <?xml version=”1.0” encoding=”UTF-8”?> <?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

dfs.namenode.http-address hadoop102:9870 dfs.namenode.secondary.http-address hadoop104:9868

<a name="R8OGN"></a>
#### YARN配置文件

- 配置yarn-site.xml
   - `vi yarn-site.xml`
```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>

MapReduce配置文件

  • 配置mapred-site.xml
    • vi mapred-site.xml ```xml <?xml version=”1.0” encoding=”UTF-8”?> <?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

mapreduce.framework.name yarn

<a name="VtKpc"></a>
#### 分发配置好的Hadoop配置文件

- 在home目录下

`./xsync /opt/module/hadoop-3.1.3/etc/hadoop/`
<a name="ymx14"></a>
### 群起集群
<a name="B0CiM"></a>
#### 配置workers
`vi /opt/module/hadoop-3.1.3/etc/hadoop/workers`

- 注意该文件中添加的内容结尾**不允许有空格,文件中不允许有空行**。
```xml
hadoop102
hadoop103
hadoop104
  • 同步所有节点配置文件
  • ./xsync /opt/module/hadoop-3.1.3/etc

    启动集群

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

    • hdfs namenode -format
  • 启动HDFS

    • 需要在 start-dfs.sh,stop-dfs.sh 这个两个文件里加入

      #!/usr/bin/env bash
      HDFS_DATANODE_USER=root
      HADOOP_SECURE_DN_USER=hdfs
      HDFS_NAMENODE_USER=root
      HDFS_SECONDARYNAMENODE_USER=root
      
    • 需要在 start-[yarn](https://so.csdn.net/so/search?q=yarn&spm=1001.2101.3001.7020).sh,stop-yarn.sh 加入

      #!/usr/bin/env bash
      YARN_RESOURCEMANAGER_USER=root
      HADOOP_SECURE_DN_USER=yarn
      YARN_NODEMANAGER_USER=root
      
    • sbin/start-dfs.sh

  • 在配置了ResourceManager的节点(Hadoop103)启动YARN
    • sbin/start-yarn.sh
  • 在web端查看HDFS的NameNode
  • 在web端查看YARN的ResourceManager

  • 创建文件夹

    • hadoop fs -mkdir /input
    • image.png
  • 上传文件

    • hadoop fs -put README.txt /input
    • image.png

      实际文件存储路径

  • /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-2044577290-172.16.13.102-1649060068257/current/finalized/subdir0/subdir0

    运行计算任务

  • hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /ouput

  • image.png

    配置历史服务器

    配置 mapred-site.xml文件

  • 在该文件里增加如下配置 ```xml

    mapreduce.jobhistory.address hadoop102:10020

mapreduce.jobhistory.webapp.address hadoop102:19888

<a name="kf5zq"></a>
#### 分发配置

- `./xsync /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml`
<a name="AfX2t"></a>
### 在hadoop102上启动历史服务器

- `mapred --daemon start historyserver`
- 可以看到项目的历史记录
   - ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25955514/1649060017399-bba871d2-6979-418e-8065-db9adc733788.png#clientId=ub06c3e72-07f1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=256&id=udcbdd108&margin=%5Bobject%20Object%5D&name=image.png&originHeight=512&originWidth=3564&originalType=binary&ratio=1&rotation=0&showTitle=false&size=171342&status=done&style=none&taskId=u57852361-adb5-4f87-8034-fd61d9f3cd9&title=&width=1782)
   - 或者访问 [http://hadoop102:19888/jobhistory](http://hadoop102:19888/jobhistory)
<a name="CTwG8"></a>
### 配置日志的聚集
> 应用运行完成以后,将程序运行日志信息上传到HDFS系统上。方便查看程序运行详情

![image.png](https://cdn.nlark.com/yuque/0/2022/png/25955514/1649060176674-50610d73-7e18-44f3-9f83-de189c394a0a.png#clientId=ub06c3e72-07f1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=282&id=u2fedbf81&margin=%5Bobject%20Object%5D&name=image.png&originHeight=240&originWidth=444&originalType=binary&ratio=1&rotation=0&showTitle=false&size=28905&status=done&style=none&taskId=u4dd42fd5-0d50-4f24-9c6e-413f29857c8&title=&width=522)

- 开启日志聚集功能,需要重新启动NodeManager、ResourceManager和HistoryServer
<a name="CuwOR"></a>
#### 配置yarn-site.xml

- 增加如下配置
```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>

分发配置

  • /home/xsync /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml

    关闭NodeManager、ResourceManager和HistoryServer

  • 在hadoop103上 sbin/stop-yarn.sh

  • 在hadoop102上 mapred --daemon stop historyserver

    启动NodeManager、ResourceManager和HistoryServer

  • 在hadoop103上 sbin/start-yarn.sh

  • 在hadoop102上 mapred --daemon start historyserver

    删除hdfs上已经存在的输出文件

  • hadoop fs -rm -r /output

    执行WordCount程序

  • hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /ouputs

    查看运行日志

    image.png
    image.png

    集群启动/停止方式总结

    各个模块分开启动/停止

  • 整体启动/停止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集群常用脚本

      Hadoop集群启停脚本(包含HDFS、Yarn、HistoryServer):myhadoop.sh

  • cd /home/bin

  • vim myhadoop.sh ```xml

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


- 给脚本赋权 `chmod +x myhadoop.sh`
- 关闭集群 `./myhadoop.sh stop`
- 开启集群 `./myhadoop.sh start`
<a name="mSA4z"></a>
#### 配置查看三台服务器Java进程脚本:jpsall

- 进入到 `/home/bin`
- 创建文件 `vi /jpsall`
```xml
#!/bin/bash

for host in hadoop102 hadoop103 hadoop104
do
        echo =============== $host ===============
        ssh $host jps 
done
  • 给脚本赋权 chmod +x jpsall
  • 分发到三台服务器
    • xsync /home/bin

      5、Hadoop常用端口号说明

      | 端口名称 | Hadoop2.x | Hadoop3.x | | —- | —- | —- | | NameNode内部通信端口 | 8020 / 9000 | 8020 / 9000/9820 | | NameNode HTTP UI | 50070 | 9870 | | MapReduce查看执行任务端口 | 8088 | 8088 | | 历史服务器通信端口 | 19888 | 19888 |

6、集群时间同步

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

    需求

  • 找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,生产环境根据任务对时间的准确程度要求周期同步。测试环境为了尽快看到效果,采用1分钟同步一次。

  • image.png

    时间服务器配置(必须root用户)

  • 查看所有节点ntpd服务状态和开启自启动状态

    systemctl status ntpd
    systemctl start ntpd
    systemctl is-enabled ntpd
    
  • 修改hadoop102的ntp.conf配置文件 vim /etc/ntp.conf

    • 修改1(授权192.168.10.0-192.168.10.255网段上的所有机器可以从这台机器上查询和同步时间)
      • 修改 #restrict 192.168.10.0 mask 255.255.255.0 nomodify notraprestrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
    • 修改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
    • 添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
      • server 127.127.1.0
      • fudge 127.127.1.0 stratum 10
    • 修改 /etc/sysconfig/ntpd文件
      • 增加如下内容(让硬件时间与系统时间一起同步)
      • SYNC_HWCLOCK=yes
  • 重启ntpd服务
    • systemctl start ntpd
  • 设置开启自启
    • systemctl enable ntpd
  • 其它机器配置
    • 关闭所有节点上ntp服务和自启动
      • systemctl stop ntpd
      • systemctl disable ntpd
      • systemctl stop ntpd
      • systemctl disable ntpd
    • 在其他机器配置1分钟与时间服务器同步一次
      • crontab -e
      • 编写定时任务如下:
        • */1 * * * * /usr/sbin/ntpdate hadoop102
    • 修改任意机器时间
      • date -s "2021-9-11 11:11:11"
    • 一分钟后查看机器是否与时间服务器同步
      • date