1. 程式人生 > >sparkstreaming效能調優記錄

sparkstreaming效能調優記錄

場景:
RDD<JSONObject>,JSONObject裡面有TBNAME欄位和PAYLOAD欄位,分別代表表名和原始日誌內容
需要1.在原始內容里加入系統時間欄位 2.按表名取系統時間逆序取前100條入庫
30s時間視窗,處理2w條資料;4張表,但打的資料均為1張表的資料
以下我說明的時間都是有資料的表的處理時間(1張表有資料處理,在過其他表時也需要filter表名,需要耗時;所以總體的批處理時間會比我描述的時間要大)


資源:executor-cores:4,core-memory:2g,driver-memory:512m(沒辦法,資源要省著用,目前這個資源對執行環境而言已經算奢侈了)

PS:機器為虛擬機器,所以這裡的核的計算能力與實體機的計算能力是不能相提並論的(是一臺實體機虛擬了5個虛擬機器組裝的叢集)



a.實現方式
for迴圈表名->按表名filter->並map(取PAYLOAD欄位)->takeOrder(num[取的條數],comparator[按時間逆序])
結果:27~30+s


b.實現方式
filter(按需要取的所有表名)->mapToPair(Tuple2<表名,PAYLOADJSONObject[已經加上系統時間欄位]>)->groupByKey(得到JavaRDD<表名,Iterator>)->mapToPair(從Iterator取出JSONObject按系統時間排序,sublist得到需要的數目的JSONObject)->collectMap
結果:會導致Java Heap OutOfMemory


c.實現方式
filter(按需要取的所有表名)->mapToPair(Tuple2<表名,PAYLOADJSONObject[已經加上系統時間欄位]>)->for迴圈表名->JavaPairRDD按key filter->map只取value返回,得到JavaRDD<JSONObject[PAYLOAD]>->takeOrder
結果:47~1min+


以上RDD均是JavaRDD<JSONObject>或者JavaPairRDD<String,JSONObject>


