Prime_DSC_MentionCalcSpark性能調優

Prime_DSC_MentionCalcSpark系統簡介


實現功能 : 根據條件(siteId, startTime, endTime, campaignId, folder)從HBase數據源中讀取文本數據作爲輸入,把提交的關鍵詞作爲條件,輸出在文本中關鍵詞提及的次數


存在問題 : 對於大數據量的計算時間較長.


解決思路 : 

  1. 把HBase結果反射成TweetBean修改成TweetBean的setXXX的方式構造TweetBean

    1. 當有5W條數據,通過反射轉成TweetBean需要60s,通過TweetBean的setXX的方法需要20s

  2. 把讀取HBase的所有字段改成讀取HBase的需要的字段

    1. 當有5W條數據,讀取所有字段時需要60s,讀取需要的字段需要25s

  3. 從UC取DC數據時,不使用map函數,替換成mapPartition函數,這樣使用可以從HBase批量取數據,僅需要一次HBase連接即可

  4. 存儲計算結果,使用foreachPartition函數. 當遍歷Iterator時不是每次在循環裏面都存儲計算結果,而是在循環外面維護隊列,批量存儲結果

  5. 根據Spark集羣資源,合理利用Spark集羣的資源,如資源越多,集羣計算能力越強.而比較合理的機器資源和任務並行度的關係是 : 任務數 = 機器CPU核數 * (2 或者 3), 所以設置RDD的分區數爲集羣CPU核數 * 2

  6. 從HBase讀取數據的並行度跟表的region數相關.默認情況下,建表時只有一個region,而當region越來越大時,需要split成兩個region,region越多split的閾值越大,導致很多數據都存在一個region中.此時如果需要查詢一張表,假設該表有5個region,則會有5個線程同時查詢5個region的數據,但是如果其中一個region很大,是其他region的10倍,則該region的讀取是其他region讀取性能的10倍,導致整個任務的delay. 解決該問題的方法可以先通過預分區和對rowkey使用hash/MD5等算法使數據均勻的分佈在各個region,這樣在讀取數據時可以根據數據均勻分配而更好的併發讀取數據.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章