零基础入门 Spark
吴磊
前 FreeWheel 机器学习研发经理
19171 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
零基础入门 Spark
15
15
1.0x
00:00/00:00
登录|注册

12 | 基础配置详解:哪些参数会影响应用程序稳定性?

你好,我是吴磊。
国庆假期即将结束,我们的基础模块也即将收尾。到目前为止,我们一起学习了 RDD 编程模型、Spark 分布式部署、Spark 工作原理,以及 RDD 常用算子。恭喜你,到这里,可以说你已经完全跨入了 Spark 分布式应用开发的大门。有了现在的知识储备,对于大多数的业务需求,我相信你都能很快地实现。
不过,快速用代码实现各式各样的业务需求,这还只是第一步。我们不光要让代码跑起来,还需要让代码跑得又快又稳。
要想做到这些,我们还需要配置项来帮忙。如果把 Spark 看作是一部 F1 赛车的话,那么配置项就是赛车车身的各项配置参数,如发动机缸数、最大转矩、车身轴距、悬挂方式、整车装备质量,等等。只有合理地配置车身参数,才能让车子本身的稳定性和性能得到保障,为选手的出色发挥奠定基础。
今天这一讲,我们就来说一说 Spark 都有哪些配置项,以及这些配置项的含义与作用。

配置项

打开 Spark 官网的Configuration 页面,在这里你能找到全部的 Spark 配置项。
不过,让人沮丧的是,配置项数目过于庞大,种类繁多,有的需要设置 true/false,有的则需要我们给出明确的数值,让人看上去眼花缭乱、无所适从。
配置项示意图
那么问题来了,面对这么多的配置项,我们应该从哪里入手呢?别着急,既然我们的目的是让车子“跑得稳”、“跑得快”,那咱们不妨从这两个角度出发,来整理那些我们必须要掌握的配置项。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了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-13
    2
    10
  • 小新
    相反,如果你的应用场景是机器学习、或是图计算,这些计算任务往往需要反复消耗、迭代同一份数据,处理方式就不一样了。在这种情况下,咱们要充分利用 RDD Cache 提供的性能优势,自然就要把 sf 这个参数设置得稍大一些,从而让 Storage Memory 有足够的内存空间,来容纳需要频繁访问的分布式数据集。 就这个问题,想问一下,如果整个应用前期是ETL, 后期使用MLlib进行机器学习,那个参数可以代码里手动调整吗?

    作者回复: 可以的,老弟说的场景,其实挺普遍的,比如机器学习流水线就是这样,前期ETL做特征工程、样本工程,后期MLlib做模型训练。把应用分开就好了,每个应用内部,通过SparkConf来单独设置参数值,从而在应用层面对配置项做隔离设置

    2021-12-01
    3
  • 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-25
    1
  • William
    D/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-04
    1
  • 小新
    D/P ~m/c与前面讲的一般把并发数设置为集群cores的2~3倍,有何关联。一个是讲局部Executor, 一个是整体优化概念是吗?

    作者回复: 指的是数据集大小、并行度,与资源设置之间的关联关系,参考这个公式: D/P ~m/c 有利于做到数据分区之间,task与task之间的负载均衡,从而为应用的执行性能打下很好的基础。 其中D是数据集大小,P是并行度,m是每个Executors的内存大小,c是CPU核数。公式的意思是说,单个数据分片,与单个task能拿到的内存,是在同一个数量级,是相匹配的。这样一来,task与数据量相匹配,应用整体的计算效率,就不会差到哪里去

    2021-12-01
    1
  • Zhenng
    spark.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-08
    4
  • LHJ_Stan
    老师,spark涉及的概念比较多,经常出现同一概念多个名词解释,譬如,数据分区、分片、partitions,这三者的区别,可以麻烦老师稍微再详细讲一讲吗?
    2023-03-01归属地:广东
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部