广告
返回顶部
首页 > 资讯 > 精选 >怎么进行Spark的性能调优
  • 889
分享到

怎么进行Spark的性能调优

2023-06-19 11:06:18 889人浏览 安东尼
摘要

怎么进行spark的性能调优,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0、背景集群部分 spark 任务执行很慢,且经常出错,参数改来改去怎么都无法优化其性能和解决频繁随机

怎么进行spark的性能调优,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

0、背景

集群部分 spark 任务执行很慢,且经常出错,参数改来改去怎么都无法优化其性能和解决频繁随机报错的问题。

看了下任务的历史运行情况,平均时间 3h 左右,而且极其不稳定,偶尔还会报错:

怎么进行Spark的性能调优

1、优化思路

任务的运行时间跟什么有关?

(1)数据源大小差异

在有限的计算下,job的运行时长和数据量大小正相关,在本例中,数据量大小基本稳定,可以排除是日志量级波动导致的问题:

怎么进行Spark的性能调优

(2)代码本身逻辑缺陷

比如代码里重复创建、初始化变量、环境、RDD资源等,随意持久化数据等,大量使用 shuffle 算子等,比如reduceByKey、join等算子。

在这份100行的代码里,一共有 3 次 shuffle 操作,任务被 spark driver 切分成了 4 个 stage 串行执行,代码位置如下:

怎么进行Spark的性能调优

咱们需要做的就是从算法和业务角度尽可能减少 shuffle 和 stage,提升并行计算性能,这块是个大的话题,本次不展开详述。

(3)参数设置不合理

这块技巧相对通用,咱们来看看之前的核心参数设置:

num-executors=10 || 20 ,executor-cores=1 || 2, executor-memory= 10 || 20,driver-memory=20,spark.default.parallelism=64

假设咱们的 spark 队列资源情况如下:

memory=1T,cores=400

参数怎么设置在这里就有些技巧了,首先得明白 spark 资源的分配和使用原理:

在默认的非动态资源分配场景下, spark 是预申请资源,任务还没起跑就独占资源,一直到整个 job 所有 task 结束,比如你跳板机起了一个 spark-shell 一直没退出,也没执行任务,那也会一直占有所有申请的资源。(如果设置了 num-executors,动态资源分配会失效)

注意上面这句话,spark 的资源使用分配方式和 mapReduce/Hive 是有很大差别的,如果不理解这个问题就会在参数设置上引发其它问题。

比如 executor-cores 设多少合适?少了任务并行度不行,多了会把整个队列资源独占耗光,其他同学的任务都无法执行,比如上面那个任务,在 num-executors=20 executor-cores=1 executor-memory= 10 的情况下,会独占20个cores,200G内存,一直持续3个小时。

那针对本case中的任务,结合咱们现有的资源,如何设置这 5 个核心参数呢?

1) executor_cores*num_executors 不宜太小或太大!一般不超过总队列 cores 的 25%,比如队列总 cores 400,最大不要超过100,最小不建议低于 40,除非日志量很小。

2) executor_cores 不宜为1!否则 work 进程中线程数过少,一般 2~4 为宜。

3) executor_memory 一般 6~10g 为宜,最大不超过 20G,否则会导致 GC 代价过高,或资源浪费严重。

4) spark_parallelism 一般为 executor_cores*num_executors 的 1~4 倍,系统默认值 64,不设置的话会导致 task 很多的时候被分批串行执行,或大量 cores 空闲,资源浪费严重。

5) driver-memory 早前有同学设置 20G,其实 driver 不做任何计算和存储,只是下发任务与yarn资源管理器和task交互,除非你是 spark-shell,否则一般 1-2g 就够了。

Spark Memory Manager:

6)spark.shuffle.memoryFraction(默认 0.2) ,也叫 ExecutionMemory。这片内存区域是为了解决 shuffles,joins, sorts and aggregations 过程中为了避免频繁IO需要的buffer。如果你的程序有大量这类操作可以适当调高。

7)spark.storage.memoryFraction(默认0.6),也叫 StorageMemory。这片内存区域是为了解决 block cache(就是你显示调用dd.cache, rdd.persist等方法), 还有就是broadcasts,以及task results的存储。可以通过参数,如果你大量调用了持久化操作或广播变量,那可以适当调高它。

