首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spark Cache 性能测试

Spark Cache 性能测试

原创
作者头像
涂小刚
修改于 2017-10-17 08:39:25
修改于 2017-10-17 08:39:25
2.8K0
举报
文章被收录于专栏:涂小刚的专栏涂小刚的专栏

作者介绍:涂小刚,攻城狮一枚,有代码洁癖,热爱学习,热爱生活,痛恨酱油帝、跪舔帝。目前主要从事Spark大数据平台与机器学习平台相关方向的工作,关注Spark与TensorFlow

测试准备

训练数据是通过 Facebook SNS 公开数据集生成器得到,在HDFS上大小为9.3G,100个文件,添加如下两个参数以保证所有资源全部到位后才启动task,训练时间为加载数据到训练完毕这期间的耗时。

代码语言:txt
AI代码解释
复制
--conf spark.scheduler.minRegisteredResourcesRatio=1
--conf
spark.scheduler.maxRegisteredResourcesWaitingTime=10000000000

测试集群为3个节点的TS5机器搭建而成,其中一台作为RM,两台NM。除以上配置外,其他配置全部保持Spark默认状态。公共资源配置、分区设置以及算法参数如下表所示,executor_memory视不同的测试用例不同:

测试用例

在不使用Cache的情况和使用Cache的情况下,分别测试Spark-Kmeans算法的训练时间以及GC时间占比,相关测试指标数据如下表所示:

从以上测试数据看来,让人有点出乎意料,一开始有点不太相信,但是多次测试后数据并没有多大的抖动,所以说Spark的性能受多方面因素的影响,单单Cache这块不同的Cache方式以及不同的资源情况下,其性能差别就相差较大,下面分析其内在原因。

不使用cache时,GC不是瓶颈,在每次迭代时均要读一遍HDFS,访问HDFS有较大的开销。从HDFS加载训练数据后直接采用Spark原生的Cache:

  • executor_memory为2g时,不足以Cache住原始训练数据,从UI上看到Cache的比例只有33%左右,导致频繁的rdd-block 剔除重建,同时由于内存吃紧,可能引发较重的GC,从UI上看到GC时间占到总的task运行时间的12%左右,已经成为瓶颈,其整体性能还不如不使用Cache;
  • executor_memory为4g时,也不足以Cache住原始训练数据,但是其Cache的比例有90%左右,同样存在rdd-block 剔除重建,并引发较重的GC,GC时间占总的task运行时间的7%左右,虽然比executor_memory为2g的情况有所好转,但是仍然不理想,只比不做Cache好7%左右,但是内存却多用了20g,并不是特别划算;

  • executor_memory为6g时,可以全部Cache住原始训练数据,性能较优,GC占比较小,但是比不用Cache要多用40g内存,有些代价。

一般来说,当我们内存不够时,可以选择MEMORY_AND_DISK的缓存方式,但是测试发现MEMORY_AND_DISK的缓存效果并不是特别好,从测试数据来看,还不如直接使用DISK_ONLY的缓存方式,MEMORY_AND_DISK的缓存方式带来的GC开销非常大,可能是因为每次都尽可能地Cache数据到内存,不够再Spill到磁盘,同时引发频繁GC。

交叉验证测试

为了排除偶然性,拿 BigDataBenchmark 中的 PageRank 算法进行测试,分别测试各种Cache方式下整体性能,在保证每种Cache方式下都能100%Cache住数据的情况下,得到如下测试结果。

总结

