1. 程式人生 > >Spark效能優化指南一——基礎篇

Spark效能優化指南一——基礎篇

1.Spark調優有哪些原則? 2.Spark作業原理是什麼?

3.怎樣進行引數調優?

前言

在大資料計算領域,Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大資料領域的離線批處理、SQL類處理、流式/實時計算、機器學習、圖計算等各種不同型別的計算操作,應用範圍與前景非常廣泛。在美團•大眾點評,已經有很多同學在各種專案中嘗試使用Spark。大多數同學(包括筆者在內),最初開始嘗試使用Spark的原因很簡單,主要就是為了讓大資料計算作業的執行速度更快、效能更高。
然而,通過Spark開發出高效能的大資料計算作業,並不是那麼簡單的。如果沒有對Spark作業進行合理的調優,Spark作業的執行速度可能會很慢,這樣就完全體現不出Spark作為一種快速大資料計算引擎的優勢來。因此,想要用好Spark,就必須對其進行合理的效能優化。
Spark的效能調優實際上是由很多部分組成的,不是調節幾個引數就可以立竿見影提升作業效能的。我們需要根據不同的業務場景以及資料情況,對Spark作業進行綜合性的分析,然後進行多個方面的調節和優化,才能獲得最佳效能。
筆者根據之前的Spark作業開發經驗以及實踐積累,總結出了一套Spark作業的效能優化方案。整套方案主要分為開發調優、資源調優、資料傾斜調優、shuffle調優幾個部分。開發調優和資源調優是所有Spark作業都需要注意和遵循的一些基本原則,是高效能Spark作業的基礎;資料傾斜調優,主要講解了一套完整的用來解決Spark作業資料傾斜的解決方案;shuffle調優,面向的是對Spark的原理有較深層次掌握和研究的同學,主要講解了如何對Spark作業的shuffle執行過程以及細節進行調優。
本文作為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,進而增加了作業的效能開銷。
一個簡單的例子

[Python] 純文字檢視 複製程式碼 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 //需要對名為“hello.txt”的HDFS檔案進行一次map操作,再進行一次reduce操作。也就是說,需要對一份資料執行兩次運算元操作。 //錯誤的做法:對於同一份資料執行多次運算元操作時,建立多個RDD。 //這裡執行了兩次textFile方法,針對同一個HDFS檔案,建立了兩個RDD出來,然後分別對每個RDD都執行了一個運算元操作。
//這種情況下,Spark需要從HDFS上兩次載入hello.txt檔案的內容,並建立兩個單獨的RDD;第二次載入HDFS檔案以及建立RDD的效能開銷,很明顯是白白浪費掉的。 rdd1.map(...) rdd2.reduce(...) //正確的用法:對於一份資料執行多次運算元操作時,只使用一個RDD。 //這種寫法很明顯比上一種寫法要好多了,因為我們對於同一份資料只建立了一個RDD,然後對這一個RDD執行了多次運算元操作。 //但是要注意到這裡為止優化還沒有結束,由於rdd1被執行了兩次運算元操作,第二次執行reduce操作的時候,還會再次從源頭處重新計算一次rdd1的資料,因此還是會有重複計算的效能開銷。 //要徹底解決這個問題,必須結合“原則三:對多次使用的RDD進行持久化”,才能保證一個RDD被多次使用時只被計算一次。 rdd1.map(...) rdd1.reduce(...)


原則二:儘可能複用同一個RDD
除了要避免在開發過程中對一份完全相同的資料建立多個RDD之外,在對不同的資料執行運算元操作時還要儘可能地複用一個RDD。比如說,有一個RDD的資料格式是key-value型別的,另一個是單value型別的,這兩個RDD的value資料是完全一樣的。那麼此時我們可以只使用key-value型別的那個RDD,因為其中已經包含了另一個的資料。對於類似這種多個RDD的資料有重疊或者包含的情況,我們應該儘量複用一個RDD,這樣可以儘可能地減少RDD的數量,從而儘可能減少運算元執行的次數。
一個簡單的例子
[Python] 純文字檢視 複製程式碼 ?
01 02 03

相關推薦

Spark效能優化指南——基礎

1.Spark調優有哪些原則? 2.Spark作業原理是什麼? 3.怎樣進行引數調優? 前言 在大資料計算領域,Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大資料領域的離線批處理、SQL類處理、流式/實時計

Spark效能優化指南:高階

前言 繼基礎篇講解了每個Spark開發人員都必須熟知的開發調優與資源調優之後,本文作為《Spark效能優化指南》的高階篇,將深入分析資料傾斜調優與shuffle調優,以解決更加棘手的效能問題。 資料傾斜調優 調優概述 有的時候,我們可能會遇到大資料計算中一個最棘手

Spark效能優化指南——基礎

