一:效能優化之資料本地性
1、資料本地性對分布式系統的效能而言是一件最為重要的情況之一,程式執行本身飲食**和資料兩部分,單機版本一般情況下很少考慮資料本地性的問題(因為資料在本地),但是對於單機版本的程式,由於資料本性有process_local和node_local之分, 所以,盡量讓資料處於process_local級別。spark作為分布式系統,更加注重資料本地性,在spark中資料本地性分為process_local、node_local、no_pref、rack_local、any(資料可能在任何地方,包括在其它網路環境中,例如百度雲,資料和計算集群不在同一集群中,此時就是any的一種表現)等;
2、對於any的情況,預設狀態下效能會非常低,此時強烈建議使用tachyon。例如在百度雲上,為了確保計算速度,就在計算集群和儲存集群之間加入tachyon,通過tachyon來從遠端抓取資料,而spark基於tachyon來進行計算,這就更好的滿足了資料本地性。
3、如果資料是process_local,但是此時並沒有空閒的core來執行task,此時task就要等待,例如等待3000ms,如果在該時間內獲取core則直接執行,如果超過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為例)
第一步,定義rdd.getpartitions的實現
1)createrelation具體確定hbase的鏈結方式和具體訪問的表;
2)通過hbase的api來獲取region的list;
3)過濾出有效的資料;
4)返回region的array[partition],也就是說乙個partition處理乙個region的資料,為更佳的資料本地性打下基礎。
第二步,rdd.getpreferredlocations
1)根據split飲食的region資訊來確定region具體在什麼節點上,這樣task在排程時就可以優先被 排程到region所在的機器上,最大化的提高資料本地性;
第三步,rdd.compute(split: partition, context: taskcontext)
1)根據split中的region等資訊呼叫hbase的api來進行操作(主要是查詢)
Spark資料本地性
1 檔案系統本地性 第一次執行時資料不在記憶體中,需要從hdfs上取,任務最好執行在資料所在的節點上 2 記憶體本地性 第二次執行,資料已經在記憶體中,所有任務最好執行在該資料所在記憶體的節點上 3 lru置換 如果資料只快取在記憶體中而並沒有快取到磁碟上,此時資料被置換出記憶體,則從hdfs上讀取...
Spark資料本地性
1 檔案系統本地性 第一次執行時資料不在記憶體中,需要從hdfs上取,任務最好執行在資料所在的節點上 2 記憶體本地性 第二次執行,資料已經在記憶體中,所有任務最好執行在該資料所在記憶體的節點上 3 lru置換 如果資料只快取在記憶體中而並沒有快取到磁碟上,此時資料被置換出記憶體,則從hdfs上讀取...
(十七)TableView的本地效能優化
面試中常常會問tableview的效能優化。tableview只會載入能看到的cell,每當有乙個cell進入視野範圍內,就會呼叫。存在著記憶體隱患,如果使用者拖動的很快,所以記憶體會飆公升的很快,因此要針對cell的返回方法上進行效能優化。優化方案 系統呼叫這個方法的時候就是為了得到cell,一般...