spark3.x 生产调优笔记

Apache Spark实战指南:从核心概念到生产环境调优 在大数据处理领域,分布式计算框架是处理海量数据的核心技术。其核心原理在于将计算任务分解并分发到多台机器上并行执行,从而突破单机性能瓶颈。这种技术价值在于能够高效处理TB甚至PB级的数据,广泛应用于数据分析、机器学习、实时流处理等场景。Apache Spark作为其中的杰出代表,凭借其内存计算和DAG调度引擎,显著提升了处理性能。本文聚焦于Spark的实战应用,深入探讨RDD、DataFrame等核心抽象,并结合性能调优与数据倾斜等常见工程挑战,提供从环境搭建到生产部署的完整解决方案。 阅读详情
1 spark sql写入mysql非常慢
  • 有这样一个业务场景:需要将通过Spark处理之后的数据写入MySQL,并在在网页端进行可视化输出。Spark处理之后有大概40万条数据,写入MySQL却要耗费将近30分钟,这也太慢了!
  • 后来翻看了Spark向JDBC数据源写数据的那部分源码,虽然源码中的实现使用的确实是PreparedStatement 的addBatch()方法和executeBatch()方法,但是我们再去翻看executeBatch()方法的实现后发现,它并不是每次执行一批插入,而是循环的去执行每条insert插入语句,这就造成只插入一条数据,而不是一批数据,导致大多数的时间都耗费在了与数据库的交互连接上了
  • 解决方法:
jdbc.saas.url=jdbc:mysql://172.25.1.*/saas-hospital?characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true
2 spark sql jdbc并发分区
  • jdbcDF.rdd.partitions.size # 结果返回 1。该操作的并发度为1,你所有的数据都会在一个partition中进行操作,意味着无论你给的资源有多少,只有一个task会执行任务,执行效率可想而之,并且在稍微大点的表中进行操作分分钟就会OOM。
def jdbc(
  url: String,
  table: String,
  columnName: String,    # 根据该字段分区,需要为整形,比如id等
  lowerBound: Long,      # 分区的下界
  upperBound: Long,      # 分区的上界
  numPartitions: Int,    # 分区的个数
  connectionProperties: Properties): DataFrame

#指定字段区间分区
val predicates =
    Array(
      "2015-09-16" -> "2015-09-30",
      "2015-10-01" -> "2015-10-15",
      "2015-10-16" -> "2015-10-31",
      "2015-11-01" -> "2015-11-14",
      "2015-11-15" -> "2015-11-30",
      "2015-12-01" -> "2015-12-15"
    ).map {
      case (start, end) =>
        s"cast(modified_time as date) >= date '$start' " + s"AND cast(modified_time as date) <= date '$end'"
    }

// 取得该表数据
val jdbcDF = sqlContext.read.jdbc(url,tableName,predicates,prop)
3 SparkSQL与Parquet格式兼容性
  • spark.sql.parquet.writeLegacyFormat 默认是false。如果设置为true 数据会以spark 1.4和更早的版本的格式写入。比如,decimal类型的值会被以apache parquet的fixed-length byte array格式写出,该格式是其他系统例如hive,impala等使用的。如果是false,会使用parquet的新版格式。例如,decimals会以int-based格式写出。
4 RDD复用并序列化存储
  • 必须对多次使用的 RDD 进行持久化,通过持久化将公共 RDD 的数据缓存到内存/磁盘中,之后对于公共 RDD 的计算都会从内存/磁盘中直接获取 RDD 数据
  • RDD 的持久化是可以进行序列化的,当内存无法将 RDD 的数据完整的进行存放的时候,可以考虑使用序列化的方式减小数据体积,将数据完整存储在内存中
    public static final StorageLevel MEMORY_ONLY_SER_2 
    public static final StorageLevel MEMORY_AND_DISK_SER_2 
