Spark内存资源分配——spark.executor.memory等参数的设置方法

这篇具有很好参考价值的文章主要介绍了Spark内存资源分配——spark.executor.memory等参数的设置方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

基于论坛上一些关于spark内存设置的文章,我对一个项目中实际运行的任务进行了内存参数分析和优化。如果要了解更多详细设置原理,可见文末的参考文章链接。
已知内存分配存在通过用户提交的参数设置进行静态分配,和yarn进行动态分配两种,所以本文对两种状况都根据实际场景进行了分析。

资源详情

配置spark的内存参数,首先要基于集群资源的情况。本例的机器情况:一共8台机器,即8个Node。核心数:32 core / node;内存资源:50.8GB RAM/ node。
每个Node在计算的时候,给操作系统和Hadoop的进程预留2core,2.8GB,所以每个节点剩下28个core和48GB内存。

任务A——推断动态分配内存的过程

发现任务提交的参数设置为:
executor-memory=8g;num-executors=10;executor-cores=3。考虑到有MemoryOverhead,发现任务有参数将其设置为1G。(默认值是max(384M, 0.07 × spark.executor.memory))
因此按参数配置,本任务占用总内存为(8+1)10=90gb;核心数为310=30。可见一定没有占满,那么系统会基于memory动态分配core和executor-num。

executor个数:num-executors

因为一个executor其实可以跨node运行,因此用总可用内存数除以每个executor的内存数,可得总计num-executors=320/8=40,考虑有可能有1GB的MemoryOverhead,则num-executors应为320/9≈36,所以系统可能会动态分配36~40个executor。
也可能Yarn比我们设想的还要狠,给其他应用预留的空间更少,那么极限情况下把所有可用内存都给这个应用,那么最大的num-executors=(50.88)/8≈50,考虑MemoryOverhead,则num-executors应为(50.88)/9≈45。
最终,可以猜测Yarn动态分配的Executor个数在36~50个之间,40左右较为合理。
通过查看web页面的某个stage的执行计划,可以发现确实是40个executor。
Spark内存资源分配——spark.executor.memory等参数的设置方法

core的个数

本参数决定一个executor能够并发任务的个数。所以通常认为,一个executor越多的并发任务能够得到更好的性能。但有研究显示一个应用并发任务超过5,导致更差的性能。
目前已知共有40个executor,8个node,则一个Node平均5个executor。同时一个Node30个核(去掉预留的2个),那么如果动态分配,可能最多给每个Executor动态分配30/5=6个Core。
从Yarn的总Core分配界面可以看到差不多是这样。当然,如果有更好的方法从WEB界面的Spark ApplicationMaster里查看到core的数量,欢迎分享。
Spark内存资源分配——spark.executor.memory等参数的设置方法

driver-memory大小

driver运行内存,默认值512m,一般2-6G。目前来看该参数对任务运行没有太大的影响,本案例中的设置值为4g。即,driver-memory=4g

————后来实际运行任务时,查看执行日志可以发现,这个任务总在报内存不足的错误,因此考虑设置合理的静态内存分配参数,把executor的内存调大,这就可以参考下面一个任务的设置过程。
修改之后,Yarn上的资源分配情况,可以看出确实和新设置的参数很符合,即1个Executor占20G内存。Spark内存资源分配——spark.executor.memory等参数的设置方法

任务B——静态分配内存参数的设置过程

因为该任务经常报超内存的错误,所以先设置memory大小。

memory大小

配置每个executor的内存,一个node,48G内存可用。考虑到集群还会有其他任务运行,所以给其他任务留8GB,所以设置每个 executor可配置内存为40GB。这也意味着一个node1个executor。
从Spark的内存模型角度,Executor占用的内存分为两部分:ExecutorMemory和MemoryOverhead,预留出MemoryOverhead的内存量之后,才是ExecutorMemory的内存。
MemoryOverhead的计算公式: max(384M, 0.07 × spark.executor.memory)
因此 MemoryOverhead = 0.07 × 40G = 2.8G=2867MB 约等于3G > 384M
最终executor的内存配置值为 40G – 3 =37 GB
因此设置:executor-memory = 37 GB;spark.executor.memoryOverhead=3*1024=3072

core的个数

决定一个executor能够并发任务的个数。所以通常认为,一个executor越多的并发任务能够得到更好的性能。在本次设置中,理论上来说,由于1个node只有1个executor,所以可以用24个core。但有研究显示一个应用并发任务超过5,导致更差的性能。
所以core的个数暂设置为5个。
5个core是表明executor并发任务的能力,并不是说一个系统有多少个core,即使我们一个CPU有32个core,也设置5个core不变。
因此设置:executor-cores=5

executor个数

因为已经设置好1个node只有1个executor,所以,之后通过每个node的executor个数,可以得到整个任务可以分配的executors个数。
我们有8个节点,每个节点1个executor,8 × 1 = 8个executors,额外预留1个executor给AM,最终要配置7个executors。
因此设置:num-executors=7

driver-memory大小

driver运行内存,默认值512m,一般2-6G。目前来看该参数对任务运行没有太大的影响,因此就设置4g。
因此设置:driver-memory=4g

参考文章

