加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

大数据计算框架Spark之任务调度

发布时间:2019-04-09 12:24:02 所属栏目:教程 来源:甜橙很酸
导读:副标题#e# Spark有几种资源调度设施。每个Spark Application(SparkContext实例)独立地运行在一组executor进程内。cluster manager为应用间的调度提供设施。在每个Spark应用内,如果将多个job(多个spark action)提交给不同的线程,那么他们会并行运行。 1 Ap

executor除了写shuffle 文件到本地硬盘,还缓存数据到硬盘或内存中。但是,当executor被移除后,缓存到内存中的数据将不可用。为了解决这一问题,默认地缓存数据到内存的executor永远不会被删除。可以通过spark.dynamicAllocation.cachedExecutorIdleTimeout配置这一行为,

2 Application内的资源调度

概述

给定的application内部(SparkContext 实例),如果多个并行的job被提交到不同的线程上,那么这些job可以同时执行。这里的job指的是Spark action及Spark action触发的计算task。Spark scheduler是线程安全的,支持spark application服务于多个请求。

默认地Spark scheduler以FIFO的顺序执行job,每个job被切分为一到多个stage(例如,map和reduce),当第一个job的stage的task启动后,这个job优先获得所有可用资源,然后才是第二,三个job......。如果队头的job不必使用整个集群,之后的job就能立即启动。如果队头的job较大,那么之后的job启动延迟会比较明显。

从Spark 0.8开始,也可以通过配置实现队列间的公平调度。Job间的task资源分配采用单循环的方式。所有job都会获得大致相同的集群资源。这就意味着,当有长job存在时,提交的短job可以立即获得资源启动运行而不必等到长job执行完毕。可以设置spark.scheduler.mode为FAIR

  1. val conf = new SparkConf().setMaster(...).setAppName(...)  
  2. conf.set("spark.scheduler.mode", "FAIR")  
  3. val sc = new SparkContext(conf) 

公平调度池(可能多个)

公平调度器也支持在池中对job分组并给每个池配置不同的选项。这有助于为更重要的job设置高优先级池,例如把每个用户的job分到一组,并且给这些用户相等的资源不论有多少并行task,而不是给每个job相等的资源。

不需要任何干预,新job会进入默认池,但是可以使用spark.scheduler.pool设置job池。

  1. sc.setLocalProperty("spark.scheduler.pool", "pool1") 

设置完后,这个线程(通过调用RDD.save, count, collect)提交的所有job都会使用这个资源池的名称。设置是针对每一个线程的,这样更容易实现一个线程运行一个用户的多个job。如果想清除与一个线程相关的池,调用:sc.setLocalProperty("spark.scheduler.pool", null)

池默认行为

默认地每个池都能获得相等的资源(在默认池中每个job都能获得相等的资源),但在每个池内部,job以FIFO 的顺序运行。例如如果为每一个用户创建一个池,这就意味着每一个用户将获得相等的资源,并且每个用户的查询都会按顺序运行而不会出现后来的查询抢占了前面查询的资源

配置池属性

可以通过修改配置文件改变池属性。每个池都支持三种属性:

  • schedulingMode:可以是FIFO或FAIR,控制池中的job排队等候或公平地分享集群资源。
  • weight:控制资源分配的比例。默认所有池分配资源比重都是1。如果指定一个池的比重为2,那么他获得的资源是其他池的2倍。如果将一个池的比重设的很高,比如1000,那么不论他是否有活跃的job,他总是第一个开始执行task。
  • minShare:除了设置总体的占比之外,还可以对每个池设定一个最小资源分配(例如CPU核数)。在根据比重重新分配资源之前,公平调度器总是试图满足所有活跃池的最小资源需求。minShare属性能以另一种方式确保一个池快速地获得一定数量的资源(10个核)而不必给他更高的优先级。默认地minShare=0。

调用SparkConf.set,可以通过XML文件配置池属性:

  1. conf.set("spark.scheduler.allocation.file", "/path/to/file") 

每个池一个,在XML文件中没有配置的池使用默认配置(调度模式 FIFO, weight 1, minShare 0),例如:

  1. <?xml version="1.0"?><allocations>  
  2. <pool name="production">  
  3. <schedulingMode>FAIR</schedulingMode>  
  4. <weight>1</weight>  
  5. <minShare>2</minShare>  
  6. </pool> 
  7.  
  8. <pool name="test">  
  9. <schedulingMode>FIFO</schedulingMode>  
  10. <weight>2</weight>  
  11. <minShare>3</minShare>  
  12. </pool></allocations> 

【编辑推荐】

  1. 比拼生态和未来,Spark和Flink哪家强?
  2. Apache Kafka与Spark Streaming的两种整合方法及其优缺点
  3. Adaptive Execution 让 Spark SQL 更智能更高效
  4. 用Spark 来做大规模图形挖掘:第一部分
  5. 大数据的技术生态?Hadoop、Hive、Spark之间是什么关系?
【责任编辑:未丽燕 TEL:(010)68476606】
点赞 0

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读