首页 > 其他分享 >spark 算子优化 repartiton

spark 算子优化 repartiton

时间:2024-04-07 22:29:05浏览次数:24  
标签:repartiton task 算子 并行度 SQL Spark spark stage

算子调优之使用repartition解决Spark SQL低并行度的性能问题

并行度:之前说过,并行度是自己可以调节,或者说是设置的。
1、spark.default.parallelism
2、textFile(),传入第二个参数,指定partition数量(比较少用)

咱们的项目代码中,没有设置并行度,实际上,在生产环境中,是最好自己设置一下的。
官网有推荐的设置方式,你的spark-submit脚本中,会指定你的application总共要启动多少个executor,
100个;每个executor多少个cpu core,2~3个;总共application,有cpu core,200个。

官方推荐,根据你的application的总cpu core数量(在spark-submit中可以指定,200个),
自己手动设置spark.default.parallelism参数,指定为cpu core总数的23倍。400600个并行度。600。

承上启下

你设置的这个并行度,在哪些情况下会生效?哪些情况下,不会生效?
如果你压根儿没有使用Spark SQL(DataFrame),那么你整个spark application默认所有stage的并行度
都是你设置的那个参数。(除非你使用coalesce算子缩减过partition数量)

问题来了,Spark SQL,用了。用Spark SQL的那个stage的并行度,你没法自己指定。
Spark SQL自己会默认根据hive表对应的hdfs文件的block,自动设置Spark SQL查询所在的那个stage的
并行度。你自己通过spark.default.parallelism参数指定的并行度,只会在没有Spark SQL的stage中生效。

比如你第一个stage,用了Spark SQL从hive表中查询出了一些数据,然后做了一些transformation操作,
接着做了一个shuffle操作(groupByKey);下一个stage,在shuffle操作之后,
做了一些transformation操作。hive表,对应了一个hdfs文件,有20个block;
你自己设置了spark.default.parallelism参数为100。

你的第一个stage的并行度,是不受你的控制的,就只有20个task;第二个stage,
才会变成你自己设置的那个并行度,100。

问题在哪里?

Spark SQL默认情况下,它的那个并行度,咱们没法设置。可能导致的问题,也许没什么问题,
也许很有问题。Spark SQL所在的那个stage中,后面的那些transformation操作,
可能会有非常复杂的业务逻辑,甚至说复杂的算法。如果你的Spark SQL默认把task数量设置的很少,
20个,然后每个task要处理为数不少的数据量,然后还要执行特别复杂的算法。

这个时候,就会导致第一个stage的速度,特别慢。第二个stage,1000个task,刷刷刷,非常快。

解决上述Spark SQL无法设置并行度和task数量的办法,是什么呢?

repartition算子,你用Spark SQL这一步的并行度和task数量,肯定是没有办法去改变了。但是呢,
可以将你用Spark SQL查询出来的RDD,使用repartition算子,去重新进行分区,
此时可以分区成多个partition,比如从20个partition,分区成100个。

然后呢,从repartition以后的RDD,再往后,并行度和task数量,就会按照你预期的来了。
就可以避免跟Spark SQL绑定在一个stage中的算子,只能使用少量的task去处理大量数据以及
复杂的算法逻辑。

比如说,Spark SQl默认就给第一个stage设置了20个task,但是根据你的数据量以及算法的复杂度
实际上,你需要1000个task去并行执行

所以说,在这里,就可以对Spark SQL刚刚查询出来的RDD执行repartition重分区操作

标签:repartiton,task,算子,并行度,SQL,Spark,spark,stage
From: https://blog.csdn.net/weixin_42435657/article/details/137479027

相关文章

  • Hadoop3.1.3+Spark2.3.4全分布决策树
    该文档是一些配置全分布的注意事项(遇到的坑)与个人的一些指令备注,阅读文档前需要配置好网络,具体可以参考:网络配置。linux系统选择的是Centos7首先是一些小工具:小技巧1.Xshell:可以更方便地批量操控虚拟机进行全分布:这样输入任何指令都可以输入给所有虚拟机,方便全分布的配置......
  • 【复数值图像去噪】ADMM和超光谱宽带相位恢复中的光谱近邻算子,用于定量相位成像(Matlab
     ......
  • Spark-Scala语言实战(13)
    在之前的文章中,我们学习了如何在spark中使用键值对中的keys和values,reduceByKey,groupByKey三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。Spark-Scala语言实战(12)-CSDN博客文章浏览阅读722次,点赞19次......
  • 最新AI创作系统ChatGPT网站系统源码+Ai绘画网站源码+Suno-v3-AI音乐生成大模型(sparkAi
    一、前言SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型+国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT语音对话、GPT-4模型、DALL-E3文生图、......
  • Spark面试整理-解释Spark中的内存管理和持久化机制
    在Apache Spark中,内存管理和持久化机制是核心特性,它们对于提高大规模数据处理的效率和性能至关重要。内存管理统一的内存管理:Spark使用统一的内存管理模型,将执行内存(用于计算如shuffle、join等)和存储内存(用于缓存数据如RDDs)合并在一起。这种模型提供了更高的灵活性和效......
  • 【故障诊断】用于轴承故障诊断的性能增强时变形态滤波方法及用于轴承断层特征提取的增
    ......
  • Spark进阶(四)Spark性能优化和调优
    一、Spark的性能优化工具和技术Spark的性能优化工具和技术主要包括以下几个方面:数据分区和缓存:合理地将数据进行划分和缓存,可以提高数据的访问效率。可以使用repartition或coalesce进行数据分区,使用persist或cache进行数据缓存。并行度设置:通过调整并行度,可以提高Spark......
  • 【无标题】Spark基础编程
    一、创建RDD    1.从内存中创建RDD      (1)parallelize()方法       (2)makeRDD()方法通过Linux本地文件创建RDD 二,使用map方式转换数据  使用sortBy方式转换数据  用collect方法查询数据flat方法转换数据 take方法 ......
  • 深度干货|谈谈阿里云AnalyticDB Spark如何构建低成本数据湖分析
    文/李少锋阿里云瑶池旗下的云原生数据仓库AnalyticDBMySQL版是基于湖仓一体架构打造的实时湖仓。本文将分享AnalyticDBMySQLSpark助力构建低成本数据湖分析的最佳实践。全文目录:AnalyticDBMySQL介绍AnalyticDBMySQLServerlessSpark核心优化基于AnalyticDBMySQL......
  • Spark进阶(一)高级概念和架构
    Spark是一种快速、可扩展的大数据处理引擎,具有高级概念和架构。一、Spark的高级概念弹性分布式数据集(ResilientDistributedDatasets,简称RDD):RDD是Spark中的核心数据抽象,它是一个可分区、可并行操作的不可变分布式对象集合。RDD可以从存储系统中读取数据,也可以通过转换操作......