前言 在大資料計算領域,Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大資料領域的離線批處理、SQL類處理、流式/實時計算、機器學習、圖計算等各種不同型別的計算操作,應用範圍與前景非常廣泛。在美團•大眾點評,已經有很多同學在各種專案中嘗試使用Spark。大多數同學(包括筆

Spark效能優化指南——高階(轉載)

前言 繼基礎篇講解了每個Spark開發人員都必須熟知的開發調優與資源調優之後,本文作為《Spark效能優化指南》的高階篇,將深入分析資料傾斜調優與shuffle調優,以解決更加棘手的效能問題。 資料傾斜調優 調優概述 有的時候,我們可能會遇到大資料計算中一個最棘手的問題——資料傾斜,此時Spark

【轉載】Spark效能優化指南——高階

前言 繼基礎篇講解了每個Spark開發人員都必須熟知的開發調優與資源調優之後,本文作為《Spark效能優化指南》的高階篇,將深入分析資料傾斜調優與shuffle調優,以解決更加棘手的效能問題。 資料傾斜調優 調優概述 有的時候,我們可能會遇到大資料計算中一個最棘手的問題——資料傾斜,此時Spark作業

美團點評 spark效能優化指南-高階

前言: 最近開始玩spark,公司分享了一些不錯的spark效能優化學習,故在此分享: http://tech.meituan.com/spark-tuning-pro.html 前言 繼基礎篇講解了每個Spark開發人員都必須熟知的開發調優與資源調優之後,

Spark效能優化指南——初級

原文來我的公眾號:Spark效能優化指南——初級篇 一. Spark作業原理 我們使用spark-submit提交一個Spark作業之後,這個作業就會啟動一個對應的Driver程序。該程序是向叢集管理器(Yarn,K8s)申請執行Spark作業需要使用的資源,這裡的資源指的就是Executor程序。 YARN

Spark效能優化點(

1.分配更多的資源    1.1.增加executor     1.2.增加每個executor的cpu core           增加executor的並行能力,一個cpu core執行一個t

Spark效能優化——基礎

開發調優 調優概述 Spark效能優化的第一步,就是要在開發Spark作業的過程中注意和應用一些效能優化的基本原則。開發調優,就是要讓大家瞭解以下一些Spark基本開發原則,包括:RDD lineage設計、運算元的合理使用、特殊操作的優化等。在開發過程中,時時

Spark效能優化:資源調優

Spark效能優化 篇一 :資源調優      所謂的Spark資源引數調優,其實主要就是對Spark執行過程中各個使用資源的地方,通過調節各種引數,來優化資源使用的效率,從而提升Spark作業的執行效能。以下引數就是Spark中主要的資源引數

Spark性能優化指南——高級

stat 參數調優 5% 每一個 寫性能 nes fix 單獨 png Spark性能優化指南——高級篇 [TOC] 前言 繼基礎篇講解了每個Spark開發人員都必須熟知的開發調優與資源調優之後,本文作為《Spark性能優化指南》的高級篇,將深入分析數據傾斜調

Spark效能優化:資源調優

前言 在開發完Spark作業之後,就該為作業配置合適的資源了。Spark的資源引數,基本都可以在spark-submit命令中作為引數設定。很多Spark初學者,通常不知道該設定哪些必要的引數,以及如何設定這些引數,最後就只能胡亂設定,甚至壓根兒不設定。資源引數設定的不合理,可能會導致沒

Spark效能優化:開發調優

      在大資料計算領域,Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大資料領域的離線批處理、SQL類處理、流式/實時計算、機器學習、圖計算等各種不同型別的計算操作,應用範圍與前景非常廣泛。   然而,通過Spark開發出高效能的大

Spark效能優化:資源調優

在開發完Spark作業之後,就該為作業配置合適的資源了。Spark的資源引數,基本都可以在spark-submit命令中作為引數設定。很多Spark初學者,通常不知道該設定哪些必要的引數,以及如何設定這些引數,最後就只能胡亂設定,甚至壓根兒不設定。資源引數設定的不合理,可能會

基於Spark UI效能優化與除錯——初級

Spark有幾種部署的模式,單機版、叢集版等等,平時單機版在資料量不大的時候可以跟傳統的java程式一樣進行斷電除錯、但是在叢集上除錯就比較麻煩了...遠端斷點不太方便,只能通過Log的形式進行資料分析,利用spark ui做效能調整和優化。 那麼本篇就介紹下如何利用Ui做效能分析,因為本人的經驗也不是很

Spark效能優化——高階

(資料傾斜部分處理可以學習下) 繼基礎篇講解了每個Spark開發人員都必須熟知的開發調優與資源調優之後,本文作為《Spark效能優化指南》的高階篇,將深入分析資料傾斜調優與shuffle調優,以解決更加棘手的效能問題。 資料傾斜調優 調優概述 有的時候,我們可能會遇到大資料計算中一個最棘手的

[看圖說話] 基於Spark UI效能優化與除錯——初級

Spark有幾種部署的模式,單機版、叢集版等等,平時單機版在資料量不大的時候可以跟傳統的java程式一樣進行斷電除錯、但是在叢集上除錯就比較麻煩了...遠端斷點不太方便,只能通過Log的形式進行資料分析,利用spark ui做效能調整和優化。 那麼本篇就介紹下如何利用Ui做效

Spark效能優化三:資料傾斜調優

方案實現思路:這個方案的核心實現思路就是進行兩階段聚合。第一次是區域性聚合,先給每個key都打上一個隨機數,比如10以內的隨機數,此時原先一樣的key就變成不一樣的了,比如(hello, 1) (hello, 1) (hello, 1) (hello, 1),就會變成(1_hello, 1) (1_hello

Spark效能優化四:shuffle調優

Spark效能優化篇四:shuffle調優 shuffle調優 調優概述       大多數Spark作業的效能主要就是消耗在了shuffle環節,因為該環節包含了大量的磁碟IO、序列化、網路資料

Spark效能優化二: 開發調優

Spark效能優化 篇二 : 開發調優 1、前言        在大資料計算領域,Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大資料領域的離線批處理、SQL類處理、流式/實時計