spark 跑spark sql时cpu利用率特别高怎么办

spark 跑spark sql时cpu利用率特别高怎么办,第1张

storage内存用于broadcast、缓存cache 数据

Storage 堆内内存=(sparkexecutormemory–300MB) sparkmemoryfraction sparkmemorystorageFraction

Execution执行Shuffle、Join、Sort 等计算过程中的临时数据:

Execution 堆内内存=(sparkexecutormemory–300MB) sparkmemoryfraction (1-sparkmemorystorageFraction)

other :主要用于存储 RDD 转换 *** 作所需要的数据,例如 RDD 依赖等信息:

Reserved Memory:系统预留内存,会用来存储Spark内部对象

堆外内存:一种是DirectMemory, 一种是JVM Overhead。主要用于程序的共享库、Perm Space、 线程Stack和一些Memory mapping等, 或者类C方式allocate object

我们公司yarn node节点的可用资源配置为:单台node节点可用资源数:核数33cores、内存110G。Hive on Spark任务的基础配置,主要配置对象包括:Executor和Driver内存,Executor配额,任务并行度。

配置参数为sparkexecutormemory和sparkexecutorcores。如果要最大化使用core,建议将core设置为4、5、6,且满足core的个数尽量可以整除yarn资源核数。yarn资源可用33核,建议sparkexecutorcores设置为4,最多剩下一个core,如果设置为5,6都会有3个core剩余。 sparkexecutorcores=4,由于总共有33个核,那么最大可以申请的executor数是8。总内存处以8,也即是 110/8,可以得到每个executor约1375GB内存。

建议 sparkexecutormemoryOverhead(spark的executor堆外内存)站总内存的 15%-20%。 那么最终 sparkexecutormemoryOverhead=275 G 和sparkexecutormemory=11 G

注意:默认情况下 sparkexecutormemoryOverhead = max(executorMemory 010, 384M),正常情况下不需要手动设置spark堆外内存,如果spark任务出现如下报错,可以手动提高堆外内存大小。

注意:默认情况下 sparkexecutormemoryOverhead = max(executorMemory 010, 384M),正常情况下不需要手动设置spark堆外内存,如果spark任务出现如下报错,可以手动提高堆外内存大小。

Container killed by YARN for exceeding memory limits 169 GB of 16 GB physical memory used Consider boosting sparkyarnexecutormemoryOverhead

对于drvier的内存配置,主要有两个参数:

Driver的内存通常来说不设置,或者设置1G左右应该就够了。需要注意的是,如果需要使用collect算子将RDD的数据全部拉取到Driver端进行处理,那么必须确保Driver的内存足够大,否则会出现OOM内存溢出的问题。

配置参数为sparkexecutorinstances。该参数用于设置Spark作业总共要用多少个Executor进程来执行。

executor的数目是由每个节点运行的executor数目和集群的节点数共同决定。我们离线集群27个节点,那么离线spark任务使用的最大executor数就是 216(278) 最大数目可能比这个小点,因为driver也会消耗核数和内存。

该参数可以结合sparkexecutorcores设置,默认单个spark任务最大不超过60cores,sparkexecutorcores设置为4,则sparkexecutorinstances不超过15。

设置spark任务的并行度参数为sparkdefaultparallelism。spark任务每个stage的task个数=max(sparkdefaultparallelism, HDFS的block数量)。如果不设置该参数,Spark自己根据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。spark默认sparkdefaultparallelism配置较少,如果task个数比较少的话,前面spark资源配置没有意义。官网建议:该参数设置为 num-executors executor-cores的2~3倍较为合适。

当一个运行时间比较长的spark任务,如果分配给他多个Executor,可是却没有task分配给它,而此时有其他的yarn任务资源紧张,这就造成了很大的资源浪费和资源不合理的调度。动态资源调度就是为了解决这种场景,根据当前应用任务的负载情况,实时的增减Executor个数,从而实现动态分配资源,使整个Spark系统更加健康。

开启spark动态资源分配后,application会在task因没有足够资源被挂起的时候去动态申请资源。当任务挂起或等待sparkdynamicAllocationschedulerBacklogTimeout(默认1s)的时间后,会开始动态资源分配;之后每隔sparkdynamicAllocationsustainedSchedulerBacklogTimeout(默认1s)时间申请一次,直到申请到足够的资源。每次申请的资源量是指数增长的,即1,2,4,8等。

当application的executor空闲时间超过sparkdynamicAllocationexecutorIdleTimeout(默认60s)后,就会被回收。

使用场景:同一个SQL语句需要同时更新多个分区,类似于如下SQL语句:

spark是将数据缓存到内存中,Spark计算的时候可以从内存中获取数据

缓存方式:persist、cache

cache调用的是persist的默认方法,默认存储级别是内存 

persist默认内存中存放

spark设置task占用内存方法如下:

1、根据查询相关资料:driver和executor申请的内存,系统默认会保留300M。

2、采用统一内存分配方式,StorageMemory和ExecutionMemory占用总内存的60%,默认一人一半(50%)。

以上就是关于spark 跑spark sql时cpu利用率特别高怎么办全部的内容,包括:spark 跑spark sql时cpu利用率特别高怎么办、spark standalone 怎么设置堆外内存、spark内存模型和执行计划过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10629572.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存