5 RDD合理设置并行度
  • Spark 官方推荐,task 数量应该设置为 Spark 作业总 CPU core 数量的 2~3 倍。之所以没有推荐 task 数量与 CPU core 总数相等,是因为 task 的执行时间不同,有的 task 执行速度快而有的 task 执行速度慢,如果 task 数量与 CPU core 总数相等,那么执行快的 task 执行完成后,会出现 CPU core 空闲的情况。如果 task 数量设置为 CPU core 总数的 2~3 倍,那么一个task 执行完毕后,CPU core 会立刻执行下一个 task,降低了资源的浪费,同时提升了 Spark作业运行的效率。
val conf = new SparkConf().set("spark.default.parallelism", "500")
6 广播大变量
  • 默认情况下,task 中的算子中如果使用了外部的变量,每个 task 都会获取一份变量的复本,这就造成了内存的极大消耗。一方面,如果后续对 RDD 进行持久化,可能就无法将 RDD数据存入内存,只能写入磁盘,磁盘 IO 将会严重消耗性能;另一方面,task 在创建对象的时候,也许会发现堆内存无法存放新创建的对象,这就会导致频繁的 GC,GC 会导致工作线程停止,进而导致 Spark 暂停工作一段时间,严重影响 Spark 性能。
7 Kryo 序列化
  • Kryo 序列化机制比 Java 序列化机制性能提高 10 倍左右,Spark 之所以没有默认使用Kryo 作为序列化类库,是因为它不支持所有对象的序列化,同时 Kryo 需要用户在使用前注册需要序列化的类型,不够方便,但从 Spark 2.0.0 版本开始,简单类型、简单类型数组、字符串类型的 Shuffling RDDs 已经默认使用 Kryo 序列化方式了
public class MyKryoRegistrator implements KryoRegistrator {
	 @Override
	 public void registerClasses(Kryo kryo){
	 	kryo.register(StartupReportLogs.class);
	 }
 }

//创建 SparkConf 对象
val conf = new SparkConf().setMaster(…).setAppName(…)
//使用 Kryo 序列化库,如果要使用 Java 序列化库,需要把该行屏蔽掉
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"); 
//在 Kryo 序列化库中注册自定义的类集合,如果要使用 Java 序列化库,需要把该行屏蔽掉
conf.set("spark.kryo.registrator", "MyKryoRegistrator");
8 foreachPartition 优化数据库操作
  • 在生产环境中,通常使用 foreachPartition 算子来完成数据库的写入,通过 foreachPartition算子的特性,可以优化写数据库的性能。
  • 对于我们写的 function 函数,一次处理一整个分区的数据;
  • 对于一个分区内的数据,创建唯一的数据库连接;
  • 只需要向数据库发送一次 SQL 语句和多组参数;
9 repartition 解决 SparkSQL 低并行度问题
  • Spark SQL 的并行度不允许用户自己指定,Spark SQL 自己会默认根据 hive 表对应的HDFS 文件的 split 个数自动设置 Spark SQL 所在的那个 stage 的并行度,用户自己通spark.default.parallelism 参数指定的并行度,只会在没 Spark SQL 的 stage 中生效。
  • Spark SQL 这一步的并行度和 task 数量肯定是没有办法去改变了,但是,对于Spark SQL 查询出来的 RDD,立即使用 repartition 算子,去重新进行分区,这样可以重新分区为多个 partition,从 repartition 之后的 RDD 操作,由于不再设计 Spark SQL,因此 stage 的并行度就会等于你手动设置的值,这样就避免了 Spark SQL 所在的 stage 只能用少量的 task 去处理大量数据并执行复杂的算法逻辑。
    spark sql重分区
