### README

本文是基于黑马程序员的 Hadoop 网课的前半部分整理的笔记,主要介绍了相关操作与组件架构。

视频网址:01-课程内容大纲与学习目标_哔哩哔哩_bilibili


目录

### README

一、基础概念

1、版本架构变迁

2、集群简介

二、安装部署

1、安装部署

2、初次启动

3、进程状态、日志查看

4、UI Web界面

5、初体验

三、HDFS 详解

1、分布式文件系统

2、HDFS 概述

3、命令行界面(CLI)

3.1 文件系统的选择

3.2 基本操作命令

3.3 集群角色与职责

3.4 HDFS 写数据完整流程图

四、MapReduce 详解

1、设计构思

2、MapReduce 介绍

3、map 阶段执行过程

4、Reduce 阶段执行流程

5、shuffle 机制

五、YARN 详解

1、概述

2、架构和组件

3、交互流程

4、资源调度器


一、基础概念

1、版本架构变迁

2、集群简介

  • 主要包括两个集群:HDFS、YARN(MapReduce是计算框架,是代码层面的)

  • 这两个集群逻辑上分离,物理上在一起

  • 这两个集群都是标准的主从架构

二、安装部署

1、安装部署

Step 1 集群角色规划

根据工作特性和服务器硬件资源情况合理分配,互相配合的安到一起,互相冲突的不安到一起。

Step 2 服务器基础环境的准备

防火墙配置、服务器之间时间同步。

# 1。用户基础配置cat /etc/hostname # 验证主机名cat /etc/hosts# 查看Hosts 映射​# 2。配置防火墙systemctl stop firewalld.service# 关闭防火墙systemctl disable firewalld.service # 禁止防火墙开机自启​# 3.ssh 免密登录ssh-keygen# 生成公钥私钥ssh-copy-id node1 # 复制主机公钥,到node1机器上​# 4.集群时间同步yum -y install ntpdate# 使用ntp协议ntpdate ntp4.aliyun.com # 使用阿里云的授时服务​# 5.创建统一工作目录mkdir -p /export/server/# 软件安装路径mkdir -p /export/data/# 数据存放路径mkdir -p /export/software/# 安装包存放路径​# 6.安装JDK,并配置环境变量scp -r /export/server/jdk1.8.0_241/ root@node2:.export/server/# 复制安装包到其他机器上。scp etc /etc/profile root@node1:/etc/ # 复制全局变量

Step 3 上传Hadoop安装包、解压

本地上传,然后使用tar命令解压,然后复制到其他机器中

重要文件结构说明:

Step 4 修改Hadoop 配置文件

  • 进入 /etc 文件夹下

  • 修改 hadoop-env.sh,配置环境设置

  • 修改xxxx-site.xml,修改用户环境配置

    • core-site.xml:核心模块配置

    • hdfs-site.xml:hdfs文件系统模块配置

    • mapred-site.xml :MapReduce模块配置

    • yarn-site.xml:yarn模块配置

  • worker文件配置

Step 5 分发同步给其他安装包

Step 6 将Hadoop配置到环境变量中

Step 7 初始化操作(NameNode format)

  • 首次启动HDFS时,必须进行初始化操作,只能执行一次。

hdfs namenode -format

2、初次启动

  • 手动启动:可以精准的控制每个进程启停

  • shell 脚本一键启动(软件自带的)

3、进程状态、日志查看

  • jps命令:查看进程是否启动成功

  • Hadoop启动日志路径文件:/export/server/hadoop-3.3.0/logs/xxxx.log

4、UI Web界面

HDFS 界面

http://namenode_host:9870,其中hamenode_host是运行所在机器的主机名或者ip,如果使用主机名访问,别忘了在Windows配置hosts

YARN 界面

http://resourcemanager_host:8088,其中resourcemanager_host是主机名或者ip。如果使用主机名访问,别忘了在Windows配置hosts

5、初体验

HDFS 初体验

  • HDFS 本质就是一个文件系统

  • 有目录树结构,和Linux类似,分文件、文件夹

MapReduce+YARN 初体验

  • 执行MapReduce的时候,为什么首先请求YARN

  • MapReduce看上去好像是两个阶段?先Map再Reduce?

  • 处理小数据的时候,MapReduce速度快吗?【很慢】

三、HDFS 详解

1、分布式文件系统

  • 文件系统是一种存储和组织数据的方法,使文件访问、查找更容易。

  • 通常带有抽象的目录树。

  • 分为数据部分和元数据部分(解释数据的数据)

2、HDFS 概述

  • 主从架构

  • 分块存储

  • 副本机制

  • 抽象统一的目录树结构(namespace)

(1)主从架构

  • 通常是一个 Namenode 和多个 Datanode 组成。

  • 官方架构图中是一主五从模式。其中五个从角色位于两个机架的不同服务器上。

(2)分块存储

  • 物理上是分块存储(block),默认是128M,块大小可以通过配置修改。

(3)副本机制

  • 文件的所有block都有副本,副本系数可以在文件创建的时候指定,也可以之后通过命令改变。

  • 副本数默认是3,除了本身以外还有2份。

