首页 / 更多教程 / 【总结】Spark应用程序的资源分配
【总结】Spark应用程序的资源分配
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【总结】Spark应用程序的资源分配,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2954字,纯文字阅读大概需要5分钟。
内容图文
![【总结】Spark应用程序的资源分配](/upload/InfoBanner/zyjiaocheng/837/87b3b35b32b84f388fd61a531e156186.jpg)
执行Spark任务,资源分配是很重要的一方面。如果配置不准确,Spark任务将耗费整个集群的机缘导致其他应用程序得不到资源。
怎么去配置Spark任务的executors,cores,memory,有如下几个因素需要考虑:
- 数据量
- 任务完成时间点
- 静态或者动态的资源分配
- 上下游应用
Spark应用当中术语的基本定义:
- Partitions : 分区是大型分布式数据集的一小部分。 Spark使用分区来管理数据,这些分区有助于并行化数据处理,并且使executor之间的数据交换最小化
- Task:任务是一个工作单元,可以在分布式数据集的分区上运行,并在单个Excutor上执行。并行执行的单位是任务级别。单个Stage中的Tasks可以并行执行
- Executor:在一个worker节点上为应用程序创建的JVM,Executor将巡行task的数据保存在内存或者磁盘中。每个应用都有自己的一些executors,单个节点可以运行多个Executor,并且一个应用可以跨多节点。Executor始终伴随Spark应用执行过程,并且以多线程方式运行任务。spark应用的executor个数可以通过SparkConf或者命令行 –num-executor进行配置
- Cores:CPU最基本的计算单元,一个CPU可以有一个或者多个core执行task任务,更多的core带来更高的计算效率,Spark中,cores决定了一个executor中并行task的个数
- Cluster Manager:cluster manager负责从集群中请求资源
cluster模式执行的Spark任务包含了如下步骤:
- driver端,SparkContext连接cluster manager(Standalone/Mesos/Yarn)
- Cluster Manager在其他应用之间定位资源,只要executor执行并且能够相互通信,可以使用任何Cluster Manager
- Spark获取集群中节点的Executor,每个应用都能够有自己的executor处理进程
- 发送应用程序代码到executor中
- SparkContext将Tasks发送到executors
以上步骤可以清晰看到executors个数和内存设置在spark中的重要作用。
以下将尝试理解优化spark任务的最佳方式:
- 静态分配:配置值从spark-submit中体现
- 动态分配:从数据量和计算需求上衡量资源需求,并在使用后释放掉,这样可以让其他应用重复利用资源
静态分配
以下按不同例子讨论验证不同参数和配置组合
例子1
硬件资源: 6 节点,每个节点16 cores, 64 GB 内存
每个节点在计算资源时候,给操作系统和Hadoop的进程预留1core,1GB,所以每个节点剩下15个core和63GB
内存。
core的个数,决定一个executor能够并发任务的个数。所以通常认为,一个executor越多的并发任务能够得到更好的性能,但有研究显示一个应用并发任务超过5,导致更差的性能。所以core的个数暂设置为5个。
5个core是表明executor并发任务的能力,并不是说一个系统有多少个core,即使我们一个CPU有32个core,也设置5个core不变。
executor个数,接下来,一个executor分配 5 core,一个node有15 core,从而我们计算一个node上会有3 executor(15 / 5),然后通过每个node的executor个数得到整个任务可以分配的executors个数。
我们有6个节点,每个节点3个executor,6 3 = 18个executors,额外预留1个executor给AM,最终要配置17个executors。
最后spark-submit启动脚本中配置 –num-executors = 17
memory,配置每个executor的内存,一个node,3 executor, 63G内存可用,所以每个executor可配置内存为63 / 3 = 21G
从Spark的内存模型角度,Executor占用的内存分为两部分:ExecutorMemory和MemoryOverhead,预留出MemoryOverhead的内存量之后,才是ExecutorMemory的内存。
MemoryOverhead的计算公式: max(384M, 0.07 spark.executor.memory)
因此 MemoryOverhead值为0.07 * 21G = 1.47G > 384M
最终executor的内存配置值为 21G – 1.47 = 19 GB
至此, Cores 5, Executors 17, Executor Memory 19 GB
内容总结
以上是互联网集市为您收集整理的【总结】Spark应用程序的资源分配全部内容,希望文章能够帮你解决【总结】Spark应用程序的资源分配所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。