对参数设置讲的很细的一篇,本文重点参考:Spark任务的core,executor,memory资源配置方法

对Spark Executor Memory做系统讲解,特别是讲到内存分为执行内存和存储内存两部分。还介绍了一些别的参数:如何设置Spark Executor Memory的大小

延申的内存调优,即对shuffle过程的参数调优,这个本例没有用到,有兴趣的话可以尝试一下:Spark学习(五)Spark Shuffle及内存分配文章来源地址https://www.toymoban.com/news/detail-412279.html

到了这里,关于Spark内存资源分配——spark.executor.memory等参数的设置方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kubernetes配置 Pods 和容器—调整分配给容器的 CPU 和内存资源

    本页说明如何在不重启 Pod 或其容器的情况下调整分配给运行中 Pod 容器的 CPU 和内存资源。 Kubernetes 节点会基于 Pod 的  requests  为 Pod 分配资源, 并基于 Pod 的容器中指定的  limits  限制 Pod 的资源使用。 对于原地调整 Pod 资源而言: 针对 CPU 和内存资源的容器的  requests  和

    2024年02月13日
    浏览(44)
  • K8S学习指南(10)-k8s中为pod分配CPU和内存资源

    Kubernetes(简称K8s)是一种开源的容器编排平台,广泛用于构建、部署和管理容器化应用。在Kubernetes中,Pod是最小的可部署单元,而资源分配是确保Pod正常运行的关键因素之一。本文将深入探讨如何在Kubernetes中为Pod分配CPU和内存资源,并提供详细的示例。 在容器化环境中,多

    2024年02月04日
    浏览(54)
  • 【云计算与虚拟化】第五章 实验一 vCenter Server的高级功能—vMotion、虚拟内存、虚拟CPU、磁盘分配及资源池

    实验一    vCenter Server的高级功能—vMotion、虚拟内存、虚拟CPU、磁盘分配及资源池 1.通过vSphere client 客户端登陆vCenter服务器 (1)再次新建一个共享存储,iSCSI类型的,大小60G,名称为iSCSI-2。 (2)将运行在ESXi01主机上的虚拟机,在关机的状态下,数据存储位置不动,运行的

    2024年02月04日
    浏览(50)
  • Docker资源管理和分配指南

    cgroups其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组(如CPU、内存、磁盘输入输出等)。 什么是Docker资源限制? 默认情况下,Docker容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。如果不对容器资

    2024年04月11日
    浏览(41)
  • 资源分配问题【算法设计与分析】<动态规划问题>

    问题分析: ( 要把问题分为多步解决,每步求出子问题的多个最优策略后一步依赖于上一步的最有策略,最后一步得出问题的解) (1)首先要考虑分配给项目A的资金与利润的关系。得到此时投资数x与其相对应的 的关系。 (2)其次要考虑分配给前两个项目A,B的总资金 与利

    2023年04月08日
    浏览(38)
  • PCIe简介/体系架构/工作原理/资源分配/错误定位

    目录 一、PCIe简介 二、体系结构 三、层次结构 四、工作原理 五、不同版本及传输速率、吞吐量 六、资源分配 ID资源 PCIe资源分配原理 七、Lane和Link PCIe插槽 八、MSI和MSI-X 九、SR-IOV 十、AER 十一、lspci命令 PCIe(Peripheral Component Interconnect Express)是一种用于连接计算机内部硬件

    2024年02月16日
    浏览(46)
  • 4G LTE频带划分和国内运行商资源分配

    LTE 4G的频段划分是按照频率范围进行的,各国或地区根据自己的情况和规定,选择不同的频段进行分配。目前,全球共有44个LTE频段,每个频段都有特定的使用场景和优点,需要根据实际情况来选择合适的频段。 以下是LTE 4G的一些常见频段: 700MHz频段:适用于广域覆盖和室内

    2024年02月09日
    浏览(47)
  • 6-1 求解资源分配问题(动态规划法)[PTA]

    6-1 求解资源分配问题(动态规划法) 某公司有3个商店A、B、C,拟将新招聘的5名员工分配给这3个商店,各商店得到新员工后,每年的赢利情况如下表所示,求分配给各商店各多少员工才能使公司的赢利最大。 函数接口定义: 裁判测试程序样例: 输入格式: 第一行输入商店数

    2024年02月12日
    浏览(68)
  • 如何通过物联网实现农业资源的精准分配?

    作者:禅与计算机程序设计艺术 近年来,随着互联网、传感网、物联网等新型信息技术的飞速发展,越来越多的人们开始关注“物联网+农业”这一领域,它将传统的信息采集、汇聚、传输、分析等过程融入到现代化生产的环节中。“物联网+农业”系统可以将各类传感器数据

    2024年02月08日
    浏览(74)
  • 深度强化学习与人工智能:如何实现高效的资源分配

    深度强化学习(Deep Reinforcement Learning, DRL)是一种人工智能技术,它结合了深度学习和强化学习两个领域的优点,以解决复杂的决策问题。在过去的几年里,DRL已经取得了显著的成果,例如在游戏、机器人控制、自动驾驶等领域的应用。在资源分配方面,DRL可以帮助企业更有效地

    2024年02月21日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包