(4)元数据管理

  • 文件自身属性信息:文件名称、权限、修改时间、文件大小、复制因子、数据块大小。

  • 文件快映射信息:记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。

(5)namespace

  • 抽象目录树:具有层次性的文件目录结构

3、命令行界面(CLI)

3.1 文件系统的选择

Hadoop提供了shell内置命令:hadoop fs [generic options]

  • 支持操作多种文件系统,包括本地文件系统(file:///),分布式文件系统(hdfs://nn:8020)等

  • 具体是什么文件系统取决于命令中文件路径URL中的前缀信息。

  • 如果没有指定前缀,则将会读取变量中的fs.defaultFS属性,获取默认文件系统。

3.2 基本操作命令
  • 创建文件夹:hadoop fs -mkdir [-p] ...

  • 查看指定目录下的内容:hadoop fs -ls [-h] [-R] [ ...]

  • 上传文件:hadoop fs -put [-f] [-p] ... (下载是-get命令)

  • 查看文件内容:hadoop fs -cat ...(也有一个-tail命令)

  • 拷贝:-cp

  • 追加数据到HDFS文件中:将多个文件内容追加到指定文件dst的尾部:hadoop fs -appendToFile ...

3.3 集群角色与职责

主角色 namenode

  • 维护和管理文件系统元数据,包括名称空间目录树结构,文件和块的位置信息,访问权限等信息。

  • Namenode 成为访问 HDFS 的唯一入口。

  • 内部通过内存和磁盘文件两种方式管理元数据,其中磁盘上的元数据包括内存元数据镜像文件 (Fsimage) 和编辑日志 (Journal)

从角色 DataNode

  • 负责具体的数据块存储,DataNode 的数量决定HDFS集群的整体存储能力。

主角色辅助角色 secondarynamenode

  • 充当NameNode的辅助节点,但不能替代NameNode。

  • 帮助主角色进行元数据文件的合并动作可以通俗的理解为“秘书”。

3.4 HDFS 写数据完整流程图

Pipeline 管道

  • HDFS 在上传文件写过程中采用的一种数据传输方式。

  • 客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二个数据节点,后者保存后将其复制到第三个数据节点。

  • 以管道的方式,能够充分的利用每个机器的带宽,避免网络瓶颈和高延迟的连接,最小化推送所有数据的延迟。

ACK 应答响应

  • 确认字符,接收方发送给发送方的一种传输类控制字符。

默认3副本存储策略

  • 第一块副本:优先客户端本地,否则随机

  • 第二块副本:不同于第一块副本的不同机架

  • 第三块副本:第二块副本相同机架不同机器

写数据流程:

  • HDFS 客户端创建对象实例 DistributedFileSystem,该对象中封装了与HDFS 文件系统操作的相关方法。

  • 调用 DistributedFileSystem 对象的 create() 方法,通过RPC请求NameNode文件。

    • NameNode 进行各种检查判断:目标文件是否存在,父目录是否存在,客户端是否具有创建文件的权限。检查通过,NameNode 就会为本次请求记下一条记录,返回 FSDataOutputStream 输出流对象给客户端用于写数据。

  • 客户端通过 FSDataOutputStream输出流开始写数据。

  • 客户端写入数据时,将数据分成一个个数据包(默认64k),内部组件 DataStreamer 请求 NameNode 挑选出适合存储数据副本的一组 DataNode 地址,默认是3副本存储。

  • 传输的反方向上,会通过ACK机制校验数据包是否成功;

  • 客户端完成数据写入后,在 FSDataOutputStream 输出流上调用 close() 方法关闭。

  • DistributedFileSystem 联系 NameNode 告知其文件写入完成,等待 NameNode确认。

    • 因为 NameNode 已经知道文件由哪些块组成,因此仅需等待最小复制块即可成功返回。最小复制是由参数 dfs.namenode.replication.min 指定,默认是1,即有1个成功就算成功。

四、MapReduce 详解

1、设计构思

(1)如何对应大数据场景

  • 分而治之的思想

  • 首先 Map 阶段进行拆分,把大数据拆分成若干小数据,多个应用程序同时并行计算产生中间结果,然后是 Reduce 聚合阶段,通过程序对并行的结果进行最终的汇总计算,得出最终的结果。

  • 不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算。

(2)构建抽象编程模型

MapReduce 借鉴了函数式语言中的思想,用Map 和 Reduce 两个函数提供了高层的并行编程抽象模型。

  • map:对一组数据元素进行某种重复式的处理。

  • reduce:对 map 的中间结果进行某种进一步的结果整理。

  • 处理的数据类型都是 键值对。

(3)统一架构、隐藏底层细节

  • 提供了统一的计算框架,隐藏了存储、划分、分发、结果收集、错误恢复等细节。

  • 通过抽象模型和计算框架把做什么 (what) 和怎么做 (how) 分开了,为程序员提供一个抽象和高层的编程接口和框架。

  • 程序员仅需要关心其应用层的具体计算问题,仅需要编写少量的处理应用本身计算问题的业务程序代码。

2、MapReduce 介绍

优点:

  • 易于编程

  • 良好的扩展性

  • 高容错性

  • 适合海量数据的离线处理,性能稳定。

缺点:

  • 实时计算性能差。

  • 不能进行流式计算,MapReduce 主要针对的是静态数据计算。

MapReduce 实例进程

有三类:

  • MRAppMaster:负责整个 MR 程序的过程调度及状态协调。

  • MapTask:负责 map 阶段的整个数据处理流程。

  • ReduceTask:负责 reduce 阶段的整个数据处理流程。

阶段组成

  • 一个 MapReduce 编程模型中只能包含一个 map 阶段和一个 reduce 阶段,或者只有 map 阶段。

  • 如果用户的业务逻辑非常复杂,那就只能多个 MapReduce 程序串行运行。

数据类型

  • 所有都是 kv 的键值对形式

  • 内置了很多默认属性,比如排序、分组等,都和数据的 key 有关。

执行流程图

3、map 阶段执行过程

  • 第一阶段:把输入文件按照某标准进行逻辑切片,默认128M,每个切片由一个MapTask 处理。

  • 第二阶段:对切片中的数据按照一定的规则读取解析返回

  • 第三阶段:调用 Mapper 类中的 map 方法处理数据。

  • 第四阶段:按照某种规则对 Map 输出的键值进行分区 partition。默认不分区,因为只有一个 reducetask。

  • 第五阶段:Map 输出数据写入内存缓冲区,达到比例溢出磁盘上,溢出 spill 的时候根据 key 进行排序 sort,默认根据 key 的字典序排序。

  • 第六阶段:对所有溢出文件进行最终的 merge 合并,成为一个文件。

4、Reduce 阶段执行流程

  • 第一阶段:ReduceTask 会主动从 MapTask 复制拉取属于需要自己处理的数据。

  • 第二阶段:把拉取来的数据,全部进行合并 merge,及把分散的数据合并成一个大数据,再对合并后的数据排序。

  • 第三阶段:对排序后的键值对调用 reduce 方法,键相等的键值对调用一次 reduce 方法,最后把输出的键值对写入到HDFS文件中。

5、shuffle 机制

shuffle 本意是洗牌的意思,指将牌打乱,在 MapReduce 的过程中,shuffle 指将 map 端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便 reduce 端接收数据。

Map 端 shuffle

  • Collect 阶段:将 MapTask 的结果收集输出到默认大小为 100M 的环形缓冲区,保存之前会对 key 进行分区的计算,默认 Hash 分区。

  • Spill 阶段:当内存中的数据量达到了一定阈值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会有相同分区号和 key 的数据进行排序。

  • Merge 阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。

shuffle 弊端

shuffle 频繁涉及到数据在内存、磁盘之间的多次往复。

五、YARN 详解

1、概述

  • YARN(Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器。

  • YARN 是一个通用的资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大的好处。

  • 不仅支持MapReduce程序,理论上还支持各种计算程序。

2、架构和组件

官方架构图

集群物理层面:

  • ResourceManager:主角色,最终仲裁者,最高权限。

  • NodeManager:从角色

APP 层面:

  • ApplicationMaster(App Mstr):跟着程序出现的

其他组件:

  • Client:客户端

  • Container 容器(资源的抽象)

3、交互流程

  • MR 作业提交:Client -> RM

  • 资源的申请:MrAppMaster -> RM

  • MR 作业状态汇报:Container(Map|Reduce Task) -> Container(MrAppMaster)

  • 节点的状态汇报:NM -> RM

具体流程

  1. 用户通过客户端向 YARN 中 ResourceManager 提交应用程序。

  2. ResourceManager 为该应用程序分配第一个 Container,并与对应的 NodeManager 通信,要求它在这个 Container 中启动这个应用程序的 ApplicationMaster

  3. ApplicationMaster 启动成功之后,首先向 ResourceManager 注册并保持通信,这样用户可以直接通过 ResourceManager 查看应用程序的运行状态。

  4. AM 为本次程序内部的各个 Task 任务向 RM 申请资源,并监控它的运行状态。

4、资源调度器

上图的 ResourceScheduler,负责给应用分配资源,它完全专用于调度作业,并不能跟踪应用的状态。

三种调度器:

  • FIFO Scheduler:先进先出调度器

  • Capacity Scheduler:容量调度器(默认)

  • Fair Scheduler:公平调度器

先进先出调度器

  • 先提交的应用先运行,不考虑优先级和范围。

  • 适用于负载较低的小规模集群,大型集群时,效率较低。

容量调度器

  • 允许多个组织共享整个集群资源,每个组织可以获得一部分计算能力,为每个组织划分子队列。

  • 弹性分配

公平调度器

  • 为所有应用分配公平的资源,可以在多个队列工作,允许资源共享和抢占。、

  • 举例:有两个用户A和B,每个用户有自己的队列。

    • A 启动一个作业,此时A享受全部集群资源。

    • 然后 B 在 A 运行时也启动了一个作业,此时A、B各自使用一半资源。

    • 又然后 B 又提交了一个作业,此时 A 占1/2,B的两个作业各占 1/4