0


Hadoop 原理及架构详解

### README

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

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


一、基础概念

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] <path> ...
  • 查看指定目录下的内容:hadoop fs -ls [-h] [-R] [<path> ...]
  • 上传文件:hadoop fs -put [-f] [-p] <localsrc> ... <dst>(下载是-get命令)
  • 查看文件内容:hadoop fs -cat <src> ...(也有一个-tail命令)
  • 拷贝:-cp
  • 追加数据到HDFS文件中:将多个文件内容追加到指定文件dst的尾部:hadoop fs -appendToFile <localsrc> ... <dst>
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 的中间结果进行某种进一步的结果整理。
  • 处理的数据类型都是 <key, value> 键值对。

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

  • 提供了统一的计算框架,隐藏了存储、划分、分发、结果收集、错误恢复等细节。
  • 通过抽象模型和计算框架把做什么 (what) 和怎么做 (how) 分开了,为程序员提供一个抽象和高层的编程接口和框架。
  • 程序员仅需要关心其应用层的具体计算问题,仅需要编写少量的处理应用本身计算问题的业务程序代码。

2、MapReduce 介绍

优点:

  • 易于编程
  • 良好的扩展性
  • 高容错性
  • 适合海量数据的离线处理,性能稳定。

缺点:

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

MapReduce 实例进程

有三类:

  • MRAppMaster:负责整个 MR 程序的过程调度及状态协调。
  • MapTask:负责 map 阶段的整个数据处理流程。
  • ReduceTask:负责 reduce 阶段的整个数据处理流程。

阶段组成

  • 一个 MapReduce 编程模型中只能包含一个 map 阶段和一个 reduce 阶段,或者只有 map 阶段。
  • 如果用户的业务逻辑非常复杂,那就只能多个 MapReduce 程序串行运行。

数据类型

  • 所有都是 kv 的键值对形式
  • 内置了很多默认属性,比如排序、分组等,都和数据的 key 有关。

执行流程图

3、map 阶段执行过程

  • 第一阶段:把输入文件按照某标准进行逻辑切片,默认128M,每个切片由一个MapTask 处理。
  • 第二阶段:对切片中的数据按照一定的规则读取解析返回 <key, value>
  • 第三阶段:调用 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
标签: hadoop 架构 大数据

本文转载自: https://blog.csdn.net/weixin_41930950/article/details/135776619
版权归原作者 Should·L 所有, 如有侵权,请联系我们删除。

“Hadoop 原理及架构详解”的评论:

还没有评论