10 reduceByKey 预聚合
  • 本地聚合后,在 map 端的数据量变少,减少了磁盘 IO,也减少了对磁盘空间的占用;
  • 本地聚合后,下一个 stage 拉取的数据量变少,减少了网络传输的数据量;
  • 本地聚合后,在 reduce 端进行数据缓存的内存占用减少;
  • 本地聚合后,在 reduce 端进行聚合的数据量减少。
  • 基于 reduceByKey 的本地聚合特征,我们应该考虑使用 reduceByKey 代替其他的 shuffle 算
    子,例如 groupByKey。
11 故障:shuffle file not found
  • 原因:Shuffle 操作中,后面 stage 的 task 想要去上一个 stage 的task 所在的 Executor 拉取数据,结果对方正在执行 GC,执行 GC 会导致 Executor 内所有的工作现场全部停止,比如 BlockManager、基于 netty 的网络通信等,这就会导致后面的 task拉取数据拉取了半天都没有拉取到,就会报出 shuffle file not found 的错误,而第二次再次执行就不会再出现这种错误。
# 调整 reduce 端拉取数据重试次数和 reduce 端拉取数据时间间隔这两个参数
val conf = new SparkConf()
 .set("spark.shuffle.io.maxRetries", "60")
 .set("spark.shuffle.io.retryWait", "60s")
12 故障:OOM
  • Shuffle map端:map 端缓冲的默认配置是 32KB,如果每个 task 处理 640KB 的数据,那么会发生 640/32 = 20 次溢写,如果每个 task 处理 64000KB 的数据,机会发生 64000/32=2000 此溢写,这对于性能的影响是非常严重的。
val conf = new SparkConf().set("spark.shuffle.file.buffer", "64")
  • shuffle reduce端: reduce task 的 buffer 缓冲区大小决定了 reduce task 每次能够缓冲的数据量,也就是每次能够拉取的数据量。reduce 端数据拉取缓冲区的大小可以通过 park.reducer.maxSizeInFlight 参数进行设置,默认为 48MB
val conf = new SparkConf().set("spark.reducer.maxSizeInFlight", "96")
13 Executor 堆外内存故障:OOM与task lost
  • Spark 作业处理的数据量非常大,达到几亿的数据量,此时运行 Spark作业会时不时地报错,例如 shuffle output file cannot find,executor lost,task lost,out of memory等,这可能是 Executor 的堆外内存不太够用,导致 Executor 在运行的过程中内存溢出。
  • Executor 的堆外内存主要用于程序的共享库、Perm Space、 线程 Stack 和一些 Memory mapping 等, 或者类 C 方式 allocate object。
  • stage 的 task 在运行的时候,可能要从一些 Executor 中去拉取 shuffle map output 文件,但是 Executor 可能已经由于内存溢出挂掉了,其关联的 BlockManager 也没有了,这就可能会报出 shuffle output file cannot find,executor lost,task lost,out of memory 等错误
# Executor 堆外内存的配置需要在 spark-submit :
--conf spark.yarn.executor.memoryOverhead=2048
14 spark数据倾斜

1. 数据倾斜的表现

  • Spark 作业的大部分 task 都执行迅速,只有有限的几个 task 执行的非常慢,此时可能出现了数据倾斜,作业可以运行,但是运行得非常慢;
  • Spark 作业的大部分 task 都执行迅速,但是有的 task 在运行过程中会突然报出 OOM,反复执行几次都在某一个 task 报出 OOM 错误,此时可能出现了数据倾斜,作业无法正常运行。

2. 定位数据倾斜问题

  • 查阅代码中的 shuffle 算子,例如 reduceByKey、countByKey、groupByKey、join 等算子,根据代码逻辑判断此处是否会出现数据倾斜;
  • 查看 Spark 作业的 log 文件,log 文件对于错误的记录会精确到代码的某一行,可以根据异常定位到的代码位置来明确错误发生在第几个 stage,对应的 shuffle 算子是哪一个;

3. 解决方法1 - 过滤产生数据倾斜的key

  • 在 Spark 作业中允许丢弃某些数据,那么可以考虑将可能导致数据倾斜的 key 进行过滤,滤除可能导致数据倾斜的 key 对应的数据

