大数据计算框架Spark之任务调度
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
公平调度池(可能多个) 公平调度器也支持在池中对job分组并给每个池配置不同的选项。这有助于为更重要的job设置高优先级池,例如把每个用户的job分到一组,并且给这些用户相等的资源不论有多少并行task,而不是给每个job相等的资源。 不需要任何干预,新job会进入默认池,但是可以使用spark.scheduler.pool设置job池。
设置完后,这个线程(通过调用RDD.save, count, collect)提交的所有job都会使用这个资源池的名称。设置是针对每一个线程的,这样更容易实现一个线程运行一个用户的多个job。如果想清除与一个线程相关的池,调用:sc.setLocalProperty("spark.scheduler.pool", null) 池默认行为 默认地每个池都能获得相等的资源(在默认池中每个job都能获得相等的资源),但在每个池内部,job以FIFO 的顺序运行。例如如果为每一个用户创建一个池,这就意味着每一个用户将获得相等的资源,并且每个用户的查询都会按顺序运行而不会出现后来的查询抢占了前面查询的资源 配置池属性 可以通过修改配置文件改变池属性。每个池都支持三种属性:
调用SparkConf.set,可以通过XML文件配置池属性:
每个池一个,在XML文件中没有配置的池使用默认配置(调度模式 FIFO, weight 1, minShare 0),例如:
【编辑推荐】
点赞 0 (编辑:淮安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |