Spark效能調優(五)

2021-12-29 19:50:18 字數 2244 閱讀 7134

一:效能優化之資料本地性

1,資料本地性對分布式系統的效能而言是一件最為重要的事情(之一),程式執行本身包含**和資料兩部分,單機版本一般情況下很少資料本地性的問題(因為資料在本地),但是對於單機版本的程式由於資料本地性有process_local和node_local之分,所以我們還是盡量的讓資料處於process_local;spark作為分布式系統更加注意資料本地性,在spark中資料本地性分為process_local(同乙個jvm)、node_local(同乙個node,比如資料在hdfs上,但是和**在同乙個node)、no_pref、rack_local(不在同乙個server,但在同乙個機架)、any(資料可能在任何地方,包括在其他網路環境中;例如說百度雲,資料和計算集群不在同樣的集群中,此時就是any一種表現);

2,對於any的情況,預設狀態下效能會非常低下,此時強烈建議使用tachyon;例如在百度雲上為了確保計算速度,就在計算集群和儲存集群之間加入了tachyon,通過tachyon來從遠端抓取資料,而spark基於tachyon來進行計算,這就更好的滿足了資料本地性;

3,如果資料是process_local,但是此時並沒有空閒的core來執行我們的task,此時task就要等待,例如等待3000ms,3000ms內如果能夠執行待執行的task則直接執行,如果超過了3000ms,此時資料本地性就要退而求其次採用node_local,同樣的道理node_local也會等待的超時時間,以此類推…

4,如何配置locality呢?可以統一採用spark.locality.wait來設定(例如設定5000ms),當然你可以分別設定spark.locality.wait.process,spark.locality.wait.node, spark.locality.wait.rack等;一般的具體設定是locality優先順序越高則可以設定越高的等待超時時間;

二:rdd的自定義(以spark on hbase為例)

1,第一步是定義rdd.getpartitions的實現:

a)createrelation具體確定hbase的鏈結方式和具體訪問的表;

b)然後通過hbase的api來獲取region的list;

c)可以過濾出有效地資料;

d)最後返回region的array[partition],也就是說乙個partition處理乙個region的資料,為更佳的資料本地性打下基礎;

2,第二步是rdd.getpreferredlocations

a)根據split包括的region資訊來確定region具體在什麼節點上,這樣task在排程的時候就可以優先被排程到region所在的機器上,最大化的提高資料本地性;

3,第三步是rdd.compute

a) 根據split中的region等資訊呼叫hbase的api來進行操作(主要是查詢)

4,spark on hbase開源實現

1.作業:從網路上查詢rdd封裝mysql的具體實現

在spark中提供了乙個jdbcrdd類,該rdd就是讀取jdbc中的資料並轉換成rdd,之後我們就可以對該rdd進行各種的操作。我們先看看該類的建構函式:

jdbcrdd[t: classtag](

sc: sparkcontext,

getconnection: () => connection,

sql: string,

lowerbound: long,

upperbound: long,

numpartitions: int,

maprow: (resultset) => t = jdbcrdd.resultsettoobjectarray _)這個類帶了很多引數,關於這個函式的各個引數的含義,我覺得直接看英文就可以很好的理解,如下:

1、getconnection 返回乙個已經開啟的結構化資料庫連線,jdbcrdd會自動維護關閉。

2、sql 是查詢語句,此查詢語句必須包含兩處佔位符?來作為分割資料庫resulset的引數,例如:」select title, author from books where ? < = id and id <= ?」

3、lowerbound, upperbound, numpartitions 分別為第

一、第二佔位符,partition的個數。例如,給出lowebound 1,upperbound 20, numpartitions 2,則查詢分別為(1, 10)與(11, 20)

4、maprow 是轉換函式,將返回的resultset轉成rdd需用的單行資料,此處可以選擇array或其他,也可以是自定義的case class。預設的是將resultset 轉換成乙個object陣列。

spark 效能調優

核心調優引數如下 num executors executor memory executor cores driver memory spark.default.parallelizm spark.storage.memoryfraction spark.shuffle.memoryfractio...

Spark效能調優

日常工作使用spark處理業務問題中不可避免的都會碰到需要對spark的效能進行調優的情況,這裡就介紹一下對spark的效能調優。1.調節記憶體分配 因為在spark中堆記憶體被劃分為兩塊,一塊是給rdd的cache和persist操作rdd資料快取使用的,另一塊是給spark運算元函式使用的,函式...

Spark效能調優 JVM調優

通過一張圖讓你明白以下四個問題 1.jvm gc機制,堆記憶體的組成 2.spark的調優為什麼會和jvm的調優會有關聯?因為scala也是基於jvm執行的語言 3.spark中oom產生的原因 4.如何在jvm這個層面上來對spark進行調優 補充 spark程式執行時 jvm堆記憶體分配比例 r...