4. 解决方法2 - 聚合原始数据

  • 如果 Spark 作业的数据来源于 Hive 表,那么可以先在 Hive 表中对数据进行聚合,例如按照 key 进行分组,将同一 key 对应的所有 value 用一种特殊的格式拼接到一个字符串里去,一个 key 就只有一条数据了;之后,对一个 key 的所有 value 进行处理时,只需要进行 map 操作即可,无需再进行任何的 shuffle 操作。通过上述方式就避免了执行 shuffle 操作,也就不可能会发生任何的数据倾斜问题。

5. 解决方法3 - 提高 shuffle 操作中的 reduce 并行度

  • 在大部分的 shuffle 算子中,都可以传入一个并行度的设置参数,比如 reduceByKey(500),这个参数会决定 shuffle 过程中 reduce 端的并行度,在进行 shuffle 操作的时候,就会对应着创建指定数量的 reduce task。对于 Spark SQL 中的 shuffle 类语句,比如 group by、join 等,需要设置一个参数,即 spark.sql.shuffle.partitions,该参数代表了 shuffle read task 的并行度,该值默认是 200,对于很多场景来说都有点过小。

6. 解决方法4 - 聚合算子:使用随机 key 实现双重聚合

  • 首先,通过 map 算子给每个数据的 key 添加随机数前缀,对 key 进行打散,将原先一样的 key 变成不一样的 key,然后进行第一次聚合,这样就可以让原本被一个 task 处理的数据分散到多个 task 上去做局部聚合;随后,去除掉每个 key 的前缀,再次进行聚合。

7. 解决方法5 - join算子:将 reduce join 转换为 map join

  • 将较小 RDD 中的数据直接通过 collect 算子拉取到 Driver 端的内存中来,然后对其创建一个 Broadcast 变量;接着对另外一个 RDD 执行 map 类算子,在算子函数内,从 Broadcast 变量中获取较小 RDD 的全量数据,与当前 RDD 的每一条数据按照连接 key 进行比对,如果连接 key 相同的话,那么就将两个 RDD 的数据用你需要的方式连接起来。

8. 解决方法6 - join算子:sample 采样对倾斜 key 单独进行 join

  • 当数据量非常大时,可以考虑使用 sample 采样获取 10%的数据,然后分析这 10%的数据中哪个 key 可能会导致数据倾斜,然后将这个 key 对应的数据单独提取出来。

9. 解决方法7 - join算子:使用随机数扩容进行 join

  • 我们会将原先一样的 key 通过附加随机前缀变成不一样的 key,然后就可以将这些处理后的“不同 key”分散到多个 task 中去处理,而不是让一个 task 处理大量的相同 key。这一种方案是针对有大量倾斜 key 的情况,没法将部分 key 拆分出来进行单独处理,需要对整个RDD 进行数据扩容,对内存资源要求很高。
Spark3 AQE实战:从原理到调优,解锁性能提升新姿势 本文深入解析Spark3 AQE(Adaptive Query Execution)的核心原理与实战调优技巧,帮助开发者解锁性能提升新姿势。通过动态合并分区、Join策略切换和数据倾斜优化三大机制,显著提升集群资源利用率和作业执行效率。文章还提供了生产环境配置建议和常见问题排查指南,助力大数据工程师高效应对分布式计算挑战。 阅读详情

相关推荐

Spark调优手册:解决OOM和性能瓶颈的终极方案

Spark作为大数据处理领域的“瑞士军刀”,广泛应用于ETL、实时计算、机器学习等场景。:任务运行中突然崩溃,日志提示“Executor lost”或“Java heap space”;性能瓶颈:任务耗时远超预期,CPU/内存资源利用率低,或Shuffle阶段“卡脖子”。本文聚焦这两个核心问题,覆盖Spark 2.x/3.x版本,适用于离线批处理与实时流计算场景。Spark核心概念与内存模型;OOM的5大常见原因与解决方案;性能瓶颈的4类典型场景与优化策略;

