Spark性能调优之道——解决Spark数据倾斜(Data Skew)的N种姿势

原文:http://blog.csdn.net/tanglizhe1105/article/details/51050974

背景

很多使用Spark的朋友很想知道rdd里的元素是怎么存储的,它们占用多少存储空间?本次我们将以实验的方式进行测试,展示rdd存储开销性能。 
关于rdd的元素怎么存储,Spark里面实现了好几种不同类型的rdd,如最常见的MapPartitionsRDD,它处理map,filter,mapPartition等不引起shuffle的算子;再如ShuffledRDD它由shuffle操作生成的;像GraphX里面的VertexRDD、EdgeRDD和TripletRDD,它们是分区内构建了大量索引得rdd。不同的rdd拥有不同的元素存储机制,这些机制由rdd具体的分区对象来实现。关于rdd分区对象的存储方式,由于内容过多,这里不便介绍。

测试方法论

rdd到底占用多少空间,使用spark web ui的Executors查看是不够的,它只能显示executor目前已使用内存空间大小,并不能跟踪每个rdd空间使用情况。好在spark提供了cache功能,它能使我们手动控制rdd在内存中贮存。若另外一个rdd使用已cache的rdd,那么它的输入便是cached rdd,rdd的输入在web ui的job信息里是可以查看的。本实验的主要方法便是如此

val a = sc.parallelize( 1 to 1024*1024, 1).cache()
a.count()
val b = a.map( x=> (x, x)).cache()
b.count()
val c = b.map(x => x)
c.count()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

那么b.count()提交的job的输入能查看rdd a占用的内存空间大小,c.count()使得我们能查看rdd b占用的内存空间大小。

结果

元素数目 元素类型 rdd占用空间大小
1M Int 32MB
1M (Int, Int) 48MB
1M (Int, Int, Int) 120MB
1M Long 32MB
1M (Long, Long) 56MB
1M (Long, Long, Long) 120MB
1G Int 32GB
1G (Int, Int) 48GB
1G (Int, Int, Int) 120GB
1G Long 32GB
1G (Long, Long) 56GB
1G (Long, Long, Long) 120GB
10G Int 240GB
10G Long 246.7GB

本实验1M使用单个分区,1G使用80个分区(10个节点),10G使用144个分区(18个节点)

1M与1G元素规模的结果吻合的太好了,以至于我都有不敢相信,可是测试出来的结果就是这样的,这也证明spark在数据规模可扩展性方面真是太完美了。 
关于每条元素的存储开销,若元素是Java对象存储,那么每条元素至少会带入18自己额外开销,若以基本数据类型存储,则不会带入额外开销。 
测试结果有一些诡异的地方: 
相同元素规模情况下,Int与Long占用空间相同,(Int, Int)与(Long, Long)不同,但(Int, Int, Int)与(Long, Long, Long)又相同。 
1M Int净存储空间为4MB,但占用32MB空间,且占用空间一般呈整数样式。

时间: 2024-10-07 18:01:10

Spark性能调优之道——解决Spark数据倾斜(Data Skew)的N种姿势的相关文章

[Spark性能调优] 第四章 : Spark Shuffle 中 JVM 内存使用及配置内幕详情

本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Memory 的运行原理和机制 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1.6.x 以前是基于静态固定的JVM内存使用架构和运行机制,如果你不知道 Spark 到底对 JVM 是怎么使用,你怎么可以很有信心地或者是完全确定地掌握和控制数据的缓存空间呢,所

spark性能调优(四) spark shuffle中JVM内存使用及配置内幕详情

转载:http://www.cnblogs.com/jcchoiling/p/6494652.html 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1.6.x 以前是基于静态固定的JVM内存使用架构和运行机制,如果你不知道 Spark 到底对 JVM 是怎么使用,你怎么可以很有信心地或者是完全确定地掌握和控制数据的缓存空间呢,所以掌握Spark对JVM的内存使用内幕是至关重要的.很多人对 Spark 的印象是:它是基于内存的,而且可以缓存一大堆数据

[大数据性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析

本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质是什么,以及 Spark 在性能调优部份的要点,这两点让直式进入性能调优都是一个至关重要的问题,它的本质限制了我们调优到底要达到一个什么样的目标或者说我们是从什么本源上进行调优.希望这篇文章能为读者带出以下的启发: 了解大数据性能调优的本质 了解 Spark 性能调优要点分析 了解 Spark 在资

Spark性能调优之解决数据倾斜

Spark性能调优之解决数据倾斜 数据倾斜七种解决方案 shuffle的过程最容易引起数据倾斜 1.使用Hive ETL预处理数据    ? 方案适用场景:如果导致数据倾斜的是Hive表.如果该Hive表中的数据本身很不均匀(比如某个 key对应了100万数据,其他key才对应了10条数据),而且业务场景需要频繁使用Spark对Hive表 执行某个分析操作,那么比较适合使用这种技术方案.    ? 方案实现思路:此时可以评估一下,是否可以通过Hive来进行数据预处理(即通过Hive ETL预先对

spark性能调优 数据倾斜 内存不足 oom解决办法

[重要] Spark性能调优--扩展篇 : http://blog.csdn.net/zdy0_2004/article/details/51705043

Spark&Spark性能调优实战

Spark特别适用于多次操作特定的数据,分mem-only和mem & disk.其中mem-only:效率高,但占用大量的内存,成本很高;mem & disk:内存用完后,会自动向磁盘迁移,解决了内存不足的问题,却带来了数据的置换的消费.Spark常见的调优工具有nman.Jmeter和Jprofile,以下是Spark调优的一个实例分析: 1.场景:精确客户群 对一个容量为300g的客户信息表在spark上进行查询优化,该大宽表有1800多列,有效使用的有20列. 2.优化达到的效果:

Spark性能调优——扩展篇

本文要解决的问题: 从更深层次考虑,对Spark进行性能调优. 目的 继基础篇分析了开发调优与资源调优之后,本文作为拓展篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. 数据倾斜调优 简述 有时候,大家可能会遇到大数据开发过程中一个比较棘手的问题,那就是数据倾斜,此时Spark作业的性能会比预期差很多,数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数task执行得都非常快,但个别task执行极慢.

[Spark性能调优] Spark Shuffle 中 JVM 内存使用及配置详情

[Spark性能调优]  Spark Shuffle 中 JVM 内存使用及配置详情 本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Memory 的运行原理和机制 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1.6.x 以前是基于静态固定的JVM内存使用架构和运行机制,如果你不知道 Spark 到底对

Spark性能调优之JVM调优

Spark性能调优之JVM调优 通过一张图让你明白以下四个问题 1.JVM GC机制,堆内存的组成                2.Spark的调优为什么会和JVM的调优会有关联?--因为Scala也是基于JVM运行的语言                3.Spark中OOM产生的原因                4.如何在JVM这个层面上来对Spark进行调优 补充:                Spark程序运行时--JVM堆内存分配比例 RDD缓存的数据(0.6)    默认 对象_