Hadoop入门
Hadoop入门
题型
一、填空题(共10个空,每空1分,共10分)
二、不定项选择题(共15小题,每题2分,共30分)
三、问答题(共6小题,共40分)
四、论述题(共2小题,每题10分,共20分)
第一章
1.1 大数据的概念、类型
大数据指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
大数据的类型大致可分为三类:
- 传统企业数据:包括 CRM系统中的客户数据,传统的ERP数据,网上商店交易数据、库存数据以及账目数据等。
- 机器和传感器数据:包括详细呼叫记录,网络日志、工业设备传感器,设备日志,交易数据等
- 社交数据:包括用户行为记录,反馈数据等。如来Twitter、Facebook等在线社交平台。
1.2 大数据的特征
体密真种速
数据的体量巨大(Volume)
价值密度低(Value):大数据规模越大,真正有价值的数据相对越少
数据真实性(Veracity):真实性和质量,aplhago
数据的多样性(Variety)
流动速度快(Velocity):一是数据产生得快,二是数据处理得快。
1.3 大数据的计算模式
- 批处理计算
- 针对大规模数据(按批次收集和处理)的离线周期性批量处理。主要技术有MapReduce、Spark
- 数据仓库、离线分析、大规模数据挖掘等
- 流计算
- 针对流数据的实时计算处理,数据在产生的同时被处理。主要技术:Storm、Streams等。
- 实时推荐系统、实时日志分析、实时风险监控等
- 图计算
- 针对大规模图结构数据的处理。主要技术:Pregel、Giraph等
- 社交网络的数据,谁和谁关系较好等
- 查询分析计算
- 大规模数据的存储管理和查询分析。主要技术:Hive、Impala等。
- 对数据仓库中的数据,用sql语句进行查询分析
1.4 大数据、云计算和物联网之间的区别和联系
区别
- 大数据是为了从海量数据中发掘数据资产的价值,对象是数据
- 云计算本质上旨在整合和优化各种IT资源,并通过网络以服务的方式廉价提供给用户,实现计算、网络、存储资源的弹性管理。云计算可以大量节约使用成本。
- 物联网的发展目标是实现物物相连,应用创新是物联网发展的核心。物联网使得获取信息更容易,对象是各类物品。
联系
从整体上看,大数据、云计算和物联网这三者是相辅相成的。大数据根植于云计算,大数据分析的很多技术都来自于云计算(提供数据存储和管理、数据分析),大数据为云计算提供了“用武之地”(就是具有大量的数据,以及对大量数据分析应用的需求),物联网源源不断地产生的大量数据,构成了大数据的重要来源,物联网借助于云计算和大数据技术,实现物联网大数据的存储、分析和处理。
云计算为进行大数据分析提供了算力与资源,把计算资源虚拟化形成资源池进行大数据分析。
1.5 Hadoop的三种关键技术
HDFS,MapReduce,YARN主要解决大数据分析中的存储,处理和监视问题
分布式文件系统(HDFS)来解决数据存储问题
HDFS将数据分成若干小块,存在集群中多台计算机上实现大量数据存储。通过在多个主机上复制数据来保证数据的可靠性。
并行计算框架MapReduce 来解决计算问题
MapReduce框架将计算问题进行划分,并将任务分配给不同计算机,使用本地存储的数据的执行处理程序,负责作业调度。
为了确保不同组件之间可以密切协同工作,Hadoop使用了YARN的监视机制,同时也负责资源管理
1.6 Hadoop1.0, Hadoop2.0和Hadoop3.x区别
2.0改进
针对1.0单NameNode制约HDFS的扩展性问题,提出HDFS Federation,它让多个NameNode分管不同的目录进而实现访问隔离和横向扩展
彻底解决了NameNode单点故障问题(如JobTracker和NameNode单点故障),引入StandByNameNode同时运行,保持元数据同步,高可用,热备份
针对1.0中的MapReduce在扩展性和多框架支持等方面的不足,它将JobTracker中的资源管理和作业控制分开,分别由ResourceManager(负责所有应用程序的资源分配)和ApplicationMaster(负责管理一个应用程序)实现,即引入了资源管理框架Yarn,可为各类应用程序进行资源管理和调度
3.0改进
- 性能优化:存储层和计算层的改进,提高了整体的处理效率。
- 容器支持: 通过支持容器化技术,提高了集群资源的利用率。
- GPU支持: 提高特定工作负载的计算性能。
- 集成了各种分布式框架,高可用性
HDFS中数据块的默认大小:128MB,数据块的默认备份数量:3
1.7 MapReduce编程主要原则
代码向数据靠拢
不像传统编程应用程序那样将数据移动到代码,在MapReduce中,我们通过将代码移动到数据,消除了数据传输的开销。
允许程序透明地伸缩
mapreduce允许程序伸缩,计算以不存在数据过载的方式执行。
抽象出容错、同步
MapReduce实现处理所有事情,允许开发人员只构建计算逻辑。
思想:分而治之:一个存储在分布式文件系统中的大规模数据集,会被切分成许多独立分片,被多个Map任务并行处理,通过Reduce程序将结果汇总,输出开发者需要的结果
第二章
2.1 常用linux命令的使用(HDFS)
cd cp mkdir tar chmod
1 | hadoop fs -cd /user/data |
2.2 Vi三种状态及转换方式
gedit vim vi
- 命令模式:输入的任何字符都作为命令处理。
- 插入模式:输入的任何字符都作为插入字符处理
- 末行模式:执行文件级或全局性操作,如保存文件、退出编辑器,设置编辑环境等
1 | a:从当前光标位置右边开始输入下一字符。 |
2.3 三种部署方式及其特点
本地部署模式
本地部署模式就是在单台服务器上进行开发和调试,无需运行任何守护进程,该模式不使用HDFS,使用本地计算机文件系统。
所有程序都在本机JVM上执行,处理本地Linux系统的数据。Hadoop不启动NameNode、DataNode、JobTracker和TaskTracker等服务进程,同一进程提供了所有的服务。该模式常用于开发和调试MapReduce程序阶段,验证程序逻辑的正确性。
本地部署模式仅需要配置Hadoop-env.sh这一个参数文件即可。
参数文件 配置对象 描述 Hadoop-env.sh Hadoop运行环境 用来定义Hadoop运行环境相关的配置信息,如JAVA_HOME 伪分布式部署模式
伪分布式部署模式是指在一台主机上来模拟多个主机的运行方式。启动四个进程:DataNode、NameNode、TaskTracker,和JobTracker。
该模式与单机模式的主要区别是增加了代码调试功能,允许进行内存检查,使用HDFS进行输入与输出,和与守护进程之间进行交互。与完全分布式模式非常接近,通常使用该模式进行Hadoop程序开发和测试。
参数文件 配置对象 描述 hadoop-env.sh Hadoop运行环境 用来定义Hadoop运行环境相关的配置信息 hdfs-site.xml HDFS Hadoop守护进程的配置项,包括NameNode和DataNode的存放位置、文件副本的个数、文件的读取权限、SecondaryNameNode等 core-site.xml 集群全局参数 Hadoop Core的配置项,用于定义系统级别的参数,如HDFS URL、MapReduce常用的I/O设置、Hadoop的临时目录等 mapred-site.xml MapReduce参数 MapReduce守护进程的配置项,包括JobTracker和TaskTracker等。 yarn-site.xml 集群资源管理系统参数 配置ResourceManager、NodeManager的通信端口、Web监控端口等 完全分布式模式
在该模式下,通常用几十至上百台主机部署组成一个集群环境,集群中的所有主机需要安装JDK和Hadoop,守护进程运行在多台主机构建的集群上,构建真正的分布式系统环境来充分利用全部主机的存储与计算能力
参数文件 配置对象 描述 hadoop-env.sh Hadoop运行环境 用来定义Hadoop运行环境相关的配置信息 hdfs-site.xml HDFS Hadoop守护进程的配置项,包括NameNode和DataNode的存放位置、文件副本的个数、文件的读取权限、SecondaryNameNode等 core-site.xml 集群全局参数 Hadoop Core的配置项,用于定义系统级别的参数,如HDFS URL、MapReduce常用的I/O设置、Hadoop的临时目录等 mapred-site.xml MapReduce参数 MapReduce守护进程的配置项,包括JobTracker和TaskTracker等。 yarn-site.xml 集群资源管理系统参数 配置ResourceManager、NodeManager的通信端口、Web监控端口等 masters 主节点参数 运行SecondaryNameNode的机器列表(每行一个) slaves 从节点参数 运行DataNode和TaskTracker的机器列表(每行一个)
==部署Hadoop集群时需要配置的两个重要文件及其中重要的属性==
core-site和hdfs-site在/etc/hadoop/core-site.xml
core-site.xml:
1 | <configuration> |
hdfs-site.xml:
1 | <configuration> |
dfs.block.size用来设置分布式系统单个文件块的大小,默认hadoop2.x是64M,默认hadoop3.x是128M。
dfs.heartbeat.interval用来设置DataNode节点的心跳检测时间的间隔(秒为单位)。默认3秒
dfs.namenode.handler.count用来设置NameNode节点启动后的线程数量。
如备份数量、名称节点数据的存储位置、数据节点数据的存储位置等
1 | java -version |
正常启动Hadoop服务需要启动的进程
NameNode、DataNode 和 SecondaryNameNode (rm zookeeper)
在hadoop1.x和Hadoop3.x中利用web界面查看时默认的端口号
Hadoop3.x:http://localhost:9870 查看NameNode和Datanode信息,还可以在线查看 HDFS 中的文件
Hadoop1.x:50070
1 | 在HDFS上进行操作三者存在一些区别: |
1 | ./bin/hdfs dfs -ls |
如何在Hadoop中增加/删除节点?
增加:有需要配置的环境,与其他节点一致,免密登录SSH(Ping通),Master Slave文件
删除:将该节点断开,心跳信号断开
第三章
3.1 HDFS简介
3.1.1 HDFS概念
分布式文件系统指的是通过计算机网络相互连接的多个分布式部署的网络节点上所提供的文件系统管理,通过目录树来定位文件,物理存储资源存储在集群上。负责整个分布式系统的数据存储管理、文件管理及错误处理等工作。
3.1.2 HDFS的优势和不足
HDFS优势 | HDFS不足 |
---|---|
采用冗余数据备份,单个节点故障不易丢失数据,容错能力强。 | 不适合低延时(实时)数据的访问。 |
支持TB/PB级大文件或百万以上数量数据集的处理。 | 无法高效存储大量小文件数据,吞吐效率低。 |
兼容通用及廉价计算机硬件进行部署,具有强大的跨平台兼容性。 | 不支持多用户并发写入和数据文件任意修改。 |
具有高可扩展性,可以水平扩展到任意数量的节点。 | |
可以采用数据流方式访问文件系统。文件模型具有简单一致性。 |
3.1.3 HDFS基本结构
HDFS的体系结构由数据组和管理组两部分组成。
按照功能划分
- 数据组主要包括文件存储的相关流程及组件
- 管理组主要由一系列数据管理操作组成,如数据读取、写入、截断、删除等。
按照组件划分
- 数据组包括数据块、复制、检查点和文件元数据的组件.
- 管理组中包括NameNode、DataNode、JournalNode和Zookeeper.
3.1.4 HDFS的主要特性
- 数据存储具有分布性。
- 数据访问具有透明性。
- 数据块的冗余存储具有容错性。
- 具有对流式数据的访问性。
- 集群具有良好的可伸缩性。
- 主节点具备高可用性。
3.2 HDFS 3.x架构及各组件作用
==3.2.1 名称节点(NameNode)==
名称节点主要功能:
- 管理文件系统命名空间,命名空间负责维护集群所有文件和目录列表。包含各种数据块相互关联的所有元数据信息,还负责维护所有数据块及其所在存储节点的列表。
- 控制对数据的所有操作。在HDFS上的所有操作,首先通过NameNode,然后再传到Hadoop的相关组件。
- 向客户端提供系统数据块信息,以及应该从哪个数据块进行读/写。
- 负责向DataNode发出一些特殊命令,如:删除损坏的数据块。
- 在内存中还维护一个inode的数据结构。inode包含关于文件和目录的所有信息。
- 是客户端所有文件读写请求的接口。
- 执行与文件系统有关的典型操作,如文件打开/关闭、目录重命名等。
- SecondaryNameNode保存NameNode的快照,在主名称节点失效时,用SecondaryNameNode替换主名称节点。在一段固定的时间后保存主名称节点的快照信息到目录中。这些快照称为检查点,可用于在主名称节点发生故障时的重启。
名称节点的基本数据结构及各自的作用
包括命名空间和文件块block管理
1.命名空间
维护整个文件系统树及文件/目录的元信息和文件数据块索引
这些信息以三种文件形式存储在本地文件系统中:文件系统名称空间,FSImage(命名空间镜像),EditLog(空间镜像编辑日志)
FSImage文件
FSImage是文件系统在某个时间点的状态信息(整个文件系统的快照),包含DataNode文件块映射关系和命名空间信息,存储在NameNode本地文件系统中
EditLog
记录文件系统对所有文件的创建删除等操作,包含最后一个FSImage文件创建后对每个HDFS文件所作的操作记录,用于定期和当前的FSImage合并成最新的FSImage镜像,保证NameNode元数据信息的完整,存储在NameNode本地和共享存储系统QJM中。
EditLog文件有两种状态:inprocess(正在写的日志文件)和finalized(写完的日志文件)
FSImage文件有两种状态: finalized(已经持久化磁盘)和checkpoint(合并中的FSImage)
2.文件块Block管理
NameNode记录着每个Block所在的DataNode的位置信息,元数据信息包括:
- 文件名到数据块的映射
- block到DataNode列表的映射:通过DataNode上报给NameNode建立。
- NameNode执行文件系统操作,例如打开、关闭、重命名文件,同时确定文件数据块到具体DataNode的映射。
==3.2.2 第二名称节点(Secondary NameNode)==
作用
- 定期获得FSImage和EditLog进行合并,生成新的FSImage,清空原EditLog,把新的FSImage发给NameNode更新。
- 使EditLog大小保持在限制范围内
- 减轻NameNode的负担(不用同时合并和提供服务)
- 减少了重新启动NameNode消耗的启动时间
- 冷备份:一旦HDFS的NameNode失效,用SNN进行数据恢复,不会造成NameNode重启时,长时间不可访问的情况
Secondary NameNode的工作原理
- SecondaryNameNode请求和NameNode通信,创建新的EditLog,并将新生成的操作记录写入。
- SecondaryNameNode通过HTTP GET方式从NameNode上读取FSImage和EditLog。
- SecondaryNameNode将下载的FSImage载入内存,执行EditLog文件中的各项更新操作,将EditLog和FSImage合并,生成新的FSImage(检查点)。
- SecondaryNameNode会通过HTTP POST方式,将新的FSImage传到NameNode替换旧的FSImage,用新的EditLog替换旧的EditLog。
==3.2.3 数据节点(DataNode)==
作用(工作):
- DataNode从NameNode或HDFS客户端接收指令,执行相应的数据块操作(增删改等)。客户端向NameNode发送一个请求,NameNode返回一组读写DataNode的操作来响应。然后,DataNode打开一个socket连接,让客户端从它的存储中对数据块进行读写。
- DataNode按所配置的时间间隔,周期性地将自己所存储的块的列表信息发送给NameNode,更新NameNode上的映射表。
- DataNode需要定期向NameNode发送一个心跳信号保持联系(3秒),让NameNode了解DataNode是否正常工作。
- 每个数据块对应一个元数据信息文件。一个DataNode接收来自另一个DataNode的数据块写请求,DataNode定期向NameNode发送块报告,以使NameNode中每个块的位置及其它信息都保持最新。
3.3.3 日志节点(Journal Node)
概念和作用
JournalNode是HA集群中ANN和SNN之间元数据共享的传输介质,主要用于两个NameNode之间保持EditLog的共享同步。
维护NameNode的高可用性,就需要管理ANN和SNN之间的编辑日志EditLog和HDFS元数据,在发生故障时可以迅速切换,保证最新的命名空间。负责存储NameNode的EditLog。
3.3.4 ZKFC
什么是ZKFC,全称,其主要作用
Zookeeper故障转移控制器(Zookeeper Failover Controller进程)
分布式协调服务,HA中的一部分,实现自动化的故障转移,是在NameNode服务器上安装的一个客户端。
健康监测
每台运行NameNode的机器有一个ZKFC,一对一关系。
ZKFC通过定期的运行ping信号来监测NameNode运行状况。
ZooKeeper会话管理
当本地NameNode是健康的,ZKFC将在ZooKeeper中打开一个会话;
如果本地NameNode是活动的,将在Zookeeper服务器上创建一个特殊的锁znode(临时的,会话期满后自动删除)
基于ZooKeeper的选举
如果本地NameNode健康,而ZKFC认为目前没有其他节点持有锁,它本身就会尝试获取锁。如果成功,那么它已经“赢得选举”,并负责运行故障转移以使其本地NameNode活动。
3.3.5 日志管理器
QJM英文全称:Quorum Journal Manager
概念
QJM是由多个JournalNodes组成的JN集群,每个JN保存同样的EditLog副本,一般运行奇数个JournalNodes,至少3个。当运行N个Journal Nodes时,系统能够最多承受(N-1)/2个容错次数,并持续保持正常运作。
QJM负责协调和管理HDFS中的NameNode的编辑日志。它使用多数投票的机制来确保在故障时不会丢失关键的元数据信息。
工作原理:基于 QJM 共享存储的数据同步机制
- 当ActiveNameNode执行任何有关命名空间的修改,它要告知JN集群中一半以上的JNs进程;
- 而Standby NameNode密切关注集群中Journal Nodes的变化,从Journal Nodes中读取从ANN发送过来的信息,监控EditLog变化,并更新其内部命名空间。
- 一旦ANN遇到错误,SNN需要已经从Journal Nodes中读出全部EditLog日志,保证在故障切换发生前其NameNodes的状态已经完全同步,然后,SNN再切换成Active状态。
3.3 HDFS高可用性
Hadoop3.x如何实现集群的高可用性?
Hadoop1.x中的单点故障问题存在的原因,在Hadoop3.x中是如何解决的?
SNN
只有一个NameNode,失效单点故障,2.0引入了StandByNameNode,Active NameNode作为主节点,始终处于活动状态,负责集群中的客户机请求;StandBy NameNode作为从节点,始终处于备用状态,始终保持其状态与Active NameNode同步,以便在发生故障时提供快速的故障转移。
3.0引入多个备用NameNode,使用日志管理器QJM作为共享存储组件,搭建奇数个日志节点JournalNodes,实现主备NameNode的元数据操作信息同步,获取最新的EditLog,并更新FSImage镜像
ZKFC作为独立的进程运行,对NameNode的主备切换进行总体控制,它不仅能够及时监测到NameNode的健康状况,而且能够在Active NameNode发生故障时,借助Zookeeper实现自动主备选举和切换。
共享存储系统
保存NameNode产生的所有HDFS元数据,ANN和SNN通过共享存储系统实现元数据的同步。
ANN向共享存储系统写EditLog,StandBy NameNode读取EditLog并执行,进而实现状态的同步。
ANN和 SNN共享HDFS的数据块和DataNode之间的映射关系,DataNode会同时向ANN和SNN上报数据块位置信息。
3.4 主备NameNode切换的流程
ZKFC,HealthMonito和ActiveStandbyElector(主备选举器)协同实现
- 主备状态监控:HealthMonitor初始化完成后启动内部线程定时调用对应NameNode的RPC接口,对NameNode的健康状态检测。
- 状态变化回调:HealthMonitor如果检测到NameNode的健康状态发生变化,会回调ZKFC注册的相应方法进行处理。
- 需要主备选举:如果ZKFC判断需要进行主备切换,会使用ASE来进行自动主备选举。
- 通过ZK完成主备选举:ASE与Zookeeper交互完成自动的主备选举。
- 返回ZK选举结果:Zookeeper集群将主备选举的结果返回给ASE。
- 通知主备选举结果状态:ASE在主备选举完成后,回调ZKFC的相应方法来通知当前的NameNode成为主NameNode或备用NameNode。
- 切换主备状态:ZKFC调用对应NameNode的HA RPC接口的方法将NameNode转换为Active状态或Standby状态。
3.5 HDFS读数据的过程
- HDFS客户端创建DistributedFileSystem类的一个实例,执行open()方法请求打开一个文件。
- DistributedFileSystem实例通过RPC向NameNode请求得到Block的位置信息,结果返回多个DataNode的位置信息。
- 客户端通过FSDataInputStream对象请求读取read()数据,该对象会被封装成DFSInputStream对象,管理DataNode和NameNode的I/O数据流。客户端调用read()方法系统会根据所请求的数据副本所在的位置选择离客户端最近的DataNode。
- DistributedFileSystem类返回一个DFSInputStream对象,管理集群中的DateNode,当收到read()请求后找出首个文件数据块所在的DataNode节点并读取。
- 首个数据块读取完成后,DFSInputStream关闭与该DataNode的连接,并重复调用read()函数,接着读取下一个数据块,直至读完。
- 每读取完一个文件块都要进行Checksum验证,一旦从DataNode上读取数据出现了错误,客户端首先告知NameNode,并查找该数据块在集群数据节点上的其它位置信息以继续读取。
- 当前数据块被正确读取完毕后,关闭当前的DataNode节点链接并寻找下一个待读取的DataNode节点。如果文件读取还没有完成,DFSInputStream会继续从Namenode上读取下一批文件块的位置信息继续读取数据。
- 客户端读取完后,将调用FSDataInputStream的close()方法关闭所有的数据流读取。
3.6 HDFS写数据的过程
- 客户端调用DistributedFileSystem类中的create()方法创建文件,创建一个文件输出流对象(FSDataOutputStream)。
- FSDataOutputStream对象向远程的NameNode发出RPC调用请求,NameNode检查该待写入文件是否存在及客户端的写入权限,检查通过之后,在NameNode上创建一个写入文件的元数据。
- 客户端通过调用FSDataOutputStream对象的write()方法请求写数据,先载入数据到缓冲区中,然后切分成大小相等的数据块。
- 每个数据块按照NameNode上的节点分配传输数据块到对应的DataNode上。
- 数据节点依次反向返回确认信息给第一个数据节点,并将所有的确认信息返回。
- 文件写入完成后,客户端将调用close()方法关闭FSDataOutputStream。
- 最后,客户端调用complete()方法通知NameNode文件写入成功。
3.7 HDFS联邦机制及其作用
HDFS 联邦提供了一种解决单组NameNode局限性问题的水平扩展方案
HDFS联邦使用使用多组名称节点和名称空间,所有的名称节点相互独立,构成联邦,各自分工独立管理自己的区域,无需互相协调。
Federation的方案,由多组NameNode在一个集群中共同提供服务,每个NameNode拥有一部分NameSpace,工作互相独立,互不影响,主要优点包括:
- 提高了命名空间的伸缩性。
- 提升了名称节点文件系统的吞吐量。
- 实现了多用户的隔离性。
第四章
4.1 MapReduce1.0缺陷
MapReduce1.0体系结构中存在哪些缺陷
Hadoop1.0由HDFS和MapReduce组成,MapReduce由一个JobTracker和多个TaskTracker组成
JobTracker是MapReduce框架的中心,主要负责作业的调度/监控和集群资源的管理;TaskTracker负责执行JobTracker指派的具体任务
扩展性差
1.0中,JobTracker同时兼备了集群资源的管理和作业的调度与控制两大功能,使得JobTracker赋予的功能过多、负载过重。造成很大的内存消耗,同时也增加了JobTracker失效的风险,严重制约Hadoop集群的扩展性。
可靠性差
MRv1采用Master/Slave结构,而系统中只有一个JobTrackerr负责所有MapReduce作业的调度,因此,会存在单点故障问题,导致整个集群不可用。
资源利用率低
MRv1采用了基于槽位的资源分配模型,需要为map任务和reduce任务预先配置task tracker槽位(粗粒度的资源划分单位),通常一个任务不会用完槽位对应的所有资源,但是其他任务也无法使用这些空闲资源。
此外,MapReduce将槽位分为MapSlot和ReduceSlot两种,且不允许它们之间共享,常常会导致一种槽位资源紧张而另一种槽位闲置的情况出现无法支持多种计算框架
有多种计算框架例如Map Reduce、Spark、Storm等,解决不同问题。如果为每种计算框架都配备一套Hadoop集群,会浪费大量资源而且不经济,Hadoop1.0未能够将资源管理与应用程序分开,使得Hadoop1.0不能支持多种计算框架并存。
非MapReduce作业
出现很多新需求如图形处理,实时分析,非MapReduce作业无法在MRV1中处理
4.2 Yarn具有的优势
- 共享集群资源
Hadoop2.0将所有的计算框架都部署在同一个集群上,通过共享集群资源的模式,由Yarn对资源进行统一管理,可以使得空闲资源得以更有效地应用,达到集群总体资源充分利用。
- 节省成本
1.0中每种计算框架都配备一个集群,每个集群都需要管理人员;而2.0使用“多个框架一个集群”模式,集群数量减少,人力资源成本也相应减少。也节省很多的硬件设备采购成本。
- 共享数据
1.0中,数据通过网络传输等方式在集群之间进行共享
但随着应用数据量的增加,开销变大,yarn的引入,基于多种计算框架的应用程序可以在集群内部共享数据,不仅节约成本,还能增强应用程序性能。
4.3 Yarn体系结构及各组件作用
全局资源管理器(Resource Manager,RM)
- 调度器(Scheduler)
- 应用程序管理器(Applications Manager,ASM)
节点管理器(Node manager)
应用程序主机(Application Master)
容器(Container)
YARN通信协议-RPC协议
Resource Manager:是一个主守护进程,负责整个集群系统的资源管理和分配。客户端在执行计算任务时会将计算作业请求提交到ResourceManager,然后由ResourceManager来调度这些计算任务在集群当中运行。
- **调度器(Scheduler)**:根据容量、队列等限制条件将系统中的资源分配给各个正在运行的应用程序
- Applications Manager,ASM:负责管理整个系统中所有应用程序包括:Application Master、监控Application Master运行状态并在失败时重新启动它等。
Node manager:
① 负责根据Resource Manager的指令进行启动和执行容器
② 负责节点资源的监控和管理,以心跳的方式定期向Resource Manager汇报本节点的资源使用情况和在本节点上的计算任务在各个Container中的运行状态
Application Master:
① 与Resource Manager 的调度器协商以获取容器;
② 与Node Manager通信以启动/停止任务;
③ 监控所有任务运行状态,并在任务运行失败时,重新为任务申请资源并重启任务
container:真正执行任务的是container,包括各种资源如内存、CPU、磁盘、网络
RPC协议:连接任何两个需相互通信的组件
4.4 其它
在HDFS、YARN和MapReduce中均采用master/slave结构,其中的master节点和slave节点分别是什么?
HDFS:NameNode和DataNode
YARN:ResourceManager和NodeManager
MapReduce:JobTracker和TaskTracker
Yarn中的调度器的分类
FIFO调度器 计算能力调度器 公平调度器
第五章
5.1 体系结构及各组件作用
物理实体结构
- Client(客户端):负责提交作业给JobTracker和查看作业当前运行的状态和结果
- **JobTracker(作业跟踪器)**:负责资源监控、作业调度以及与TaskTracker的通信等工作。
- JobTracker监控所有的TaskTracker及作业健康状况,一旦发现失败的作业,将开启容错机制,转移任务到其他节点执行;
- JobTracker还监控任务执行、资源利用等情况,传输给任务调度器,而任务调度器会根据资源使用情况来分配任务,
- **TaskTracker(任务跟踪器)**:
- TaskTracker在接受JobTracker分配的作业后,开始执行每个任务。它会周期性地通过“心跳”信号将本节点上的资源使用情况及任务运行情况汇报给JobTracker,也会执行JobTracker发送过来的命令,如启动新任务、杀死任务等。
- TaskTracker通过参数配置slot数目可限定Task的并发量。一个slot称为“资源作业槽”,表示本节点上的计算资源(slot是CPU、内存等划分的基本单位。一个Task只有获得了一个slot后才能运行。
- TaskTracker负责将空闲slot分配给MapReduce的Task使用
- **Task(任务)**:可以分为Map Task和Reduce Task,分别负责执行Map任务和Reduce任务。
逻辑实体结构
输入分片(input split)、map阶段、combiner阶段、shuffle阶段、reduce阶段和output阶段。
- input split:map计算之前,程序会根据输入文件计算split,每个input split针对一个map任务。input split存储的并非是数据本身,而是一个分片长度和一个记录数据的位置的数组。
- map阶段:执行map函数。
- combiner阶段:这是一个可选择的函数,实质上是一种reduce操作。在map计算出中间文件前做一个合并重复key值的操作。
- shuffle阶段:
- 从map输出开始,包括系统执行排序即传送map输出到reduce作为输入的过程。
- 针对map输出的key进行排序又叫sort阶段。map端shuffle,就是利用combiner对数据进行预排序,利用内存缓冲区来完成。
- reduce端的shuffle包括复制数据和归并数据,最终产生一个reduce输入文件。
- shuffle过程有许多可调优的参数来提高MapReduce的性能,其总原则就是给shuffle过程尽量多的内存空间。
- reduce阶段:执行reduce函数并存到hdfs文件系统。
- output阶段:输出最后结果。
5.2 数据本地化
MapReduce的数据本地化如何解释?本地计算有什么好处?
即是计算向数据靠拢,数据本地化是指把计算移动到数据所在节点上进行执行的过程,也就是通常所说的“移动计算而不是移动数据”。移动计算比移动数据具有更大的优势,它可以降低网络开销,增加系统的整体吞吐量。通过最大限度地利用节点上的本地数据,可以减少作业执行时间,提高整体性能。
MapReduce中Map任务和Reduce任务的数量如何确定
Map任务的数量
Hadoop为每个split创建一个Map任务,split 的多少决定了Map任务的数目
Reduce任务的数量
最优的Reduce任务个数取决于集群中可用的reduce slot的数目
通常设置比reduce任务槽数目稍微小一些的Reduce任务个数(这样可以预留一些系统资源处理可能发生的错误)
5.3 作业执行过程
MapReduce作业执行的过程(结合着Yarn的资源管理和HDFS的存储管理,如何描述?)
客户端向一个Hadoop集群发出启动作业的请求。
上传并复制运行作业所需要的资源文件到HDFS中,包括MapReduce程序打包的JAR文件、配置文件和客户端计算得到的输入split。
JobTracker收到作业执行请求后,由作业调度器根据所用的调度算法对作业进行调度执行。
TaskTracker根据主机计算资源数量来分配map slot和reduce slot。
map任务的分配采用“数据本地化”的方式,即将map任务分配给包含该map任务要处理的数据块的TaskTracker上,同时将程序的JAR包复制到该TaskTracker上进行执行,实现计算任务向数据靠拢。
分配reduce任务时并不考虑数据本地化。
TaskTracker定期通过心跳服务向JobTracker发送信息,包括Map和Reduce任务完成情况的信息。
当JobTracker收到作业的最后一个任务完成消息时,设置作业为完成状态。JobTracker确定所有任务完成,并告知客户端作业已完成。
5.4 Shuffle过程
Map端的Shuffle过程
每个Map任务分配一个缓存(默认100MB) 设置溢写比例0.8 分区默认采用哈希函数
排序是默认的操作 排序后可以合并(Combine)
合并不能改变最终结果 在Map任务全部结束之前进行归并
归并得到一个大的文件,放在本地磁盘
文件归并时,如果溢写文件数量大于预定值(默认是3)则可以再次启动Combiner
JobTracker会一直监测Map任务的执行,并通知Reduce任务来领取数据
Reduce端的Shuffle过程
Reduce任务通过RPC向JobTracker询问Map任务是否已经完成,若完成,则领取数据
Reduce领取数据先放入缓存,来自不同Map机器,先归并,再合并,写入磁盘
多个溢写文件归并成一个或多个大文件,文件中的键值对是排序的
当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给Reduce
5.5 编程设计
使用MapReduce思想编程设计,如单词计数、topN、连接操作等
5.5.1.WordCount
① 将文件拆分成splits,将文件按行分割形成<key,value>对,发给MapReduce。key值包括了回车所占的字符数,value为字符
② Hadoop为每个分片创建一个map任务,将分割好的<key,value>对交给用户定义的map方法进行处理,生成新的<key,value>对
③ 得到map方法输出的<key,value>对后,Mapper会将它们按照key值进行排序,若用户定义了Combiner时,执行Combine过程,将key相同value值累加,map和reduce之间的数据流被称为shuffle
④ Reducer先对从Mapper接收的数据进行排序,再交reduce方法处理,得到新的<key,value>对输出。
5.5.2 topN
- Map阶段前的准备: 将数据划分成多个分片。每个分片上都会运行一个Map任务。
- Map阶段: 每个Mapper需要为输入数据中的每个元素标记一个键值对,其中键是一个虚拟键,而值是实际的数据元素。这个虚拟键的目的是确保所有数据都会被发送到同一个Reducer。Map任务可以进行排序后每个map任务进行局部topN,得到N个键值对。
- 排序和Shuffle阶段: 在Map阶段结束后,所有的键值对都会被按照键进行排序,然后根据键的哈希值被分配到不同的Reducer。由于在Map阶段使用的虚拟键,相同数据元素的键值对将会被发送到同一个Reducer。
- Reducer阶段: 在Reducer阶段,数据进行排序以找到Top N。Reducer会维护一个大小为N的优先队列,然后依次处理输入数据,将元素插入队列,并在必要时弹出队列中的最小元素。最终,队列中的元素即为Top N。
5.5.3 连接操作
假设有关系R(A,B)和S(B,C),对二者进行自然连接操作
使用Map过程,把来自R的每个元组<a,b>转换成一个键值对<b, <R,a>>,其中的键就是属性B的值。把关系R包含到值中,这样做使得我们可以在Reduce阶段,只把那些来自R的元组和来自S的元组进行匹配。类似地,使用Map过程,把来自S的每个元组<b,c>,转换成一个键值对<b,<S,c>>
所有具有相同B值的元组被发送到同一个Reduce进程中,Reduce进程的任务是,把来自关系R和S的、具有相同属性B值的元组进行合并
Reduce进程的输出则是连接后的元组<a,b,c>,输出被写到一个单独的输出文件中