AI 原生应用开发的博客 1104

[3.0.1]性能调优之调节并行度

参考中华石杉 DT大数据梦工厂系列场景什么是并行度、如何调节并行度、并行度对性能有怎样的影响以及并行度调节成多大合适?分析 并行度 Snail理解的并行度是指spark集群能同时并发处理的task数量,在数值上等于集群的总core的数量,其值可以在编写应用程序的时候指定:val conf = new SparkConf() conf.setAppName("my first spark

Memory of Mr.Snail 981

HBase与Spark集成实战:RDD_DF读写HBase,性能调优案例

环境搭建:HBase集群与Spark集群的兼容性配置、依赖管理;基础读写:基于RDD和DataFrame(DF)读写HBase的完整代码实现,包括表结构设计、数据映射、API调用;性能调优:通过3个真实案例(写入延迟优化、读取吞吐量提升、高并发场景调优),详解调优方法论与参数配置;避坑指南:解决版本冲突、region热点、数据倾斜等常见问题。本文从实战出发,讲解了Spark与HBase集成的全流程。

2501_92132293的博客 1046

Spark 多个Stage执行是串行执行的么?

作者:祝威廉 在做内部培训的时候,我讲了这么一句: 一个Job里的Stage都是串行的,前一个Stage完成后下一个Stage才会进行。 显然上面的话是不严谨的。 看如下的代码: 这里的话,我们构建了两个输入(input1,input2),input2带有一个reduceByKey,所以会产生一次Shuffle,接着进行Join,会产生第二次Shuffle(值得注意的是,join 不一定产生新的Stage,我通过强制变更join后的分区数让其...

qq_32445015的博客 1129

微信数据库读取解密脚本 聊天记录查看工具,支持所有微信版本,后期将支持企业微信[Windows]

(1)获取微信昵称、微信账号、微信手机号、微信邮箱、微信KEY的基址偏移(2)获取微信的微信昵称、微信账号、微信手机号、微信邮箱、微信KEY、微信原始ID(wxid_******)(3)获取微信文件夹路径(4)支持查看聊天记录查看(5)根据key解密微信数据库(6)提供数据库部分字段说明(7)支持微信多开场景,获取多用户信息等(8)微信需要登录状态才能获取数据库密钥(9)支持导出聊天记录为html,备份微信聊天记录,方便查看(10)合并多个数据库,方便查看。

weixin_43101935的博客 1万+

ICC2 高效上手 | create_lib 命令全攻略:数字后端工程师的必备秘籍

如果技术文件中的足够满足你的需求,你可以设置,然后运行create_lib命令;如果技术文件的精度不够,那就需要显式地使用来定义缩放因子。在使用create_lib必须显式指定库名(如my_libA推荐优先通过或来关联技术数据,确保你的设计库有正确的工艺基础。显式地通过-ref_libs定义参考库,这样可以避免工具自动推导时可能出现的冲突。慎重使用,只有在对数据精度有特殊需求时才显式指定,并且要确保它与参考库的缩放因子一致。

weixin_50820814的博客 1595

Spark_日期参数解析参数-spark.sql.legacy.timeParserPolicy

在Spark 3.0之前的版本中,日期和时间解析使用java.text.SimpleDateFormat,它在解析某些日期和时间格式时可能较为宽松。例如,它可能允许日期字符串中的月份部分超过12,或日期部分超过31,并尝试自动调整。如果你的代码中有日期和时间解析,并且你升级到了Spark 3.0或更高版本,那么你可能需要关注这个配置选项,以确保代码的兼容性和期望行为。如果你的日期和时间字符串格式严格并始终遵循ISO标准,或者你希望采用更严格的解析策略,那么你应该使用默认的。在Apache Spark中,

迎难而上 2316

知识抽取框架OneKE

OneKE 中指令的格式采用了类 JSON 字符串的结构,本质上是一种字典类型的字符串。优化知识抽取的性能不仅能够强化模型对世界知识的理解和应用,还能够构建知识要素之间的跨领域的深度关联和依赖,这些都是大规模知识图谱构建的关键依赖。一直是知识图谱大规模落地的关键难题之一,因为真实世界的信息高度碎片化、非结构化,大语言模型在处理信息抽取任务时仍因抽取内容与自然语言表述之间的巨大差异导致效果不佳,自然语言文本信息表达中因隐式、长距离上下文关联存在较多的歧义、多义、隐喻等,给知识抽取任务带来较大的挑战。

qq_32907491的博客 3205

spark.sql.parquet.writeLegacyFormat:ParquetDecodingException: Can not read value at 0 in block -1 in

系列二 在此之前可以先阅读文章:SparkSQL与Hive metastore Parquet转换 在说问题之前首先了解一个参数spark.sql.parquet.writeLegacyFormat(默认false)的作用: 设置为true时,数据会以Spark1.4和更早的版本的格式写入。比如decimal类型的值会被以Apache Parquet的fixed-length byte array格式写出,该格式是其他系统例如Hive、Impala等使用的。 设置为false时,会使用parquet的新版格

智海观潮的博客 3515

【Unity Shader】2D模型 3D模型混用的穿模问题(Spine在3D场景中出现前后穿模问题的解决办法)

问题描述: 在3D场景中使用Spine模型(2D), 因为Spine需要像Billboard类似的处理,永远是垂直与相机的, 所以一般情况下2D模型能正常显示且前后的阻挡关系也是没有问题的,如下图所示,一切都很美好.(这里用一个四边形,图中的福字表示2D模型) 可是如果后面蓝色的格子比较高,或者2D角色本身也比较高,那么就会出现模型穿插的问题,如下图所示: 如果吧2D模型竖立起来,前后关系肯定是没有问题的,所以也能避免模型穿插的问题,可是就没有Billboard效果,圆形的福字已经被压扁了,如下图:

Vitens的专栏 4591

【YOLO系列】YOLOv4详解:模型结构、损失函数、训练方法及代码实现

摘要:YOLOv4在目标检测领域实现了精度与速度的平衡,通过CSPDarknet53骨干网络、SPP+PANet特征融合及CIoU损失函数等创新,在MS COCO数据集达到65.7% AP50,V100显卡实现62FPS实时检测。核心优化包括Mosaic数据增强、自对抗训练和解耦头结构,显著提升小目标检测和遮挡场景鲁棒性。代码实现采用CSP模块和SPP多尺度池化,兼顾计算效率与检测性能,为工业落地提供高效解决方案。(149字)

一碗白开水一 1358

Spark SQL的Parquet那些事儿.docx

Parquet是一种列式存储格式,很多种处理引擎都支持这种存储格式,也是sparksql的默认存储格式。Spark SQL支持灵活的读和写Parquet文件,并且对par...

大数据星球-浪尖 1869

分子动力学仿真软件:LAMMPS_(16).应用案例分析

通过以上四个应用案例,我们详细介绍了如何使用LAMMPS进行不同系统的分子动力学仿真。从简单的液体水仿真到复杂的纳米管仿真,每个案例都包含了详细的步骤说明和代码示例。读者可以通过这些示例实际操作并验证结果,从而更好地理解LAMMPS的功能和使用方法。希望这些案例能够为读者在分子动力学仿真领域的研究和应用提供帮助。

kkchenjj的博客 837

Spark性能调优

嗨,各位小伙伴大家好,我是爱小可爱的IT白,最近应朋友所邀,一直让写一篇关于Spark调优方面的文章,这两天工作之余,忙里偷闲,写了这篇调优文章,跟大家一起共享;在大数据领域,肯定有很多小伙伴跟笔者一样为了让生产中数据执行速度更快、性能更高而去使用Spark,当我们用Spark程序实现功能开发并使程序正常稳定运行起来的时候,一定是非常有成就感的;但是随着数据量的增加以及需求的完善,我们就开始关注我们这个程序能否做到在运行起来的时候让数据查询更快、让页面响应更快、尽可能的节省空间占用率;

aikeaidecxy的博客 2490

计算机视觉学习路线图:从入门到专家

计算机视觉学习路线图:从入门到专家​ ,人工智能,计算机视觉,大模型,AI,计算机视觉学习路线图从七方面展开。先强调数学基础,含线性代数、概率统计和微积分;接着介绍 Python、OpenCV 等编程语言与工具;涵盖边缘检测、特征提取等经典算法;阐述深度学习中 CNN 结构、经典模型及实现;涉及目标检测、图像分割等高级专题;包含图像分类、目标检测和人脸识别等项目实战;最后提及科研进阶的论文阅读、项目参与和论文发表,助学习者从入门到专家。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 7万+

图解电动汽车:电动汽车的分类

前面《电动汽车简介》中简单介绍了电动汽车的分类,主要包括混合动力电动汽车(HEV)和纯电动汽车(BEV)两大类。其中,混合动力汽车又可分为非插电式混合动力汽车、插电式混合动力汽车(PHEV)以及增程式电动汽车(REEV)。 主要分类 简单来说,各类电动汽车的特点如下。 纯电动汽车(BEV)就是指动力来源完全由电能提供,由电动机驱动的汽车,并且电能储存在电池中。 混合动力汽车(HEV)则是指动力来源可以是化石燃料,也可以是电能,并且电能除了可以存储在电池中,还可以由化石能源转化而来。 非插电式混合动力汽车

程序员「阿基米东」的编程之旅 3089

Spark调优在—代码调优

spark调优—代码优化

weixin_44077750的博客 1383

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spark 深度实战:核心原理剖析与生产级调优全解

重新绘制自Spark 3.5.0官方文档,标注了DAGScheduler、TaskScheduler、Executor的核心交互流程,红色箭头表示shuffle数据流,绿色表示计算结果返回路径。:某Join任务通过动态调整Join顺序,执行时间从45min→12min。1.关键指标:任务时长、GC时间占比、Shuffle spill量。:实时统计广告点击量,要求Exactly-Once语义。:某日志分析任务因单Key数据量过大(1TB+),采用。:某电商订单表(1亿+记录)执行。:用户流失预测模型训练。

salamu_的博客 875

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

spark shuffer调优

性能优化 shuffle spark.shuffle.file.buffer,默认32k spark.shuffle.memoryFraction,0.2 map端内存缓冲,reduce端内存占比;很多资料、网上视频,都会说,这两个参数, 是调节shuffle性能的不二选择,很有效果的样子,实际上,不是这样的。 以实际的生产经验来说,这两个参数没有那么重要,往往来说,shuffle的性能不是因为 ...

一个北漂的程序猿 455

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

hive3.x on spark3.0生产调优实践

1 数据倾斜 绝大部分任务都很快完成,只有一个或者少数几个任务执行的很慢甚至最终执行失败,这样的现象为数据倾斜现象。 将数据倾斜分为单表携带了 GroupBy 字段的查询和两表(或者多表)Join 的查询。 1.1 单表数据倾斜优化 1.1.1 Map 端进行聚合 - GroupBy 操作同时聚合函数为 count 或者 sum set hive.map.aggr = true; set hive.groupby.mapaggr.checkinterval = 100000; set hive.grou

架构师老狼 1474

数据工程师实战指南:Hadoop、Spark、Flink等五大框架生产调优与避坑

大数据(Big Data)指在分布式环境下对海量、高速、多样数据进行采集、存储、计算与服务的系统性工程能力。其核心原理在于通过分而治之(Shuffle/Partition)、容错重试(Speculative Execution/Checkpointing)和统一资源调度(YARN/K8s)保障SLA。技术价值体现在降低TCO、提升分析时效性与支撑实时决策闭环。典型应用场景包括电商用户行为分析、金融风控实时拦截、IoT设备时序处理等。本文聚焦Hadoop、Spark、Flink、Hive、Storm五大高频框

weixin_30772105的博客 779

Spark 3.0实战:从环境搭建到性能调优的完整指南

在大数据处理领域,分布式计算框架是处理海量数据的核心技术。其核心原理在于将大规模数据集分割成多个分区,通过并行计算集群进行高效处理,从而突破单机性能瓶颈。这项技术的核心价值在于能够显著提升数据处理效率,降低计算成本,并支持复杂的分析任务。它广泛应用于日志分析、用户行为统计、机器学习特征工程等场景。本文聚焦于Apache Spark 3.0这一主流框架,深入探讨其自适应查询执行(AQE)和动态分区裁剪(DPP)等智能化特性,这些特性能够自动优化执行计划,有效应对数据倾斜问题,并结合Kryo序列化等性能优化手段

weixin_31412781的博客 255

Spark RDD 转换操作深度解析:从基础到调优

本文深入解析了Spark RDD的核心转换操作及其优化策略。主要内容包括: RDD转换操作体系:详细分类了单元素转换(map/filter/flatMap)、键值对转换(groupByKey/reduceByKey/join)、集合操作(union/distinct)和分区控制(repartition/coalesce)四大类操作。 惰性求值机制:通过DAG构建和延迟执行实现自动优化,能合并连续操作、跳过未使用分支,提高容错性和资源利用率。 生产调优策略: 避免不必要的Shuffle操作 合理控制分区数量和

csdn_tom_168的博客 1018

Spark 性能调优实战:从开发到生产落地

Spark 是绝大多数大数据平台的主力计算引擎,但在真正的生产环境中,一条 SQL 或一段 DataFrame 代码从“能跑”到“跑得好”,中间隔着一整套理解模型、精细调优的工程实践。本文将从作业执行模型开始,一直深入内存管理、Shuffle 优化、并行度、Join 策略与监控诊断,所有内容均以“可动手、可排错”为目标,并在关键环节附上代码和 Spark UI 截图解读(以文字模拟)。

渣渣盟的博客 888

【Spark 】完整知识体系:从入门到生产调优

Spark 3.5是现代大数据处理的核心引擎,核心为Spark SQL,推荐使用DataFrame/Dataset API(Python仅支持DataFrame)。其性能关键在于Catalyst优化器,实现自动逻辑与物理优化、代码生成。数据源首选Parquet,支持多种格式读写。编程风格可选DSL链式调用或SQL字符串,后者需注册临时视图。理解Transformation惰性求值与Action触发执行是掌握Spark的关键。避免学习过时的RDD,专注高效、声明式的数据处理。

zy123456nn的博客 489

Amazon EMR生产级实战:Spark调优、EMRFS深度配置与Spot容错

Amazon EMR并非简单的‘云上Hadoop’,而是融合基础设施编排、深度调优运行时与S3原生数据平面的分布式计算操作系统。其核心原理在于三层抽象协同:底层EC2资源池化管理、中层Spark/Hadoop发行版级预集成、上层EMRFS对S3的元数据一致性增强与延迟写入机制。技术价值体现在成本可控(Spot实例+自动伸缩)、弹性可靠(Application Recovery+Checkpoint)、可观测可诊断(CloudWatch+EMR日志管道)。典型应用场景包括PB级日志实时特征计算、分钟级ETL流

weixin_30954265的博客 386
上一篇: 元数据管理理论
下一篇: kafka优化笔记
架构师老狼
博客等级 码龄14年 44粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值