1 运行环境
要确保task运行在有数据的node上。
早期的运行框架:MR框架
2 经典MR框架的局限
不适合使用MR的情景:
- 交互数据探索
- 迭代数据处理(需要很多次将数据导入磁盘)
3 下一代:代替经典MR的框架
YARN,Tez,Spark
- Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
- Tez是Apache开源的支持DAG作业的计算框架,它直接源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步拆分,即Map被拆分成Input、Processor、Sort、Merge和Output, Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等,这样,这些分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的DAG作业。总结起来,Tez有以下特点:
(1)Apache二级开源项目(源代码今天发布的)
(2)运行在YARN之上
(3) 适用于DAG(有向图)应用(同Impala、Dremel和Drill一样,可用于替换Hive/Pig等)
- 有向无环图task
- 可以将数据缓存在内存中,获得更好的performance
layout
优化策略
YARN:
- 支持MR
- 大量基于YARN的开源or商业的应用
- 用户自己develop app
- 支持Tez,Spark
Tez:
- 支持数据流图
- 专属的数据类型
- 可以运行复杂的DAG
- 动态DAG
- 资源的高效利用:浅谈Apache Tez中的优化技术_冬日阳光_新浪博客 (sina.com.cn)
1. 当前YARN框架存在的问题
(1)作业启用一个独立的ApplicationMaster
MRv1中所有作业公用一个作业追踪器JobTracker,当JobTracker出现故障是 ,整个系统将不可用,且所有作业将运行失败。与MRv1不同,YARN中每个作业启用一个独立的作业追踪器ApplicationMaster,解决了MRv1中单点故障和扩展瓶颈问题。但这种方式 将引入一个新的问题:作业延迟较大,即每个作业首先要申请资源启动一个ApplicationMaster后,才可以正式启动作业,也就是说,较MRv1中的作业运行过程,YARN作业将耗费更多的计算资源和产生更长的运行延迟,这不利于运行小作业和DAG作业,尤其是DAG作业(如Hive SQL和Pig产生的DAG作业),将需要更多的计算资源。
(2)资源无法重用
在MRv1中,用户可为自己的作业设置是否启用JVM重用功能,如果启用该功能,则同一个JVM可运行多个任务,从而降低作业延迟提高作业效率。在YARN MRAppMaster(MRAppMaster是MapReduce计算框架的ApplicationMaster)中,MRAppMaster总是为未运行的任务申请新的资源(Container),也就是时候,任务运行完成后便会释放对应的资源,并为接下来运行的任务重新申请资源(Container),而不会向MRv1那样重用资源(Container)。
2. Apache Tez中的优化技术
为了克服当前YARN存在的问题,Apache Tez(什么是Apache Tez,可参考这篇文章:“Apache Tez:一个运行在YARN上支持DAG作业的计算框架”)提出了一系列优化技术,其中值得一说的是ApplicationMaster缓冲池、预先启动Container和Container重用这三项技术。
(1)ApplicationMaster缓冲池
在Apache Tez中 ,用户并不是直接将作业提交到ResouceManager上,而是提交到一个 叫AMPoolServer的服务上。该服务启动后,会预启动若干个ApplicationMaster,形成一个ApplicationMaster缓冲池,这样,当用户提交作业时,可通过AMPoolServer直接将作业提交到这些ApplicationMaster上。这样做的好处是,避免了每个作业启动一个独立的ApplicationMaster。
在Apache Tez中,管理员可采用参数tez.ampool.am-pool-size和tez.ampool.max.am-pool-size配置ApplicationMaster缓冲区中最小ApplicationMaster个数和最大ApplicationMaster个数。
(2)预先启动Container
ApplicationMaster缓冲池中的每个ApplicationMaster启动时可以预先启动若干个Container,以提高作业运行效率。管理员可通过参数yarn.app.mapreduce.am.lazy.prealloc-container-count设置每个ApplicationMaster预启动container的数目。
(3) Container重用
每个任务运行完成后,ApplicationMaster不会立即释放其占用的container,而是将其分配给其他未运行的任务,从而达到资源(Container)重用的目的。管理员可通过参数yarn.app.mapreduce.am.scheduler.reuse.enable指定是否启用Container重用功能,通过参数yarn.app.mapreduce.am.scheduler.reuse.max-attempts-per-container设置每个container重用次数。
Spark:
- 更好的DAG处理引擎
- 循环数据流:支持流处理、机器学习中的图算法等
- 内存中计算:数据可以重用
- 可以使用JAVA\Scala\PY\R进行access
- 大量的已有的优化库:支持图机器学习、流式application,可以单独使用也可以组合使用
栗子
1. Tez运行Hive
当我们运行Hive时,
当使用MR框架时,会产生许多MR jobs
当使用Tez时
不需要中间步骤的map steps,不需要写进disk,可以重用,会有更好的performance
2. Spark运行
迭代的机器学习算法
.cache()
: 在RAM中缓存数据,可以加速计算
4 资源调度
三种调度器:
Yarn的fair和capacity调度器_qingzhenli的博客-CSDN博客
Yarn简介及Capacity & Fair Scheduler_hongtaq156136的专栏-CSDN博客
- 默认:FIFO,可能会有waiting
- Fairshare:平衡不同应用程序之间的资源分配,让所有运行的应用都能分到平等的资源(同一个队列内)。Hadoop YARN公平调度(FairScheduler)介绍
FairScheduler是一个资源分配方式,在整个时间线上,所有的applications平均的获取资源。
- 平衡资源分配(负载均衡)
- 多层次队列(子队列)
- 保证最小份额
- 基于用户\应用的限制
- 权重、优先级分配
-
Capacity:基于资源的调度
- 队列和子队列:支持分层次的队列结构,确保允许其他队列使用可用资源之前,在组织的子队列之间共享资源,提供更多的控制和可预测性。
- 有弹性的容量保证:队列分配到一部分的容量,某种程度上可以自行处理自己的容量,提交到队列的所有应用程序将可以访问分配给队列的容量。 管理员可以给每个队列的容量配置软限制和可选硬限制来保证队列资源容量。
- ACL:访问控制技术,可以提供一整套的限制来防止单一的应用、用户和队列贪婪地占用整个集群的资源
- 基于资源的调度:支持资源密集型的应用程序,应用程序可以指定比默认值更高的资源需求,并支持不同种类的资源的需求。目前,内存是支持的资源需求。
- 可操作性
- 运行时配置队列的定义和属性,例如:capacity,ACLs可以在运行时被修改,通过管理员采用一种安全的方式可以将对用户的影响降到最低。另外,为用户和管理员提供了控制台,进行查看系统中当前资源分配给哪些队列。管理员能够在运行时新增队列,但是不能在运行时删除。
- 排干应用程序:管理员能够在运行时停止队列,以此确保新的应用程序不会被提交到该队列,已有的应用程序能够运行完成。如果一个队列处在STOPPED状态,新的应用程序不能被提交到队列自身以及它的子队列。已经存在的应用程序可以继续完成,这样队列可以优雅的退出。管理员能够启动和停止队列。