### 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
具体流程
-
用户通过客户端向 YARN 中 ResourceManager 提交应用程序。
-
ResourceManager 为该应用程序分配第一个 Container,并与对应的 NodeManager 通信,要求它在这个 Container 中启动这个应用程序的 ApplicationMaster
-
ApplicationMaster 启动成功之后,首先向 ResourceManager 注册并保持通信,这样用户可以直接通过 ResourceManager 查看应用程序的运行状态。
-
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
-