文章目录
一、yarn的资源分配策略
1. 总体:
-
因为不仅仅只有spark on yarn,hive、impala等也依赖yarn,所以spark提交资源参数如果设置的等于或者超过最大资源数,实际分配的资源会小于设置值
-
yarn is a resource scheduling framework,它可以设置一次任务所能获取的最大和最小资源。资源包括
节点、core、memory
,yarn可以控制一个任务所能分配的这3样的上下限。可以设置资源池,队列,角色组,通过这些概念来管理资源的分配。 -
spark程序运行时如果内存不足是会报错退出的,亲测,报的错包括
控制台:java.io.IOException: Failed to send RPC xxx to /ip
,executor日志:ERROR util.Utils:Aborting task,Error writing row,Internal state when error was thrown:xxx
。而MR不会因为资源不足而执行失败。
-
spark程序的启动会有最低资源要求,如果连启动的资源都达不到,会一直提示资源等待。或者一直处于accepted状态
-
spark的资源获取,yarn的资源分配都不是严格按照设定的来。亲测。
-
yarn中如果硬盘资源不足或者nm宕机,都会导致能分配的资源减少。
example,因为硬盘资源不足,yarn进行资源分配计算时,会减少NM的数量,导致rmUI中可分配资源只有1个的量。坑!!!
-
on yarn下,driver和executor可以位于同1个节点。
{1} 查看yarn拥有、能分配的所有资源
{2} 查看任务可以使用的资源,任务真正获取的资源。 rm_ip:8088
可以在这个界面中打开spark和hive任务的UI,如果是cluster模式的spark程序,因为不确定哪个是driver所在,只能在这里打开。
2. executor的数量
由spark.cores.max/spark.executor.cores和e-n决定。如果前者大,取e-n;后者大,取前者。
亲测,如果e-c设置的过大,会导致executor数的减少。比如yarn一共只有24个core,e-c设置了8个,那最终executor一定不是3,即使en为3,因为还要把一些core分配给其他服务和备用。
ecample1:yarn一共24cores,e-c 8,en无论设置多少实际e只有1或2个,最终把ec改为5,才出现了3个e。
example2:yarn可用nm是2个,一个8核,总共16个核,如果e-c设成10,那只会有1个executor
{1} 查看executor的状态、数量,在sparkUI导航栏的executor选项卡中。
{2} e和节点的关系
executor的意义就是为了在节点上管理任务,包括资源分配和任务运行,1个节点上可以有多个executor,一般这样是为了只在一个节点上扩大内存,因为如果增大em,那所有节点上e的内存都增大了。此时如果多设置1个e,那么有1个节点上会有2个e,这样这个节点上就会有2份e的资源和任务执行能力。这样只增加了1份内存。
3. 内存的大小
yarn中可以给任务设置内存的上下限,也可以给yarn的角色组内的任务设置上下限
这里设置了之后还要在xx中设置,防止启动时报错
4. core的数量
三、spark的task和分区之间的关系
亲测,spark的task会根据数据量自动设置,会远超过默认数量,60G数据会达到560个task。
改变了下资源,发现task数没变化,可能在一定的资源范围内,task数只跟数据量有关。这可能是spark的一种优化。