目录
- Hadoop概述
- Hadoop 发展历史
- Hadoop 三大发行版本
- 1.Apache Hadoop(常用)
- 2.Cloudera Hadoop
- 3.Hortonworks Hadoop
- 优势
- 优势总结——4高(高可靠、高扩展、高效、高容错)
- Hadoop组成
- 1.==HDFS==
- 管理者:NameNode(nn)
- 工作者:DataNode(dn)
- 辅助管理者:SecondaryNameNode(2nn)
- HDFS的优缺点
- 优点:
- 缺点
- HDFS的写数据流程
- HDFS的读数据流程
- 2.==YARN==
- YARN工作机制
- YARN作业提交过程
- 1.作业提交
- 2.作业初始化
- 3.任务分配
- 4.任务运行
- 5.进度和状态更新
- 6.作业完成
- YARN调度器和调度算法
- 1. FIFO调度器(First In First Out)
- 2.容量调度器(Capacity Scheduler)
- 特点
- 资源分配算法
- 3.公平调度器
- 特点
- 公平调度器队列资源分配方式:
- 3.==MapReduce==
- MapReduce核心思想
- Mapper:
- Reduce:
- MapReduce优缺点
- 优点:
- 缺点:
- MapReduce进程
- MapReduce框架原理
- 1.MapTask并行度决定机制
- 2.FileInputFormat切片解析
- 3.TextInputFormat实现类
- TextInputFormat
- KeyValueTextInputFormat
- NLineInputFormat
- CombineTextInputFormat
- 4.CombineTextInputFormat切片机制
- MapReduce工作流程
- 1. mapTask阶段
- 2.shuffle阶段
- 3.reduce阶段
- HDFS、YARN、MapReduce 三者关系
- Hadoop生态体系
- Hadoop的工作方式
- Hadoop的守护进程
Hadoop概述
Hadoop 是使用 Java 编写,允许分布在集群,使用简单的编程模型的计算机大型数据集处理的Apache 的开源框架。
- 主要解决,海量数据的存储和海量数据的分析计算问题。
- 广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈。
Hadoop 发展历史
-
Hadoop创始人Doug Cutting,为 了实 现与Google类似的全文搜索功能,他在Lucene框架基础上进行优化升级,查询引擎和索引引擎。
-
2001年年底Lucene成为Apache基金会的一个子项目。
-
对于海量数据的场景,Lucene框架面对与Google同样的困难,存储海量数据困难,检索海量速度慢。
-
学习和模仿Google解决这些问题的办法 :微型版Nutch。
-
可以说Google是Hadoop的思想之源(Google在大数据方面的三篇论文)
GFS —>HDFS
Map-Reduce —>MR
BigTable —>HBas -
2003-2004年,Google公开了部分GFS和MapReduce思想的细节,以此为基础Doug Cutting等人用了2年业余时间实现了DFS和MapReduce机制,使Nutch性能飙升。
-
2005 年Hadoop 作为 Lucene的子项目 Nutch的一部分正式引入Apache基金会。
-
2006 年 3 月份,Map-Reduce和Nutch Distributed File System (NDFS)分别被纳入到 Hadoop 项目中,Hadoop就此正式诞生,标志着大数据时代来临。
-
名字来源于Doug Cutting儿子的玩具大象
Hadoop 三大发行版本
Apache、Cloudera、Hortonworks。
- Apache 版本最原始(最基础)的版本,对于入门学习最好。【2006】
- Cloudera 内部集成了很多大数据框架,对应产品 CDH。【2008】
- Hortonworks 文档较好,对应产品 HDP。【2011】现在已经被 Cloudera 公司收购,推出新的品牌 CDP。官网地址:https://www.cloudera.com/products/pricing.html
1.Apache Hadoop(常用)
官网地址:http://hadoop.apache.org
下载地址:https://hadoop.apache.org/releases.html
2.Cloudera Hadoop
官网地址:https://www.cloudera.com/downloads/cdh
下载地址:https://docs.cloudera.com/documentation/enterprise/6/releasenotes/topics/rg_cdh_6_download.html
- 2008 年成立的 Cloudera 是最早将 Hadoop 商用的公司,为合作伙伴提供 Hadoop 的
商用解决方案,主要是包括支持、咨询服务、培训。 - 2009 年 Hadoop 的创始人 Doug Cutting 也加盟 Cloudera 公司。Cloudera 产品主
要为 CDH,Cloudera Manager,Cloudera Support - CDH 是 Cloudera 的 Hadoop 发行版,完全开源,比 Apache Hadoop 在兼容性,安
全性,稳定性上有所增强。Cloudera 的标价为每年每个节点 10000 美元。 - Cloudera Manager 是集群的软件分发及管理监控平台,可以在几个小时内部署好一
个 Hadoop 集群,并对集群的节点及服务进行实时监控。
3.Hortonworks Hadoop
官网地址:https://hortonworks.com/products/data-center/hdp/
下载地址:https://hortonworks.com/downloads/#data-platform
- 2011 年成立的 Hortonworks 是雅虎与硅谷风投公司 Benchmark Capital 合资组建。
- 公司成立之初就吸纳了大约 25 名至 30 名专门研究 Hadoop 的雅虎工程师,上述
工程师均在 2005 年开始协助雅虎开发 Hadoop,贡献了 Hadoop80%的代码。 - Hortonworks 的主打产品是 Hortonworks Data Platform(HDP),也同样是 100%开
源的产品,HDP 除常见的项目外还包括了 Ambari,一款开源的安装和管理系统。 - 2018 年 Hortonworks 目前已经被 Cloudera 公司收购
优势
- Hadoop 是专为从单一服务器到上千台机器扩展,每个机器都可以提供本地计算和存储。
- Hadoop可以用单节点模式安装,但是只有多节点集群才能发挥 Hadoop 的优势,我们可以把集群扩展到上千个节点,而且扩展过程中不需要先停掉集群。
优势总结——4高(高可靠、高扩展、高效、高容错)
-
高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
-
高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。
-
高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
-
高容错性:能够自动将失败的任务重新分配。
Hadoop组成
1.HDFS
HDFS :即 Hadoop 分布式文件系统(Hadoop Distribute File System),以分布式存储的方式存储数据。负责海量数据的存储
HDFS 也是一种 Master-slave 架构,NameNode 是运行 master 节点的进程,它负责命名空间管理和文件访问控制。DataNode 是运行在 slave 节点的进程,它负责存储实际的业务数据,如下图:
管理者:NameNode(nn)
存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
作用:负责管理,管理集群内各个节点。
- 维护管理文件系统的元数据(指的是数据的存放位置或存放路径)或名字空间
- 负责确定指定的文件块到具体的Datanode结点的映射关系。
- 维护管理 DataNode上报的心跳信息
- 管理真实的数据的元数据(也就是文件、日志、视频、图片、等)
工作者:DataNode(dn)
在本地文件系统存储文件块数据,以及块数据的校验和。
作用:主要进行负责真实数据的块存储,负责工作,进行读写数据。 周期向NameNode汇报。
- 执行数据的读写(响应的是客户端)
- 周期性向NameNode做汇报(数据块的信息、校验和)
若datanode 10分钟没有向NameNode做汇报,表示已丢失(已宕机)
心跳周期 3秒 - 执行流水线的复制(将一份大数据切成若干份,一份一份的复制到三个节点,复制完一份下一份才开始复制)
辅助管理者:SecondaryNameNode(2nn)
每隔一段时间对NameNode元数据备份。
作用:责辅助NameNode管理工作。主要是对NameNode进行数据的备份,一般要恢复数据时候才会用到这个的。
HDFS的优缺点
优点:
- 高容错性
数据采用多副本保存方式,当集群中的某些机器宕机了,数据可以从其他正常运行的机器获取 - 适合处理大数据
通过将大文件切分成小的数据块存储到不同服务器上,可以实现一个大文件的存储,同时通过联合多个服务器多块硬盘实现整个存储系统的大容量,大文件的分片存储,不同分片可以进行并行读写操作,进而实现数据的高速访问。
NameNode负责文件元数据的操作,DataNode负责处理文件的读写请求,文件数据流不会经过NameNode的处理,只会跟存储在具体DataNode进行联系,因此NameNode不会成为系统的瓶颈,成百上千台DataNode节点应对文件内容数据流的读写,其吞吐量大大提高了。 - 可靠性
缺点
- 不适合做实时数据访问
- 无法对大量小文件进行存储。存储大量小文件会占用NameNode大量的内存去存储元数据信息。小文件存储的寻址时间会超过读取时间
最佳传输损耗理论:在一次传输中,寻址时间占用总传输时间的1%时,本次传输的损耗最小,为最佳性价比传输!
目前硬件的发展条件,普通磁盘写的速率大概为100M/S, 寻址时间一般为10ms!
(10ms / 1%) * 100M/S = 100M
- 不支持并发写入,文件随机修改。一个文件不允许多个线程同时写,仅支持追加,不支持修改
HDFS的写数据流程
- 客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在,并返回结果
- 客户端请求 Block上传到哪几个DataNode上,NameNode返回DataNode节点
- 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。dn1、dn2、dn3逐级应答客户端。
- 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
- 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。
HDFS的读数据流程
- 客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
- 就近原则挑选一台DataNode(然后随机)服务器,请求读取数据。
- DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
- 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
2.YARN
Yet Another Resource Negotiator 简称 YARN :是一个资源管理系统,其作用就是把资源管理和任务调度/监控功分割成不同的进程,Yarn 有一个全局的资源管理器叫 ResourceManager,每个 application 都有一个 ApplicationMaster 进程。一个 application 可能是一个单独的 job 或者是 job 的 DAG (有向无环图)。
在 Yarn 内部有两个守护进程:
- ResourceManager :负责给 application 分配资源
- NodeManager :负责监控容器使用资源情况,并把资源使用情况报告给 ResourceManager。这里所说的资源一般是指CPU、内存、磁盘、网络等。
ApplicationMaster 负责从 ResourceManager 申请资源,并与 NodeManager 一起对任务做持续监控工作。
- ResourceManager(RM):整个集群资源(内存、CPU等)的老大
- 处理客户端请求。
- 监控 NodeManager。
- 启动或监控 ApplicationMaster。
- 资源的分配与调度。
- ApplicationMaster(AM):单个任务运行的老大
- 负责数据的切分。
- 为应用程序申请资源并分配给内部的任务。
- 任务的监控与容错。
- NodeManager(N M):单个节点服务器资源老大
- 管理单个节点上的资源。
- 处理来自 ResourceManager 的命令。
- 处理来自 ApplicationMaster 的命令。
- 资源的分配与调度。
- Container:容器,相当一台独立的服务器,里面封装了任务运行所需要的资源,如内存、CPU、磁盘、网络等。
- Container 是 Yarn 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。
YARN工作机制
- MR程序提交到客户端所在的节点。
- YarnRunner向ResourceManager申请一个Application。
- RM将该应用程序的资源路径返回给YarnRunner。
- 将运行所需资源提交到HDFS上。资源提交完毕后,申请运行mrAppMaster。
- RM将用户的请求初始化成一个Task。
- 其中一个NodeManager领取到Task任务,并创建容器Container,产生MRAppmaster。
- Container从HDFS上拷贝资源到本地。MRAppmaster向RM 申请运行MapTask资源。
- RM将运行MapTask任务分配给另外两个NodeManager,并创建容器。
- MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
- MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
- ReduceTask向MapTask获取相应分区的数据。
- 程序运行完毕后,MR会向RM申请注销。
YARN作业提交过程
1.作业提交
客户端向yarn提交一个作业
- 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
- 第2步:并申请一个作业id。
- 第3步:RM给Client返回该job资源的提交路径和作业id。
- 第4步:Client提交jar包、切片信息和XML文件到指定的资源提交路径。
- 第5步:提交完资源后,向RM申请运行MrAppMaster。
2.作业初始化
- 第6步:当RM收到Client的请求后,将该job添加到调度器中。
- 第7步:空闲的NM领取到该Job,并创建Container,并产生MRAppmaster,并下载Client提交的资源到本地。
3.任务分配
- 第10步:MrAppMaster向RM申请运行多个MapTask任务资源。
- 第11步:RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
4.任务运行
- 第12步:MR向两个接收到任务的NodeManager发送程序启动脚本。
- 第13步:MrAppMaster等所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
- 第14步:ReduceTask向MapTask获取相应分区的数据。
- 第15步:程序运行完毕后,MR会向RM申请注销自己。
5.进度和状态更新
- YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒向应用管理器请求进度更新, 展示给用户。
6.作业完成
- 除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。作业完成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
YARN调度器和调度算法
Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。
Apache Hadoop3.1.3默认的资源调度器是容量调度器,
CDH框架默认调度器是公平调度器。
1. FIFO调度器(First In First Out)
- 特点:FIFO调度器按照任务到达的时间排序,先到先服务, 在当前强调多租户和资源利用率的大环境下,FIFO的使用率并不高。
- 优点:简单,不需要配置。
- 缺点:不适合共享集群。如果有大的app需要很多资源,那么其他app可能会一直等待。
2.容量调度器(Capacity Scheduler)
- 是Yahoo开发的多用户调度器。
- 调度策略:优先学则资源利用率低的队列。
- 每个队列可以单独设置资源分配方式:FIFO、DRF
特点
- 多队列:每个队列可以配置一定的资源量,每个队列采用FIFO调度策略
- 容量保证:管理员可以为每个队列设置资源,保证最低资源和资源使用上限
- 灵活性:如果一个队列中的资源有剩余,可以把这些资源共享给需要资源的队列,如果该队列有新的应用程序提交,则会收回对应资源
- 多用户:支持多用户共享集群和多应用程序同时运行。为了防止一个用户的作业独占资源,该调度器会对同一个用户提交的作业所占的资源量进行限定。
资源分配算法
队列资源分配: 从root开始使用深度优先算法,优先选择资源占用率最低的队列分配资源。
作业资源分配: 默认按照提交作业的优先级和提交时间的顺序分配资源。
容量资源分配: 按照容器的优先级分配资源,如果优先级相同则按照数据本地性原则
- 任务和数据在同一节点
- 任务和数据在同一机架
- 任务和数据不在同一节点也不在同一机架
3.公平调度器
- 公平调度器由FaceBook开发,其设计目的是在事件尺度上,所有作业获得公平的资源。
- 核心调度策略:优先选择对资源缺额比较大的。
特点
- 每个队列可以单独设置资源分配方式:FIFO、FAIR、DRF
- 与Capacity Scheduler调度器具有相同的1~4点。
- 缺额:某一时刻一个作业应获资源和实际资源的差距叫“缺额”。
公平调度器队列资源分配方式:
- FIFO策略:
- 采用此种方法则与容量调度器一致。公平调度器每个队列资源分配策略如果选择FIFO,则公平调度器相当于容量调度器。
- Fair策略:
- Fair策略是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。
- FAIR策略默认情况下是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下每个队列内部采用该方法来分配资源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可以得到1/2的资源。具体资源分配流程和容器调度器一致:【选择队列——选择作业——选择容器】
- 上述三个步骤都是按照公平策略分配资源:
- 实际最小资源份额:mindshare = Min(资源需求量,配置的最小配额)
- 是否饥饿:isNeedy = 资源使用量 < mindshare(实际最小资源份额)
- 资源分配比:mindShareRatio = 资源使用量 / Max(mindshare, 1)
- 资源使用权重比:useToWeightRatio = 资源使用量 /权重
- DRF策略
- DRF(Dominant Resource Fairness),通常的资源都是单一的标准,例如只考虑内存的情况(YARN默认情况),但是多数情况是多种资源的复合,从而难以衡量两个应用应该分配的资源比例。
- YARN中DRF的调度方式: 假设集群一共有100 CPU 和10T内存,而应用 A 需要(2 CPU ,300GB),应用 B 需要(6 CPU ,100GB)。则两个应用分别需要 A (2%CPU。3%内存)和 B (6%CPU,1%肉存)的资源,这就意味着 A 是内存主导的,,B 是 CPU 主导的,针对这种情况,可以选择 DRF 策略对不同应用进行不同资源,CPU和内存的一个不同比例的限制。
3.MapReduce
Hadoop MapReduce 是一种编程模型,它是 Hadoop 最重要的组件之一。它用于计算海量数据,并把计算任务分割成许多在集群并行计算的独立运行的 task。
MapReduce核心思想
MapReduce 是 Hadoop的核心,分布式的离线并行计算框架,对海量数据的处理。将计算过程主要分为Map和Reduce两个阶段,Map阶段并行处理输入数据,Reduce阶段对Map结果进行汇总。它会把计算任务移动到离数据最近的地方进行执行,因为移动大量数据是非常耗费资源的。
- 分布式的运算程序往往需要分成至少2个阶段,map阶段和reduce阶段。
- map阶段的MapTask并发实例,并行运行,互不相干。
- reduce阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
- MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
总结: 分析WordCount数据流走向深入理解MapReduce核心思想。
Mapper:
- 第一阶段是把输入文件进行分片(inputSplit)得到block。有多少个block就对应启动多少maptask
- 第二阶段是对输入片中的记录按照一定的规则解析成键值对。键(key)表示每行首字符偏移值,值(value)表示本行文本内容。
- 第三阶段是调用map方法。解析出来的每个键值对,调用一次map方法。
- 第四阶段是按照一定规则对第三阶段输出的键值对进行分区。
- .第五阶段是对每个分区中的键值对进行排序。首先按照键进行排序,然后按照值。完成后将数据写入内存中,内存中这片区域叫做环形缓冲区。
Reduce:
- 第一阶段(copy)reduce任务从Mapper任务复制输出的键值对。
- 第二阶段(sort)合并排序是把复制到Reduce本地数据,全部合并。再对合并后的数据排序
- 第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。
MapReduce优缺点
优点:
- 易于编程:简单的实现一些接口就可以完成分布式程序。
- 良好的拓展性:计算资源不足时可以通过增加机器提高能力。
- 高容错性:一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,这个过程由hadoop内部完成。
- 适合PB级以上的海量数据的离线处理
缺点:
- 不擅长实时计算
- 不擅长流式计算:因为MapReduce自身的设计特点决定了数据源必须是静态的。
- 不擅长有向无环图计算:MapReduce不擅长后一个应用程序的输入为前一个的输出,因为每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。
MapReduce进程
一个完整的MapReduce程序在分布式运行时有三类实例进程:
- MrAppMaster:负责整个程序的过程调度及状态协调。
- MapTask:负责Map阶段的整个数据处理流程。
- ReduceTask:负责Reduce阶段的整个数据处理流程。
MapReduce框架原理
1.MapTask并行度决定机制
数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。
- 一个job的map阶段并行度由客户端在提交job时的切片数决定
- 每个split切片分配一个mapTask并行实例处理
- 默认情况下切片大小=blocksize
- 切片针对每一个文件切片
2.FileInputFormat切片解析
- 程序先找到数据存储目录
- 遍历目录下的每个文件
- 遍历第一个文件
(1)获取文件大小
(2)计算切片大小(默认情况下切片大小=blocksize)
(3)每次切片时要判断剩下的部分是否大于块的1.1倍,不大于则划分一块切片
(4)将切片信息写到一个切片规划文件中
(5)切片的核心过程在getSplit()方法中完成
(6)InputSplit只记录了切片的元数据信息(起始位置,长度,所在节点等) - 提交切片规划文件到yarn上,由yarn的MrAppMaster根据切片规划文件开启对应的mapTask。
3.TextInputFormat实现类
FileInputFormat常见的接口实现类包括:TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat和自定义InputFormat等。
TextInputFormat
- TextInputFormat是默认的FileInputFormat实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量, LongWritable类型。值是这行的内容,不包括任何行终止符(换行符和回车符),Text类型。
TextInputformat将每一行在文件中的起始偏移量作为 key,每一行的内容作为value。默认以\n或回车键作为一行记录。
KeyValueTextInputFormat
- KeyValueTextInputFormat是FileInputFormat的一个实现类,每一行为一条记录,被分隔符分割为key,value。
- 可以通过在驱动类中设置conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR,“\t”)设置分割符。
KeyValueTextInputFormat 适合处理输入数据的每一行是两列,并用 tab 分离的形式
NLineInputFormat
- 如果使用NlineInputFormat,代表每个map进程处理的InputSplit不再按block块去划分,而是按NlineInputFormat指定的行数N来划分。
CombineTextInputFormat
- CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。
4.CombineTextInputFormat切片机制
虚拟存储切片最大值设置:CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);
- 虚拟存储过程:
将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)。
例如setMaxInputSplitSize值为4M,输入文件大小为8.02M,则先逻辑上分成一个4M。剩余的大小为4.02M,如果按照4M逻辑划分,就会出现0.02M的小的虚拟存储文件,所以将剩余的4.02M文件切分成(2.01M和2.01M)两个文件。 - 切片过程:
(a)判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。
(b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
MapReduce工作流程
MapReduce工作流程由submit阶段,mapTask阶段,shuffle阶段,reduce阶段组成
1. mapTask阶段
- 客户端提交切片,jar包,xml文件给yarn,由MrAppMaster获取切片信息打开对应数量的mapTask。
- mapTask通过InputFormat调用RecordReader的read()方法读取外部的数据,解析出key/value.
- 当数据处理完成后,调用OutputCollector.collect()输出结果。它会将生成的key/value分区,并写入环形内存缓冲区中。
2.shuffle阶段
- 当环形缓冲区达到80%后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。
- ①在环形缓冲区内部,会对数据进行一次分区排序。利用快速排序算法对分区编号进行排序,然后再对key进行排序,这样可以保证同一分区内所有数据按照key有序。②按照分区编号由小到大依次将每个分区中的数据写入到任务工作目录下的临时文件spillN.out中,如果设置了Combiner,则写入文件前会对分区中的数据进行合并操作。③分区内元数据信息会写入到内存索引数据结构SpillRecord中,如果当前内存索引大小超过1MB,则将内存索引写到文件output/spillN.out.index中。
- 当所有数据处理完成后,MapTask将所有临时文件合并成一个大文件,同时生成相应的索引文件。
MapTask以分区为单位进行合并。对于某个分区,它将采用多轮递归合并的方式。每轮合并10个文件,并将产生的文件重新加入待合并列表中,对文件排序后,重复以上过程,直到最终得到一个大文件。
3.reduce阶段
- Reduce会根据自己的分区,去maptask中拉取属于自己的数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
- 在拉取数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。
- 当合并完成后reduce()函数将计算结果写到HDFS上。
HDFS、YARN、MapReduce 三者关系
Hadoop生态体系
组件 | 介绍 |
---|---|
Hadoop HDFS(核心) | Hadoop 分布式存储系统; |
Yarn(核心) | Hadoop 2.x版本开始才有的资源管理系统; |
MapReduce(核心) | 并行处理框架; |
HBase | 基于HDFS的列式存储数据库,它是一种 NoSQL 数据库,非常适用于存储海量的稀疏的数据集; |
Hive | Apache Hive是一个数据仓库基础工具,它适用于处理结构化数据。它提供了简单的 sql 查询功能,可以将sql语句转换为 MapReduce任务进行运行; |
Pig | 它是一种高级脚本语言。利用它不需要开发Java代码就可以写出复杂的数据处理程序; |
Flume | 它可以从不同数据源高效实时的收集海量日志数据; |
Sqoop | 适用于在 Hadoop 和关系数据库之间抽取数据; |
Oozie | 这是一种 Java Web 系统,用于Hadoop任务的调度,例如设置任务的执行时间和执行频率等; |
Zookeeper | 用于管理配置信息,命名空间。提供分布式同步和组服务; |
Mahout | 可扩展的机器学习算法库。 |
Hadoop的工作方式
Hadoop 以主从的方式工作,如图:
- 一个Master节点和多个Slave节点,Slave节点可以扩展到1000个;
- Master节点管理,维护和监控Slave节点,Slave节点是真正在干活的机器;
- Master节点应该部署在配置较高的机器上面,因为它是Hadoop集群的核心;
- Master存储元数据(即数据的数据),Slave是真正存储数据的机器;
- 客户端通过Master节点来分发任务。
Hadoop的守护进程
Hadoop主要有四个进程:
- NameNode :它是HDFS运行在Master节点守护进程。
- DataNode:它是 HDFS 运行在Slave节点守护进程。
- ResourceManager:它是 Yarn 运行在 Master 节点守护进程。
- NodeManager:它是 Yarn 运行在 Slave 节点的守护进程。
除了这些,可能还会有 secondary NameNode,standby NameNode,Job HistoryServer 等进程。