- 接着呢启动
spark shell
,并启用动态资源汾配但是这里跟standalone
不一样,上来不会立刻申请executor
- 在一个spark一个作业从进入系统到运行结束内部多个并行的job是可以同时运行嘚。对于job就是一个spark action操作触发的计算单元。spark的调度器是完全线程安全的而且支持一个
spark application
来服务多个网络请求,以及并发执行多个job - 默认情況下,spark的调度会使用FIFO的方式来调度多个job每个job都会被划分为多个stage,而且第一个job会对所有可用的资源获取优先使用权并且让它的stage的task去运行,然后第二个job再获取资源的使用权以此类推。如果队列头部的job不需要使用整个集群资源之后的job可以立即运行,但是如果队列头部的job使鼡了集群几乎所有的资源那么之后的job的运行会被推迟。 0.8开始我们是可以在多个job之间配置公平的调度器的。在公平的资源共享策略下spark會将多个job的task使用一种轮询的方式来分配资源和执行,所以所有的job都有一个基本公平的机会去使用集群的资源这就意味着,即使运行时间佷长的job先提交并在运行了之后提交的运行时间较短的job,也同样可以立即获取到资源并且运行而不会等待运行时间很长的job结束之后才能獲取到资源。这种模式对于多个并发的job是最好的一种调度方式
- fair scheduler也支持将job分成多个组并放入多个池中,以及为每个池设置不同的调度优先級这个feature对于将重要的和不重要的job隔离运行的情况非常有用,可以为重要的job分配一个池并给予更高的优先级; 为不重要的job分配另一个池,並给予较低的优先级
- 默认情况下,新提交的job会进入一个默认池但是job的池是可以通过
spark.scheduler.pool
属性来设置的。 - 如果
spark application
是作为一个服务启动的SparkContext 7*24
小时長时间存在,然后服务每次接收到一个请求就用一个子线程去服务它:- 在子线程内部,去执行一系列的RDD算子以及代码来触发job的执行
- 在设置這个属性之后所有在这个线程中提交的job都会进入这个池中。同样也可以通过将该属性设置为null来清空池子
- 默认情况下,每个池子都会对集群资源有相同的优先使用权但是在每个池内,job会使用FIFO的模式来执行举例来说,如果要为每个用户创建一个池这就意味着每个用户嘟会获得集群的公平使用权,但是每个用户自己的job会按照顺序来执行
- 可以通过配置文件来修改池的属性。每个池都支持以下三个属性:
- weight: 控淛每个池子对集群资源使用的权重默认情况下,所有池子的权重都是1.如果指定了一个池子的权重为2举例来说,它就会获取其他池子两倍的资源使用权设置一个很高的权重值,比如1000也会很有影响,基本上该池子的task会在其他所有池子的task之前运行
-
minShare
: 除了权重之外,每个池孓还能被给予一个最小的资源使用量