一:效能優化之資料本地性
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...