Spark 性能优化指南——基础篇
李雪蕤·2016-04-29 14:00
前言
在大数据计算领域,Spark 已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark 的
功能涵盖了大数据领域的离线批处理、SQL 类处理、流式/实时计算、机器学习、图计算等各种
不同类型的计算操作,应用范围与前景非常广泛。在美团 大众点评,已经有很多同学在各种项•
目中尝试使用 Spark。大多数同学(包括笔者在内),最初开始尝试使用 Spark 的原因很简单,
主要就是为了让大数据计算作业的执行速度更快、性能更高。
然而,通过 Spark 开发出高性能的大数据计算作业,并不是那么简单的。如果没有对 Spark
作业进行合理的调优,Spark 作业的执行速度可能会很慢,这样就完全体现不出 Spark 作为一
种快速大数据计算引擎的优势来。因此,想要用好 Spark,就必须对其进行合理的性能优化。
Spark 的性能调优实际上是由很多部分组成的,不是调节几个参数就可以立竿见影提升作业性
能的。我们需要根据不同的业务场景以及数据情况,对 Spark 作业进行综合性的分析,然后进
行多个方面的调节和优化,才能获得最佳性能。
笔者根据之前的 Spark 作业开发经验以及实践积累,总结出了一套 Spark 作业的性能优化方
案。整套方案主要分为开发调优、资源调优、数据倾斜调优、shue 调优几个部分。开发调
优和资源调优是所有 Spark 作业都需要注意和遵循的一些基本原则,是高性能 Spark 作业的
基础;数据倾斜调优,主要讲解了一套完整的用来解决 Spark 作业数据倾斜的解决方案;
shue 调优,面向的是对 Spark 的原理有较深层次掌握和研究的同学,主要讲解了如何对
Spark 作业的 shue 运行过程以及细节进行调优。
本文作为 Spark 性能优化指南的基础篇,主要讲解开发调优以及资源调优。
开发调优
调优概述
Spark 性能优化的第一步,就是要在开发 Spark 作业的过程中注意和应用一些性能优化的基本
原则。开发调优,就是要让大家了解以下一些 Spark 基本开发原则,包括:RDD lineage 设
计、算子的合理使用、特殊操作的优化等。在开发过程中,时时刻刻都应该注意以上原则,并
将这些原则根据具体的业务以及实际的应用场景,灵活地运用到自己的 Spark 作业中。
原则一:避免创建重复的 RDD
通常来说,我们在开发一个 Spark 作业时,首先是基于某个数据源(比如 Hive 表或 HDFS 文
件)创建一个初始的 RDD;接着对这个 RDD 执行某个算子操作,然后得到下一个 RDD;以此
类推,循环往复,直到计算出最终我们需要的结果。在这个过程中,多个 RDD 会通过不同的
算子操作(比如 map、reduce 等)串起来,这个“RDD 串”,就是 RDD lineage,也就是
“RDD 的血缘关系链”。
我们在开发过程中要注意:对于同一份数据,只应该创建一个 RDD,不能创建多个 RDD 来代
表同一份数据。
一些 Spark 初学者在刚开始开发 Spark 作业时,或者是有经验的工程师在开发 RDD lineage
极其冗长的 Spark 作业时,可能会忘了自己之前对于某一份数据已经创建过一个 RDD 了,从
而导致对于同一份数据,创建了多个 RDD。这就意味着,我们的 Spark 作业会进行多次重复
计算来创建多个代表相同数据的 RDD,进而增加了作业的性能开销。
一个简单的例子
// 需要对名为“hello.txt”的 HDFS 文件进行一次 map 操作,再进行一次 reduce 操作。也
就是说,需要对一份数据执行两次算子操作。
// 错误的做法:对于同一份数据执行多次算子操作时,创建多个 RDD。
评论0
最新资源