8)OtherMemory,给系统预留的,因为程序本身运行也是需要内存的, (默认为0.2)。Other memory在1.6也做了调整,保证至少有300m可用。你也可以手动设置 spark.testing.reservedMemory . 然后把实际可用内存减去这个reservedMemory得到 usableMemory。 ExecutionMemory 和 StorageMemory 会共享usableMemory * 0.75的内存。0.75可以通过 新参数 spark.memory.fraction 设置。目前spark.memory.storageFraction 默认值是0.5,所以ExecutionMemory,StorageMemory默认情况是均分上面提到的可用内存的。

例如,如果需要加载大的字典文件,可以增大executor中 StorageMemory 的大小,这样就可以避免全局字典换入换出,减少GC,在这种情况下,我们相当于用内存资源来换取了执行效率。

最终优化后的参数如下:

怎么进行Spark的性能调优

效果如下:

怎么进行Spark的性能调优

(4)通过执行日志分析性能瓶颈

最后的任务还需要一个小时,那这一个小时究竟耗在哪了?按我的经验和理解,一般单天的数据如果不是太大,不涉及复杂迭代计算,不应该超过半小时才对。

由于集群的 Spark History Server 还没安装调试好,没法通过 spark WEB UI 查看历史任务的可视化执行细节,所以我写了个小脚本分析了下前后具体的计算耗时信息,可以一目了然的看到是哪个 stage 的问题,有针对性的优化。

怎么进行Spark的性能调优

可以看到优化后的瓶颈主要在最后写 redis 的阶段,要把 60G 的数据,25亿条结果写入 Redis,这对 redis 来说是个挑战,这个就只能从写入数据量和 kv 数据库选型两个角度来优化了。

怎么进行Spark的性能调优

(5)其它优化角度

当然,优化和高性能是个很泛、很有挑战的话题,除了前面提到的代码、参数层面,还有怎样防止或减少数据倾斜等,这都需要针对具体的场景和日志来分析,此处也不展开。

2、spark 初学者的一些误区

对于初学者来说 spark 貌似无所不能而且高性能,甚至在某些博客、技术人眼里 spark 取代 mapreduce、hive、stORM 分分钟的事情,是大数据批处理、机器学习、实时处理等领域的银弹。但事实确实如此吗?

从上面这个 case 可以看到,会用 spark、会调 api 和能用好 spark,用的恰到好处是两码事,这要求咱们不仅了解其原理,还要了解业务场景,将合适的技术方案、工具和合适的业务场景结合——这世上本就不存在什么银弹。。。

说道 spark 的性能,想要它快,就得充分利用好系统资源,尤其是内存和CPU:核心思想就是能用内存 cache 就别 spill 落磁盘,CPU 能并行就别串行,数据能 local 就别 shuffle。

看完上述内容,你们掌握怎么进行Spark的性能调优的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 怎么进行Spark的性能调优

