12 | 基础配置详解:哪些参数会影响应用程序稳定性?
配置项
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了Spark的基础配置项,重点关注了内存配置的设置思路和原则。作者以Spark分布式应用开发为背景,强调了配置项对代码运行稳定性和性能的重要性。文章首先指出了配置项繁多的问题,然后从“跑得稳”和“跑得快”两个角度出发,整理了读者必须关注的配置项。在讲解内存配置时,作者详细解释了Executor Memory的划分和内存区域的含义,以及与之相关的配置项,如spark.executor.memory、spark.memory.fraction和spark.memory.storageFraction。针对不同的应用场景,作者提出了合理设置这些配置项的一般性原则,以保证程序的高速和稳定。文章还介绍了与CPU、内存、磁盘有关的配置项,以及它们的含义、作用与设置技巧。最后,文章提到了配置项的设置途径,包括配置文件、命令行参数和SparkConf对象。通过这些方式,读者可以灵活地设置配置项,满足不同的应用场景需求。整体而言,本文内容丰富,涵盖了Spark基础配置的重要性和设置原则,适合读者快速了解Spark配置的关键要点。
《零基础入门 Spark》,新⼈⾸单¥59
全部留言(9)
- 最新
- 精选
- Geek_2dfa9a置顶关于何时何处配置Property这一块,官网文档有提及,属性主要分为两块:deploy相关和Spark Runtime Control(个人理解是任务运行相关, 即Driver,任务及其相关资源)相关。前面的比如“spark.driver.memory”, “spark.executor.instances”,适合放在spark-defaults.conf 后面的比如“spark.task.maxFailures”,适合在SparkConf(Driver)/spark-submit命令中指定。关于两处属性的覆盖问题: 通常情况优先级最高的是SparkConf,其次是spark-submit,最后是spark-defaults.conf,当然也有例外,“spark.driver.memory”, “spark.executor.instances”这两个属性在SparkConf设置也不会生效。 属性是也是细分的,按照官方文档分类: Application Properties 这块主要是任务相关的,应该对应开发自己设置,从生产角度来看,我觉得每个任务必须设置,甚至不应该有默认值。 Runtime Environment 任务运行相关,比如依赖存放的位置,这块可以统一设置,按需在任务里覆盖 Shuffle Behavior shuffle行为,大部分偏spark-defaults.conf统一设置,“spark.shuffle.service.enabled”配置值得一提, 开启后可以由统一服务维护shuffle的数据文件,避免Executor shuffle时意外终止导致的找不到shuffle文件。 Spark UI Compression and Serialization 压缩和序列化,在任务里按需设置,主要降低网络IO负载,但是肯定会带来CPU额外开销 Memory Management 内存,统一设置,按需在任务里覆盖 Execution Behavior 执行相关,统一设置,按需在任务里覆盖 Executor Metrics 执行指标,统一设置,按需在任务里覆盖,这块是不是用来分析性能瓶颈的? Networking和Scheduling都是偏spark-defaults.conf统一设置,感觉没啥可以在任务里设置的 Barrier Execution Mode这块我分析应该是面向MPI模型(模型训练)和BSP模型(图计算)的,应该也是和任务相关的,说实话后面都不怎么看得懂了,都是猜的 Dynamic Allocation,Thread Configurations 这两个搞不太清楚 Security 安全,偏集群部署方向的配置多,可以统一配置
作者回复: 先不说每一类配置项的设置位置是否合理,单说老弟深入钻研的精神,尤为可嘉!!!顺便一提,ID可以改一下,这样大家对你印象更深~ 为了降低大家的学习成本,咱们确实没有逐个讲解每一类配置项,Configuration页面确实提供了种类繁多的配置选项,对于刚入门的同学非常不友好。老弟认真地把每一类都过了一遍,而且都分析了配置项的设置顺序,真的很赞👍!!! 这里咱们不去深究具体每一类到底应该设置在哪个level,其实只要把握住配置项的一半设置原则,基本上就不会有太大的问题。对于不同(种类)的配置项,可以follow下面的设置原则(其实你把你分析的每个环节汇总,能得出一样的结论): 1. 硬件资源类的(资源供给类:CPU、内存、磁盘、网络),spark-defaults.conf统一设置; 2. 全局服务类的(比如动态扩容、External shuffle services,安全,压缩,Spark UI,等等),spark-defaults.conf统一设置; 3. 任务粒度的配置(如Task重试、locality wait、是否推断speculative task,等等),用命令行,或是SparkConf,推荐用SparkConf,命令行不好管理~
2021-10-13210 - 小新相反,如果你的应用场景是机器学习、或是图计算,这些计算任务往往需要反复消耗、迭代同一份数据,处理方式就不一样了。在这种情况下,咱们要充分利用 RDD Cache 提供的性能优势,自然就要把 sf 这个参数设置得稍大一些,从而让 Storage Memory 有足够的内存空间,来容纳需要频繁访问的分布式数据集。 就这个问题,想问一下,如果整个应用前期是ETL, 后期使用MLlib进行机器学习,那个参数可以代码里手动调整吗?
作者回复: 可以的,老弟说的场景,其实挺普遍的,比如机器学习流水线就是这样,前期ETL做特征工程、样本工程,后期MLlib做模型训练。把应用分开就好了,每个应用内部,通过SparkConf来单独设置参数值,从而在应用层面对配置项做隔离设置
2021-12-013 - Ebdaoli关于 1 core 1 task , 集群中总core 为 executors * cores 这一块,在SparkSQL 中设置 spark.shuffle.partitions 时,遵照总的并行度 设置为 总core 数的 2~3 倍, 避免在某些执行过快的task在执行完本次任务后,还有其他的任务可以执行,充分利用集群的资源,这里如果设置成4~5倍或者更大的倍数会对性能造成什么影响,是好的还是坏的?理论来说如果 并行度更多了,集群资源也是能充分利用,每个task 处理的数据量还会更少,这里有些困惑对于 2~3 倍的并行度设置的理解,所以能请老师帮忙分析下吗?
作者回复: 好问题~ 这里不必拘泥于文中给出的2~3倍,这是个非常general、老套的经验之谈。2~3倍,仅仅是个起点,或者说设置并行度的思路,实际上并行度的设置,参考cores总数并不总是最好的,最佳的思路,还是参考数据分片大小。如果能够把分片大小控制在200MB左右,并行度实际上就是D/200MB,其中D是数据集总大小。目的还是充分利用CPU、像你说的:“避免在某些执行过快的task在执行完本次任务后,还有其他的任务可以执行,充分利用集群的资源”。不考虑数据集总大小D,单纯地设置2~3倍,或是4~5倍,其实是没有意义的~ 关于并行度的设置,内存、CPU设置,老弟可以参考性能调优篇的“三足鼎立”哈~
2022-02-251 - WilliamD/P ~ m/c 老师,公式中的P与是 spark.default.parallelism 和 spark.sql.shuffle.partitions有关,这里的P与这两者的关系具体是怎样的呢?具体是以那个为准呢?
作者回复: 老弟实际上问的是spark.default.parallelism 和 spark.sql.shuffle.partitions的区别。 1)spark.default.parallelism,这个用来控制RDD的默认并行度,HadoopRDD是自带并行度的(与HDFS文件分片一致),而用parallelize创建的RDD,在没有指定并行度的情况下,默认用spark.default.parallelism 2)spark.sql.shuffle.partitions,这个是reduce阶段默认的并行度,如果开发者没有明确指定的话 回到原来的问题,D/P ~ m/c,这里的P,指的是开发者要设置的并行度,如果不设置,那默认就是上面那两种情况。在D/P ~ m/c这个式子里面,D是固定的,是数据原始大小,P、m、c,都需要开发者设定,而他们3个的设置,可以参考这个公式,做到“三足鼎立”,尽量让等式两边平衡
2021-12-041 - 小新D/P ~m/c与前面讲的一般把并发数设置为集群cores的2~3倍,有何关联。一个是讲局部Executor, 一个是整体优化概念是吗?
作者回复: 指的是数据集大小、并行度,与资源设置之间的关联关系,参考这个公式: D/P ~m/c 有利于做到数据分区之间,task与task之间的负载均衡,从而为应用的执行性能打下很好的基础。 其中D是数据集大小,P是并行度,m是每个Executors的内存大小,c是CPU核数。公式的意思是说,单个数据分片,与单个task能拿到的内存,是在同一个数量级,是相匹配的。这样一来,task与数据量相匹配,应用整体的计算效率,就不会差到哪里去
2021-12-011 - Zhenngspark.executor.instances参数是在Yarn的Spark集群中使用的,在Standalone集群中executor的个数是由spark.cores.max/spark.executor.cores 这两个参数决定的。我在Standalone集群中修改spark.executor.instances参数并不起作用
作者回复: 是的,没错~
2022-03-03 - 小李对于D/P ~ m/c,其中对于p和c比较好量化,存储尺寸D(若是压缩存储)势必加载到内存会有膨胀的情况,这对于Execution Memory(m)的设置是否会不好把握(需要加载一下数据看一下实际占用的内存大小)?
作者回复: D的话,可以精确估计,也即加载到内存后cache,然后通过执行计划来看实际内存消耗;另一种就是粗略估计,比较按照压缩比,大致算一个数字,也是可以的~
2022-01-14 - Unknown element老师 问下spark.local.dir是spark安装目录下的文件夹吗
作者回复: 不是,这是个配置项,可以配置到任意操作系统目录,用来改善Shuffle中间文件存储,以及RDD Cache磁盘存储。
2021-10-084 - LHJ_Stan老师,spark涉及的概念比较多,经常出现同一概念多个名词解释,譬如,数据分区、分片、partitions,这三者的区别,可以麻烦老师稍微再详细讲一讲吗?2023-03-01归属地:广东