Hadoop1.0的核心组件(仅指MapReduce和HDFS,不包括Hadoop生态系统内的Pig、 Hive、 HBase等其他组件),主要存在以下不足:
•抽象层次低,需人工编码
•表达能力有限
•开发者自己管理作业( Job) 之间的依赖关系
•难以看到程序整体逻辑
•执行迭代操作效率低
•资源浪费( Map和Reduce分两阶段执行)
•实时性差(适合批处理,不支持实时交互式)
Hadoop的优化与发展主要体现在两个方面:
•一方面是Hadoop自身两大核心组件MapReduce和HDFS的架构设计改进
•另一方面是Hadoop生态系统其它组件的不断丰富,加入了Pig、 Tez、 Spark和Kafka等新组件
HDFS1.0组件及其功能回顾(具体请参见第3章HDFS)名称节点保存元数据:
( 1)在磁盘上: FsImage和EditLog
( 2)在内存中:映射信息,即文件包含哪些块,每个块存储在哪个数据节点
1、HDFS 1.0中存在的问题
•单点故障问题
•不可以水平扩展(是否可以通过纵向扩展来解决?)
•系统整体性能受限于单个名称节点的吞吐量
•单个名称节点难以提供不同程序之间的隔离性
•HDFS HA是热备份,提供高可用性,但是无法解决可扩展性、系统性能和隔离性
2、HDFS Federation的设计
•在HDFS Federation中,设计了多个相互独立的名称节点,使得HDFS的命名服务能够水平扩展,这些名称节点分别进行各自命名空间和块的管理,相互之间是联盟( Federation) 关系,不需要彼此协调。并且向后兼容
•HDFS Federation中,所有名称节点会共享底层的数据节点存储资源,数据节点向所有名称节点汇报
•属于同一个命名空间的块构成一个“块池”
4、HDFS Federation的优势
HDFS Federation设计可解决单名称节点存在的以下几个问题:
( 1) HDFS集群扩展性。多个名称节点各自分管一部分目录,使得一个集群可以扩展到更多节点,不再像HDFS1.0中那样由于内存的限制制约文件存储数目
( 2)性能更高效。多个名称节点管理不同的数据,且同时对外提供服务,将为用户提供更高的读写吞吐率
( 3)良好的隔离性。用户可根据需要将不同业务数据交由不同名称节点管理,这样不同业务之间影响很小需要注意的, HDFS Federation并不能解决单点故障问题,也就是说,每个名称节点都存在在单点故障问题,需要为每个名称节点部署一个后备名称节点,以应对名称节点挂掉对业务产生的影响
( 1)存在单点故障
( 2) JobTracker“大包大揽”导致任务过重(任务多时内存开销大,上限4000节点)
( 3)容易出现内存溢出(分配资源只考虑MapReduce任务数,不考虑CPU、内存)
( 4)资源划分不合理(强制划分为slot ,包括Map slot和Reduce slot)
•ResourceManager( RM)是一个全局的资源管理器,负责整个系统的资源管理和分配,主要包括两个组件,即调度器( Scheduler)和应用程序管理器( Applications Manager)
•调度器接收来自ApplicationMaster的应用程序资源请求,把集群中的资源以“容器”的形式分配给提出申请的应用程序,容器的选择通常会考虑应用程序所要处理的数据的位置,进行就近选择,从而实现“计算向数据靠拢”
•容器( Container)作为动态资源分配单位,每个容器中都封装了一定数量的CPU、内存、磁盘等资源,从而限定每个应用程序可以使用的资源量
•调度器被设计成是一个可插拔的组件, YARN不仅自身提供了许多种直接可用的调度器,也允许用户根据自己的需求重新设计调度器
•应用程序管理器( Applications Manager)负责系统中所有应用程序的管理工作,主要包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动等
ResourceManager接收用户提交的作业,按照作业的上下文信息以及从NodeManager收集来的容器状态信息,启动调度过程,为用户作业启动一个ApplicationMaster
ApplicationMaster的主要功能是:
( 1)当用户作业提交时, ApplicationMaster与ResourceManager协商获取资源,ResourceManager会以容器的形式为ApplicationMaster分配资源;
( 2)把获得的资源进一步分配给内部的各个任务( Map任务或Reduce任务),实现资源的“二次分配”;
( 3)与NodeManager保持交互通信进行应用程序的启动、运行、监控和停止,监控申请到的资源的使用情况,对所有任务的执行进度和状态进行监控,并在任务发生失败时执行失败恢复(即重新申请资源重启任务);
( 4)定时向ResourceManager发送“心跳”消息,报告资源的使用情况和应用的进度信息;
( 5)当作业完成时, ApplicationMaster向ResourceManager注销容器,执行周期完成。
NodeManager是驻留在一个YARN集群中的每个节点上的代理,主要负责:
•容器生命周期管理
•监控每个容器的资源( CPU、内存等)使用情况
•跟踪节点健康状况
•以“心跳”的方式与ResourceManager保持通信
•向ResourceManager汇报作业的资源使用情况和每个容器的运行状态
•接收来自ApplicationMaster的启动/停止容器的各种请求需要说明的是, NodeManager主要负责管理抽象的容器,只处理与容器相关的事情,而不具体负责每个任务( Map任务或Reduce任务)自身状态的管理,因为这些管理工作是由ApplicationMaster完成的, ApplicationMaster会通过不断与NodeManager通信来掌握各个任务的执行状态
•Pig是Hadoop生态系统的一个组件
•提供了类似SQL的Pig Latin语言(包含Filter、 GroupBy、 Join、OrderBy等操作,同时也支持用户自定义函数)
•允许用户通过编写简单的脚本来实现复杂的数据分析,而不需要编写复杂的MapReduce应用程序
•Pig会自动把用户编写的脚本转换成MapReduce作业在Hadoop集群上运行,而且具备对生成的MapReduce程序进行自动优化的功能
•用户在编写Pig程序的时候,不需要关心程序的运行效率,这就大大减少了用户编程时间
•通过配合使用Pig和Hadoop,在处理海量数据时就可以实现事半功倍的效果,比使用Java、 C++等语言编写MapReduce程序的难度要小很多,并且用更少的代码量实现了相同的数据处理分析功能
Pig可以加载数据、表达转换数据以及存储最终结果
Pig语句通常按照如下的格式来编写:
•通过LOAD语句从文件系统读取数据
•通过一系列“转换”语句对数据进行处理
•通过一条STORE语句把处理结果输出到文件系统中,或者使用DUMP语句把处理结果输出到屏幕上
•下面是一个采用Pig Latin语言编写的应用程序实例,实现对用户访问网页
情况的统计分析:
visits = load ‘/data/visits’ as (user, url, time);
gVisits = group visits by url;
visitCounts = foreach gVisits generate url, count(visits);
//得到的表的结构visitCounts(url,visits)
urlInfo = load ‘/data/urlInfo’ as (url, category, pRank);
visitCounts = join visitCounts by url, urlInfo by url;
//得到的连接结果表的结构visitCounts(url,visits,category,pRank)
gCategories = group visitCounts by category;
topUrls = foreach gCategories generate top(visitCounts,10);
store topUrls into ‘/data/topUrls’;