Spark的Cache并不是总是会加速任务运行,Cache的方式不同,对任务产生的影响不同。并不是能用内存Cache就用内存,而是要考虑是否有充足的内存Cache住你的数据,否则可能适得其反。在内存充足时,优先考虑使用MEMORY_ONLY,但是当内存不足以Cache住你的中间数据时,建议直接用MEMORY_ONLY_SER(spark.rdd.compress=true)DISK_ONLY而不要用MEMORY_AND_DISK,MEMORY_AND_DISK可能会频繁地触发Spark的内存管理,增加Spill以及GC的开销。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spark性能测试报告与调优参数
1、代码中尽量避免group by函数,如果需要数据聚合,group形式的为rdd.map(x=>(x.chatAt(0),x)).groupbyKey().mapValues((x=>x.toSet.size)).collection() 改为 rdd.map(x=>(x.chatAt(0),x)).countByKey();或进行reduceByKey,效率会提高3倍。
用户3003813
2018/09/06
2K0
Spark性能测试报告与调优参数
Spark常见20个面试题(含大部分答案)
1、什么是宽依赖,什么是窄依赖?哪些算子是宽依赖,哪些是窄依赖? 窄依赖就是一个父RDD分区对应一个子RDD分区,如map,filter 或者多个父RDD分区对应一个子RDD分区,如co-partioned join
全栈程序员站长
2022/09/30
3K0
Spark常见20个面试题(含大部分答案)
Spark Persist,Cache以及Checkpoint
下面我们将了解每一个的用法。重用意味着将计算和数据存储在内存中,并在不同的算子中多次重复使用。通常,在处理数据时,我们需要多次使用相同的数据集。例如,许多机器学习算法(如K-Means)在生成模型之前会对数据进行多次迭代。如果处理过程中的中间结果没有持久存储在内存中,这意味着你需要将中间结果存储在磁盘上,这会降低整体性能,因为与RAM相比,从磁盘访问数据就像是从隔壁或从其他国家获取内容。下面我们看一下在不同存储设备上的访问时间:
smartsi
2019/08/07
2.1K0
2018-11-07 Spark应用程序开发参数调优深入剖析-Spark商业调优实战
本套系列博客从真实商业环境抽取案例进行总结和分享,并给出Spark商业应用实战指导,请持续关注本套博客。版权声明:本套Spark商业应用实战归作者(秦凯新)所有,禁止转载,欢迎学习。
Albert陈凯
2018/12/07
4610
【技术博客】Spark性能优化指南——基础篇
前言 在大数据计算领域,Spark已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark的功能涵盖了大数据领域的离线批处理、SQL类处理、流式/实时计算、机器学习、图计算等各种不同类型的计算操作,应用范围与前景非常广泛。在美团•大众点评,已经有很多同学在各种项目中尝试使用Spark。大多数同学(包括笔者在内),最初开始尝试使用Spark的原因很简单,主要就是为了让大数据计算作业的执行速度更快、性能更高。 然而,通过Spark开发出高性能的大数据计算作业,并不是那么简单的。如果没有对Spark作业进行合
美团技术团队
2018/03/12
1.8K0
【技术博客】Spark性能优化指南——基础篇
Spark系列 - (6) Spark 内存管理
在执行Spark的应用程序时,Spark集群会启动Driver和Executor两种JVM线程,前者为主控进程,负责创建Spark上下文,提交Spark作业(Job),并将作业转化为计算任务(Task),在各个Executor进程间协调任务的调度,后者负责在工作节点上执行具体的计算任务,并将结果返回给Driver,同时为需要持久化的RDD提供存储功能。由于Driver的内存管理相对来说较为简单,本文主要对Executor的内存的管理进行分析,上下文中的Spark内存均特指Executor的内存。
码老思
2023/10/19
8850
Spark系列 - (6) Spark 内存管理
2021年大数据Spark(十七):Spark Core的RDD持久化
在实际开发中某些RDD的计算或转换可能会比较耗费时间,如果这些RDD后续还会频繁的被使用到,那么可以将这些RDD进行持久化/缓存,这样下次再使用到的时候就不用再重新计算了,提高了程序运行的效率。
Lansonli
2021/10/09
4410
【Spark重点难点】你的代码跑起来谁说了算?(内存管理)
这节课我们要讲的是Spark中的 【内存模型】,也就是决定我们Spark代码运行所需要的资源信息。
王知无-import_bigdata
2021/12/08
8500
【Spark重点难点】你的代码跑起来谁说了算?(内存管理)
从 PageRank Example 谈 Spark 应用程序调优
本文阐述了大数据处理框架Spark在大数据处理过程中的优势,包括处理速度快、易扩展、高可用以及支持多种编程语言等特点。同时,文章还介绍了Spark在大数据处理中的数据倾斜问题、高阶函数、广播变量、算子驱动等优化点。最后,本文总结了Spark在大数据处理中的资源调度、数据倾斜、广播变量等方面的技术实践。
涂小刚
2017/07/18
3.4K7
从 PageRank Example 谈 Spark 应用程序调优
Spark入门必读:核心概念介绍及常用RDD操作
导读:Spark是由加州大学伯克利分校AMP实验室开源的分布式大规模数据处理通用引擎,具有高吞吐、低延时、通用易扩展、高容错等特点。Spark内部提供了丰富的开发库,集成了数据分析引擎Spark SQL、图计算框架GraphX、机器学习库MLlib、流计算引擎Spark Streaming。
IT阅读排行榜
2019/05/10
7520
Spark入门必读:核心概念介绍及常用RDD操作
如何应对大数据分析工程师面试Spark考察,看这一篇就够了
可以说Spark几乎是企业搭建大数据平台必备组件,作为数据分析工程师在工作中执行程序、调试程序、查询数据都会和Spark打交道,所以对Spark知识的考察也就顺理成章了。
AI科技大本营
2019/09/03
1.8K0
Spark基础
1.Spark 使用DAG 调度器、查询优化器和物理执行引擎,能够在批处理和流数据获得很高的性能。2.spark把运算的中间数据(shuffle阶段产生的数据)存放在内存,迭代计算效率更高,mapreduce的中间结果需要落地,保存到磁盘;3.Spark计算框架对内存的利用和运行的并行度比mapreduce高,Spark运行容器为executor,内部ThreadPool中线程运行一个Task,mapreduce在线程内部运行container,container容器分类为MapTask和ReduceTask。Spark程序运行并行度高;
857技术社区
2022/05/17
5000
Spark基础
Spark重要知识汇总
RDD(Resilient Distributed Dataset)弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合。
Lansonli
2024/08/02
4680
Spark重要知识汇总
用PySpark开发时的调优思路(上)
这一小节的内容算是对pyspark入门的一个ending了,全文主要是参考学习了美团Spark性能优化指南的基础篇和高级篇内容,主体脉络和这两篇文章是一样的,只不过是基于自己学习后的理解进行了一次总结复盘,而原文中主要是用Java来举例的,我这边主要用pyspark来举例。文章主要会从4个方面(或者说4个思路)来优化我们的Spark任务,主要就是下面的图片所示:(本小节只写了开发习惯调优哈)
Sam Gor
2021/06/25
1.6K0
用PySpark开发时的调优思路(上)
Spark性能调优02-代码调优
代码调优,就是要让大家了解以下一些Spark基本开发原则,包括:RDD lineage设计、算子的合理使用、特殊操作的优化等。在开发过程中,时时刻刻都应该注意以上原则,并将这些原则根据具体的业务以及实际的应用场景,灵活地运用到自己的Spark作业中。
CoderJed
2018/09/13
8110
Spark性能调优02-代码调优
【大数据】Spark的硬件配置
从MapReduce的兴起,就带来一种思路,就是希望通过大量廉价的机器来处理以前需要耗费昂贵资源的海量数据。这种方式事实上是一种架构的水平伸缩模式——真正的以量取胜。毕竟,以现在的硬件发展来看,CPU的核数、内存的容量以及海量存储硬盘,都慢慢变得低廉而高效。然而,对于商业应用的海量数据挖掘或分析来看,硬件成本依旧是开发商非常关注的。当然最好的结果是:既要马儿跑得快,还要马儿少吃草。 Spark相对于Hadoop的MapReduce而言,确乎要跑得迅捷许多。然而,Spark这种In-Memory的计算模式,是
张逸
2018/03/07
2.5K0
【大数据】Spark的硬件配置
Spark的性能调优
下面这些关于Spark的性能调优项,有的是来自官方的,有的是来自别的的工程师,有的则是我自己总结的。
加米谷大数据
2018/07/25
2.3K0
Spark的性能调优
Apache Spark 内存管理详解(下)
弹性分布式数据集(RDD)作为Spark最根本的数据抽象,是只读的分区记录(Partition)的集合,只能基于在稳定物理存储中的数据集上创建,或者在其他已有的RDD上执行转换(Transformation)操作产生一个新的RDD。转换后的RDD与原始的RDD之间产生的依赖关系,构成了血统(Lineage)。凭借血统,Spark保证了每一个RDD都可以被重新恢复。但RDD的所有转换都是惰性的,即只有当一个返回结果给Driver的行动(Action)发生时,Spark才会创建任务读取RDD,然后真正触发转换的执行。
大数据技术架构
2019/08/16
1.2K0
Apache Spark 内存管理详解(下)
大数据入门:Spark持久化存储策略
持久化存储是Spark非常重要的一个特性,通过持久化存储,提升Spark应用性能,以更好地满足实际需求。而Spark的持久化存储,根据不同的需求现状,可以选择不同的策略方案。今天的大数据入门分享,我们就来具体讲讲Spark持久化存储策略。
成都加米谷大数据
2020/12/14
1.9K0
大数据入门:Spark持久化存储策略
Spark persist MEMORY_AND_DISK & DISK_ONLY
测试思路,3T 的模型,如果要 cache 住,50G 的 Executor,至少需要 3T * 1024G/T / 50G * 2 = 125个左右。(乘以2是因为 Executor 的 JVM 默认大概会用 50% 的 Host 内存)。测试中使用20个。
runzhliu
2020/08/05
1.4K0
推荐阅读
相关推荐
Spark性能测试报告与调优参数
更多 >
交个朋友
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入架构与运维趋势交流群
技术趋势前瞻 架构演进方向
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档