d.實現方式
filter(按需要取的所有表名)-> 並map(取PAYLOAD欄位;組成string:tablaname#systemtime#BASE64.encode(JSONSTRING)(PAYLOAD含有SYSTEM欄位),成為JavaRDD<byte[]>)->for表名->filter(按#第一個欄位過濾)->takeOrder(按#第二個欄位排序)->得到前100的list->按#第三個欄位生成List<JSONObject>
場景:11w+資料量(應該是之前資料量的5、6倍)
,處理時間 幾秒~十幾秒


雖然有本質的提高,但目前仍不滿足要求;還應該繼續除錯


e.實現方式(採用d的實現方式的基礎上),同時再進行優化
我們job使用的cores和kafka的partition的數目相差比較大,cores=4,parttions=16
所以考慮在DStream transform時,對於rdd進行coalesce(cores,false)---即對rdd進行重新分割槽保證和cores數目相同,而且shuffle=false,因為是partition的合併,不需要shuffle

場景:11w+資料量(應該是之前資料量的5、6倍),處理時間 5秒~7秒;此時記錄批處理時間比較有意義,批處理時間為11~15左右(4張表)

另外,還嘗試了用多執行緒分別過濾4張表,takeOrder併入庫;但由於機器的cores計算能力並不強,所以反而在併發執行時每個JOB的執行時間變長,併發執行完的整體時間和目前的執行整體時間差不多。所以在cores不多,且機器運算能力不強的情況下,不考慮使用此方法。

真實場景下資料會分散多個表的資料,每個Job的壓力會相應減少,執行時間會比較目前的執行時間短。總體時間也許短或者與現在一致。

f.實現方式(在d+e的基礎上)
mapPartitions(得到的Iterator按表名過濾,並取每張表時間最新的100條放入list中)[理論上每張表的100條應該就等於表在每個分割槽最新100條再取100條]->for迴圈->filter(按#第一個欄位過濾)->takeorder(按第二個欄位排序)->得到前100的list->按#第三個欄位生成list<JSONObject>
目前實驗結果中f方式最好,第一張表的時間較長需要7~9秒,2,3,4表在persist的基礎上取都花費毫秒級的時間,所以總處理時間10秒左右

總結一下:
1.每個表的最新一百條,等於這個表在每個分割槽上取最新一百條之後的集合中再取一百條;這樣就可以降低後面filter和takeorder的資料量
2.JavaRDD<JSONObject>序列化/反序列化代價很大,能用JavaRDD<byte[]>儘量用
3.如果core比較少且core計算能管理不強,縮小分割槽數目減少任務數;因為一個core併發執行多個任務,執行緒之間的切換也會造成耗時

重大發現,之前persist RDD時的觸發action是isempty,isempty判斷會短路判斷(比如第一個分割槽有資料就不再繼續往下判斷),那麼RDD persist的只有1個分割槽,時間又長,而且不是全部分割槽能夠被後續複用;改為rdd.count()==0,判斷完成後,RDD的4個分割槽均可以被複用。後面的takeorder job在使用f方法的情況下4個加起來耗時1秒左右。非常振奮人心,不僅減少了實時監控的耗時,而且這個RDD還可以被後面的氣泡圖和黑白灰用。

截圖留念:


相關推薦

sparkstreaming效能調記錄

場景: RDD<JSONObject>,JSONObject裡面有TBNAME欄位和PAYLOAD欄位,分別代表表名和原始日誌內容 需要1.在原始內容里加入系統時間欄位 2.按表名取系統時間逆序取前100條入庫 30s時間視窗,處理2w條資料;4張表,但打的資料

一次jVM效能調記錄

前言 填別人留下來的坑其實挺無奈的,會被搞的特別煩,特別是我這種要填三四個人留下來的坑的時候,滿滿的都是無奈。 幸好的是填坑也可以選擇一種更能提升自己的方式來填。 這次遇到的一個程式,是一個從kafka消費並且插入mysql的程式,該程式歷經三人之手,頻頻

非同步系統的效能調記錄(redis做訊息佇列)

系統背景: 生產者往redis丟訊息,消費者從redis取訊息傳送 redis使用list作為訊息佇列,佇列數N個 每種接入系統分配2種(傳送,重發),分別3個固定佇列,優先順序高中低,該3個佇列由一個執行緒處理,通過分配的時間片大小去體現優先順序 不同接入系

eclipse效能調的一次記錄

最近因為學習原因,eclipse中外掛越來越多,造成eclipse一次次假死,著實很影響工作效率和心情,有時正是興起,但是造成短片很令人生氣,如果eclipse卡頓或者假死,在電腦配置較不錯的情況下,不要懷疑自己的電腦,嘗試去除錯一下自己的eclipse。   找到eclipse或

1.效能調概覽

介紹 Optimization Overview 優化概述 Optimizing SQL Statements 優化SQL語句 Optimization and Indexes 優化和索引 Optimizing Database Structure 優化資料庫結

深入理解Java虛擬機器總結一虛擬機器效能監控工具與效能調(三)

深入理解Java虛擬機器總結一虛擬機器效能監控工具與效能調優(三) JDK的命令列工具 JDK的視覺化工具 效能調優 JDK的命令列工具 主要有以下幾種: jps (Java Process Status Tool): 虛擬機器程序

【Big Data 每日一題】Spark開發效能調總結

1. 分配資源調優 Spark效能調優的王道就是分配資源,即增加和分配更多的資源對效能速度的提升是顯而易見的,基本上,在一定範圍之內,增加資源與效能的提升是成正比的,當公司資源有限,能分配的資源達到頂峰之後,那麼才去考慮做其他的調優 如何分配及分配哪些資源 在生產環境中,提交spark作

nkv客戶端效能調

此文已由作者張洪簫授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 問題描述 隨著考拉業務的增長和規模的擴大,很多的應用都開始重度依賴快取服務,也就是杭研的nkv。但是在使用過程中,發現服務端壓力並不是特別大的情況下,客戶端的rt卻很高,導致應用在到達一定併發的情況下,服務的質量下降的

ifeve.com 南方《JVM 效能調實戰之:使用阿里開源工具 TProfiler 在海量業務程式碼中精確定位效能程式碼》

https://blog.csdn.net/defonds/article/details/52598018 多次拉取 JStack,發現很多執行緒處於這個狀態:    at jrockit/vm/Allocator.getNewTla(JJ)V(Native Method) 

實時計算 Flink效能調

自動配置調優 實時計算 Flink新增自動調優功能autoconf。能夠在流作業以及上下游效能達到穩定的前提下,根據您作業的歷史執行狀況,重新分配各運算元資源和併發數,達到優化作業的目的。更多詳細說明請您參閱自動配置調優。 首次智慧調優 建立一個作業。如何建立作業請參看快速入門。 上線作業

Hadoop效能調全面總結

一、 Hadoop概述 隨著企業要處理的資料量越來越大,MapReduce思想越來越受到重視。Hadoop是MapReduce的一個開源實現,由於其良好的擴充套件性和容錯性,已得到越來越廣泛的應用。 Hadoop實現了一個分散式檔案系統(Hadoop Distributed File Sys

nginx監控與效能調

監控 nginx有自帶的監控模組,編譯nginx的時候,加上引數 --with-http_stub_status_module #配置指令 ./configure --prefix=/usr/local --user=nginx --group=nginx

Tomcat效能調以及遠端管理(Tomcat manager與psi-probe監控)

tomcat優化的我用到的幾個點: 1.記憶體優化 2.執行緒優化 docs/config/http.html maxConnections acceptCount(配置的太大是沒有意義的) maxThreads minSpareThreads 最小空閒的工作

MySQL 效能調技巧

技巧#1:確定MySQL的最大連線數 對於MySQL的最大連線數,一次最好是傳送5個請求到Web伺服器。對Web伺服器的5個請求中的一部分將用於CSS樣式表,影象和指令碼等資源。由於諸如瀏覽器快取等原因,要獲得準確的MySQL到Web伺服器的請求比率可能很困難; 要想得到一個確切的數字,就需要分

Tomcat8 效能調

1.優化Linux核心及TCP連線 編輯系統配置檔案: vim /etc/sysctl.conf 修改內容如下: 配置 說明 fs.file-max = 655350 系統檔案描述符

JVM效能調監控工具jps、jstack、jstat、jmap、jinfo使用

 現實企業級Java開發中,有時候我們會碰到下面這些問題: OutOfMemoryError,記憶體不足 記憶體洩露 執行緒死鎖 鎖爭用(Lock Contention) Java程序消耗CPU過高 ...... &n

Spark之效能調總結(一)

總結一下spark的調優方案: 一、效能調優   1、效能上的調優主要注重一下幾點:     Excutor的數量     每個Excutor所分配的CPU的數量     每個Excutor所能分配的記憶體量     Driver端分配的記憶體數量   2、如何分配資源     在生產環境中,

Nginx效能調之快取記憶體

Nginx可以快取一些檔案(一般是靜態檔案),減少Nginx與後端伺服器的IO,提高使用者訪問速度。而且當後端伺服器宕機時,Nginx伺服器能給出相應的快取檔案響應相關的使用者請求。 一 Nginx靜態快取基本配置 在tomcat的webapps目錄下建立hello.html,內容

第一章 Java效能調概述

效能概述 看懂程式的效能 一般來說,程式的效能能通過以下幾個方面來表現: 執行速度:程式的反映是否迅速,響應時間是否足夠短 記憶體分配:記憶體分配是否合理,是否過多地消耗記憶體或者存在洩漏 啟動時間:程式從執行到可以正常處理業務需要花費多長時間 負責承受能力:當系統壓力上升時,系統的執

JVM 垃圾回收機制與GC效能調

一、GC概要: JVM堆相關知識     為什麼先說JVM堆?     JVM的堆是Java物件的活動空間,程式中的類的物件從中分配空間,其儲存著正在執行著的應用程式用到的所有物件。這些物件的建立方式就是那些new一類的操作,當物件