本文链接: https://www.lsjlt.com/news/295697.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么进行Spark的性能调优
    怎么进行Spark的性能调优,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0、背景集群部分 spark 任务执行很慢,且经常出错,参数改来改去怎么都无法优化其性能和解决频繁随机...
    99+
    2023-06-19
  • 怎么配置php.ini进行PHP性能调优
    这篇文章主要介绍“怎么配置php.ini进行PHP性能调优”,在日常操作中,相信很多人在怎么配置php.ini进行PHP性能调优问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么配置php.ini进行PHP性...
    99+
    2023-06-29
  • 怎么进行Java EE性能测试与调优
    这篇文章主要讲解了“怎么进行Java EE性能测试与调优”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么进行Java EE性能测试与调优”吧!性能测试的目标性能测试不同于功能测试,不是对与...
    99+
    2023-06-17
  • Spark性能优化的基础是什么
    Spark性能优化的基础是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言在大数据计算领域,Spark已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark的功...
    99+
    2023-06-03
  • 如何进行C++代码的性能调优?
    如何进行C++代码的性能调优C++作为一种高性能的编程语言,被广泛运用在许多性能要求较高的领域,如游戏开发、嵌入式系统等。然而,在编写C++程序时,我们常常会面临性能瓶颈的挑战。为了提高程序的运行效率和响应时间,我们需要进行代码的性能调优。...
    99+
    2023-11-02
    C++ 性能调优 代码调优
  • angular怎么进行性能优化
    这篇“angular怎么进行性能优化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“angu...
    99+
    2022-10-19
  • CSS怎么进行性能优化
    这篇文章主要介绍“CSS怎么进行性能优化”,在日常操作中,相信很多人在CSS怎么进行性能优化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS怎么进行性能优化”的疑惑有所帮...
    99+
    2022-10-19
  • 如何进行数据库性能调优
    如何进行数据库性能调优,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言微软工程师的一个工程师曾经对性能调优有一个非常形象的比喻:剥洋葱 ...
    99+
    2022-10-19
  • 怎么进行SQL调优
    这篇文章主要介绍“怎么进行SQL调优”,在日常操作中,相信很多人在怎么进行SQL调优问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么进行SQL调优”的疑惑有所帮助!接下来,...
    99+
    2022-10-18
  • 怎么进行Spark in action on Kubernetes - Spark Operator的原理解析
    怎么进行Spark in action on Kubernetes - Spark Operator的原理解析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言...
    99+
    2023-06-02
  • 怎么进行MySQL性能优化中的索引优化
    本篇文章为大家展示了怎么进行MySQL性能优化中的索引优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引...
    99+
    2022-10-19
  • 怎么进行Spark example的运行过程分析
    这篇文章将为大家详细讲解有关怎么进行Spark example的运行过程分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。pom.xml<project xmlns="htt...
    99+
    2023-06-03
  • springboot性能调优怎么实现
    要对Spring Boot应用进行性能调优,可以从以下几个方面入手:1. 数据库优化:优化数据库查询语句、创建索引、合理使用缓存、合...
    99+
    2023-09-14
    springboot
  • 怎么理解MySQL性能调优
    本篇内容介绍了“怎么理解MySQL性能调优”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MySQL性能调优...
    99+
    2022-10-18
  • Vue开发中怎么进行性能优化
    本篇内容介绍了“Vue开发中怎么进行性能优化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!性能优化,是每一个开发者都会遇到的问题,特别是现在...
    99+
    2023-06-29
  • Golang开发建议:如何进行有效的性能调优
    在Golang开发中,性能调优是非常重要的一个方面。无论你是在开发一个Web应用、一个分布式系统还是一个底层工具,提高Golang程序的性能需要进行有效的性能调优,这将直接影响到应用的响应速度和稳定性。本文将向你介绍一些关于Golang性能...
    99+
    2023-11-23
    Golang性能调优 有效性能优化 Golang开发建议
  • Golang开发建议:如何进行高效的性能调优和优化
    Golang开发建议:如何进行高效的性能调优和优化随着互联网和大数据时代的到来,软件的性能要求也越来越高。作为一种快速、高效、并发性好的编程语言,Golang在构建高性能应用程序方面表现出色。然而,即使使用了Golang,也不意味着就能够轻...
    99+
    2023-11-22
    优化 Golang 性能调优
  • php-fpm怎么进行优化来提升性能
    这篇文章主要讲解了“php-fpm怎么进行优化来提升性能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php-fpm怎么进行优化来提升性能”吧!PHP是无处不在的,可以说是互联网 Web 应...
    99+
    2023-06-30
  • 如何对MySQL进行性能调优和故障排查?
    如何对MySQL进行性能调优和故障排查?一、引言MySQL是目前使用最广泛的关系型数据库管理系统之一,它在许多应用场景中都扮演着重要的角色。但是,随着数据量逐渐增大和业务需求的增长,MySQL的性能问题和故障排查变得越来越常见。本文将介绍如...
    99+
    2023-10-22
    MySQL 性能调优 故障排查
  • 如何在PHP项目中进行性能调优和资源优化?
    如何在PHP项目中进行性能调优和资源优化?随着互联网的高速发展,越来越多的应用程序采用了PHP作为开发语言。由于PHP的易用性和灵活性,许多开发人员选择使用它来构建自己的网站和应用程序。然而,由于PHP的动态特性和解释性质,一些开发人员可能...
    99+
    2023-11-03
    性能调优 PHP项目 资源优化
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作