Hadoop (一) Hadoop学习
1.Hadoop 简介
1.1 单独的 Hadoop软件
Hadoop是Apache 软件基金会开源的一款开源Java软件,用户编写简单的编程模型实现跨机器对海量数据分布式计算处理的框架
Hadoop的核心组件有
- Hadoop HDFS:分布式文件系统 大数据存储
- Hadoop YARN:集群的资源管理和任务调度框架 集群资源分配
- Hadoop MapReduce:分布式计算框架 大数据计算
1.2 Hadoop 生态
Hadoop 生态,基于 Hadoop 软件的大数据生态
1.3 起源
Dong Cutting 做Apache Lucene 子项目 Nutch (全网搜索引擎) 的问题大量数据的存储和索引;
三篇论文:
The Google file System
MapReduce:Simplified Data Processing on Large Clusters
Bigtable : A Distributed Storage System for Structred Data
1.4 发展
- HDFS:作为大数据分布式文件存储系统,底层核心
- YARN:分布式集群管理和任务调度平台,支持各种计算引擎运行
- MapReduce 作为大数据生态圈第一代分布式计算框架;现在很少直接使用,但是很多软件的底层都是使用MapReduce 来处理数据
1.5 优点
- 扩容能力强 集群可以扩张到数千节点
- 成本低: 低配置的机器也可以部署
- 效率高:并发的计算,节点数据是发布存储的
- 可靠性:数据多重备份,任务失败后查询部署计算
1.6 版本
开源社区版本 更新快 ,稳定性一般
商业公司版本 有些服务收费,稳定性兼容性较好,更新慢;
在社区版本中
Hadoop1.0 HDFS MapReduce
Hadoop2.0 HDFS MapReduce YARN
Hadoop3.0 对比2.0 着重于性能优化
2.Hadoop 集群
2.1 集群角色
Hadoop 集群包括两个集群,逻辑上是两个集群,集群之间相互不影响;部署的时候可能是一个物理节点,都是主从架构;MapReduce 是一个计算框架,没有集群概念;
- HDFS 集群角色
- 主角色:NameNode
- 从角色:DataNode
- 主角色的辅助角色,这个是辅助主节点一起干活的,不是主节点挂了上位的 SecondaryNameNode
- YARN 集群
- 主角色:ResourceManager
- 从角色:NodeManager
2.2 集群安装
略略略了,网上搜搜很多。。
2.3 Hadoop 安装目录结构
- bin 基本的管理脚本,sbin目录脚本的基础实现,可以直接使用
- etc Hadoop 配置文件所在的目录
- include 对外提供的编程库头文件
- lib Hadoop 对外提供的编程动态库和静态库,和include 结合使用
- libexec shell 配置文件所咋目录,用于配置日志输出,启动参数,jvm的参数等
- sbin Hadoop 集群启停脚本
- share Hadoop各个模块编译后的jar包所在目录
3.HDFS
Hadoop Distributed File System
3.1 分布式存储系统简介
思考一下什么是文件系统?
存储文件,管理文件,文件权限,查找文件 等操作,一般我们的操作系统比如Linux 和Windows都是有自己的文件系统,有目录树的结构;
文件系统一般会维护两种数据
- 数据 这个是数据本来的内容,比如就是图片,文档等
- 元数据 解释性数据,描述数据的数据,比如数据的权限,数据的大小,最后修改时间,数据文件所属用户等描述数据的信息;
大数据运算难点?
- 大量数据,数据分散,运算数据要来回移动,
- 数据IO 瓶颈,海量数据高吞吐量难以实现
- 无法快速部署和弹性扩容
为此出现分布式存储系统
- 分布式存储:数据存储在多个主机,理论上可以无线扩充机器存储
- 元数据记录:文件发布在多个节点,元数据记录数据存储节点和位置,便于快速查找
- 分块存储:单节点的话 文件过大,单机存储不了;分块存储后存在多个节点,还有就是操作数据的时候多个快一起操作,增加操作效率
- 副本机制:单节点的话 ,文件数据容易损坏;副本机制多节点相互备份,保证数据安全高可用;
3.2 HDFS 简介
HDFS 是一个分布式的文件管理系统;具有分布式文件管理系统的优点;综合管理多个计算机的存储文件,主要是处理大数据存储问题,提高数据容错,并提供统一的接口访问
3.3HDFS 历史
起源:Nutch 全网搜索的文件存储问题~
设计目标:
- 处理硬件故障,管理成百上千服务器,快速的故障检测和自动恢复是核心目标;
- 更加注重数据的高吞吐量而不是响应时间
- 文件一旦写入关闭后就不能修改,主要还是为了高吞吐量
- 移动计算的代价小于移动数据,程序像数据移动,而不是数据向程序移动
- 可以平台移植。
3.4 优缺点
优点:大文件场景,数据流式访问,低成本部署机器
缺单:小文件场景,小文件多,都去存储到元数据;低延迟场景;频繁修改数据的场景
3.5 架构
3.5.1主从
- 主从架构 master /slave
- 一个HDFS集群是有 一个NameNode 和一定数量的DataNode 组成
- NameNode 是HDFS 的主节点,DataNode 是从节点
3.5.2分块
- HDFS的文件是在物理上是分块的block; 默认的大小事128M ; 不足128M的就是一块;
- 块的大小是可以配置的,参数在hdfs-default.xml :dfs.blocksize
3.5.3 副本
- 所有的文件block都是会有副本,
- 副本是有参数来控制的的 dfs.replication 控制。默认时3. 就是数据会额外存储两份
3.5.4 元数据管理
- 文件自身的元数据,名称 大小 群贤 副本数量 数据块大小
- 文件块位置映射信息 ,表示一个文件在物理上存储在那块就是DataNode映射得到文件之间的信息;
3.5.5 namespace
- 层次型文件组织结构,用户可以创建,修改,重命名 这些文件或者文件夹
- NameNode 负责维护这些namespace 名称空间,所有的修改都会被NameNode记录
- 所有的文件都会被提供一个统一的抽象目录树,客户端通过这个路径来访问比如 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sRrqRgTb-1658124268451)(D:\Resource\note\大数据\hadoop\4.png)]
3.5.6 数据块存储
- 文件的block具体的存储是有DataNode节点来处理的
- 一个Block 是存储在多个DataNode 上面的
3.5.7 HDFS Shell
hadoop dfs ******
hadoop fs -ls file:///
hadoop fs -ls hdfs://node1:8020/
hadoop fs -ls /
hadoop fs -help
hadoop fs -mkdir -p /sff/sff/sff
hadoop fs -ls -h -R /
hadoop fs -put [-f] [-p] <localsrc> <dst>
hadoop fs -put [-f] [-p] <src> <localdst>
hadoop fs -cp [-f] <src> <dst>
hadoop fs -mv <src> <dst>
hadoop fs -appendToFile <localsrc> <dst>
hadoop fs -cat /user/hive/warehouse/hivedemo.db/xxxx/xxxxx.txt
3.6 角色解释
官方架构
3.6.1 主角色 NameNode
- NameNode 是Hadoop的HDFS 的核心,架构中的主角色
- NameNode维护个管理文件系统的元数据,包括目录树结构,文件,块的位置信息,访问权限等信息,不存储实际的数据
- 内部通过磁盘和内存两种方式来管理元数据
- NameNode 是Hadoop集群的单点故障,
- NameNode 机器会配置大量内存RAM
- NameNode 不会持久化DataNode 的位置信息,这些信息会在启动系统是DataNode 注册过来
3.6.2 从角色 DataNode
- DataNode 是Hadoop的HDFS 的从角色
- DataNode 的数量决定了HDFS集群的整体数据的存储能力,通过DataNode 配合维护者数据块,该节点的磁盘配置比较大
- DataNode 启动的时,会把自己注册到NameNode 并汇报自己负责的块列表
- 单DataNode 关闭时,不会影响数据的可用性,NameNode 会安排其他的DataNode 管理的块进行副本复制
3.6.2 主角色辅助角色SecondaryNameNode
- SecondaryNameNode 是 NameNode 的辅助节点 ,无法替代NameNode
- 主要的职责是帮助主角色进行元数据的合并动作。
3.7 HDFS写数据
3.7.1 Pipeline
Pipeline 意为管道,是HDFS 在上传文件写数据过程中采用的一种数据传输方式,客户端把数据写入到一个DataNode1,DataNode1再把数据复制到DataNode2在复制到其他DataNode节点;
充分利用每个机器的宽带资源
3.7.2 Ack
Ack确认信号,接受方给发送方发送一种传输控制类的字符,表示发来的数据已经确认接受到所有数据;用来保证数据传输安全;
3.7.3 BlockPlacementPolicyDefault
副本策略 3 个
第一个副本:有限客户端本地,否则随机
第二个副本:不同于第一个的机架
第三个副本:第二个副本相同的机架不同机器
3.8 读取数据
- DistributedFileSystem open() 表示读取文件
- RPC调用namenode来确定文件中前几个块的块位置(分批次读取)信息
- 最近的DataNode 节点获取数据
4.MapReduce
4.1 MapReduce 思想
- 核心就是先分再合,分而治之
- 先拆分:复杂的问题先分解成小问题,然后逐步解决;再合并 :最后把各部分的结果整合成最终结果
- Map 就是拆分,把复杂的问题分解成小问题,多节点并行处理,节点之间没有相互依赖
- Reduce 合并 对Map 阶段数据汇总
编程模型
- map: 对一组数据元素进行某种重复式的处理; (k1; v1) → (k2; v2)
- reduce: 对Map的中间结果进行某种进一步的结果整理 (k2; [v2]) → (k3; v3)
- MapReduce处理的数据类型是**键值对**
- 隐藏底层细节,比如数据存储,分发,容错,调度 等,只需要编写MapReduce程序即可
4.2 分布式计算
- 区别于集中式计算,单节点的计算能力有限,如果是集中式计算,更加耗时
- 把任务分配给多节点计算之后,多节点并行计算,提高计算的效率
MapReduce 就是分布式计算框架:可以轻松编写分布式应用程序,容错的方式处理大量硬件集群和大量数据
4.3 MapReduce 优点
- 易于编程 基于MapReduce的二次开发应用程序,实现提供的接口,程序交给计算框架运行;
- 扩展性好 程序可以增加节点来增加计算能力,支持海量数据并行计算
- 高容错性 单节点故障时, 集群会把节点的任务转移
- 海量数据的离线处理 GB、TB和PB级别得数据量
4.3 MapReduce 缺点
- 实时计算性能差 主要离线作业 ;无法作到秒级或者是亚秒级得数据响应
- 不能进行流式计算 流式计算特点是数据是源源不断得计算,并且数据是动态的;MapReduce主要是针对静态数据集
4.4 MapReduce实例进程
- MRAppMaster MapReduce 程序的过程调度及状态协调
- MapTask Map阶段的整个数据处理流程
- ReduceTask Reduce阶段的整个数据处理流程
一个MapReduce编程模型 **只能有一个个Map阶段和一个Reducee阶段,或者只有Map阶段;**业务复杂的话就是多个MapReduce 串行执行
4.5 Map执行流程
- 目录下的文件逻辑切片,默认Split size = Block size(128M),每个切片一个MapTask处理
- 对切片中的数据按照一定的规则读取解析返回对;默认是按行读取数据。 key :起始位置偏移量 value :行数据
- Mapper 类的 map 方法处理数据 ,每读取解析出来的一个 ,调用一次map方法。
- 键值对进行分区partition。默认不分区
- Map输出数据写入内存缓冲区,达到比例溢出到磁盘上
- 溢出文件进行最终的merge合并,成为一个文件
4.6 Reduce执行流程
- ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据
- 全部进行合并merge,即把分散的数据合并成一个大的数据 ,合并排序
- 排序后调用reduce方法 ,输出到HDFS文件中
4.7 shuffle概念
而在MapReduce中,指的是将map端的无规则输出按指定的规则转变成具有一定规则的数据,以便reduce端接收处理
Map --> shuffle —> shuffle —>Reduce
Map端Shuffle
- Collect key 默认Hash分区后,在对该分区hash计算
- Spill 分区到达阈值 写入本地磁盘,写入前来一个排序操作
- Merge 把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件
Reduce端Shuffle
- Copy ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据
- Merge ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作
- Sort 对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可
shuffle机制弊端
- MapReduce的核心
- Shuffle比较慢 ,MapReduce相比较于Spark、Flink计算引擎慢的原因
- Shuffle 频繁涉及到数据在内存、磁盘之间的多次交互
5.YARN
5.1 YARN简介
- Apache Hadoop YARN (yet Another Resource Negotiator 一种资源协调者)是一种新的Hadoop资源管理器
- YARN 是一个通用资源管理系统和调度平台,为上层应用提供统一的资源管理和调度,资源比如CPU ,内存,调度的算法规则
- 支持各种计算程序,不仅仅是MapReduce 程序 ,通用性较好
5.2 YARN架构
5.3 YARN角色
- ResourceManager ,集群中的主角色,决定系统中所有程序的资源分配的最后仲裁,接受用户提交的作业请求,并通过NodeManager 去分配节点上的资源
- NodeManager 一个机器上一个 ,负责管理本机上的计算资源,接受ResourceManager 的指令,启动Container 容器并向ResourceManager 主角色汇报当前情况
- ApplicationMaster 用户提交的每个程序包含一个AM ,应用程序的老大,负责各个阶段的程序资源申请,监督程序执行
5.4 YARN作业提交流程
- MapReduce 作业提交 Client–>ResourceManager
- 资源的申请 MrAppMaster–>ResourceManager
- MR作业状态汇报 Container(Map|Reduce Task)–>Container(MrAppMaster)
- 节点的状态汇报 NodeManager–>ResourceManager
- 1.客户端向YARN中ResourceManager提交应用程序
- 2.ResourceManager为应用程序分配一个Container ,并与对应的NodeManager通信,要求在Container 启动 ApplicationMaster
- 3.ApplicationMaste r启动成功后,和ResourceManager 注册保持通信,用户可以通过ResourceManager 查看程序运行状态
- 4.ApplicationMaster 为本次程序内部的各个Task任务向ResourceManager 申请资源,并监控它的运行状态;
- 5.ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务
- 6.NodeManager 为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
- 7.Task通过协议向ApplicationMaster 汇报自己的状态和进度
- 8.应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己。
5.5 Resource Scheduler
在YARN中,负责给应用分配资源的就是Scheduler,它是ResourceManager的核心组件之一。
有三种调度策略;如果需要使用其他的调度器,可以在yarn-site.xml中的yarn.resourcemanager.scheduler.class进行配置。
- FIFO Scheduler 先进先出调度器 、先提交的应用先运行 不考虑优先级和范围 ;适用于负载较低的小规模集群,
- 优:无需配置、先到先得、易于执行;
- 劣:任务的优先级不会变高,因此高优先级的作业需要等待
- Capacity Scheduler 容量调度器 、是Apache Hadoop3.x默认调度策略;通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源
- 优:层次化的队列设计,每个队列都不会占用整个集群的资源。每个队列有严格的访问控制,弹性分配
er 注销并关闭自己。
5.5 Resource Scheduler
在YARN中,负责给应用分配资源的就是Scheduler,它是ResourceManager的核心组件之一。
有三种调度策略;如果需要使用其他的调度器,可以在yarn-site.xml中的yarn.resourcemanager.scheduler.class进行配置。
- FIFO Scheduler 先进先出调度器 、先提交的应用先运行 不考虑优先级和范围 ;适用于负载较低的小规模集群,
- 优:无需配置、先到先得、易于执行;
- 劣:任务的优先级不会变高,因此高优先级的作业需要等待
- Capacity Scheduler 容量调度器 、是Apache Hadoop3.x默认调度策略;通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源
- 优:层次化的队列设计,每个队列都不会占用整个集群的资源。每个队列有严格的访问控制,弹性分配
- Fair Scheduler 公平调度;提供了YARN应用程序公平地共享大型集群中资源的另一种方式。所有的应用分配公平的资源,公平调度可以在多个队列间工作,允许资源共享和抢占。