SPARK大數據計算BUG處理:

大數據計算BUG處理:


程序修改前資源情況:

Driver : 1臺

Worker : 2臺

程序提交申請內存資源 : 1G內存

內存分配情況 : 

1. 20%用於程序運行

2. 20%用於Shuffle

3. 60%用於RDD緩存


單條TweetBean大小 : 3k


1. 內存溢出

原因:因爲程序會把所有的TweetBean查詢出來並且合併(union),該操作在內存中進行。則某個campaign數據量較大時,如500W數據,則500W*10k=50G,超出內存限制。

解決方法: 先按數據量切分task,避免單個task有很多數據造成內存溢出。把所有的task切分完成放到task列表中。循環task列表,當取出的task的數據量大於200000時,合併所有的數據並拆分成16個RDD分片。循環取task列表直至結束。

批量取200000數據的原因:200000*3k=600M,兩臺機器可用於程序運行的內存=2(機器數)* 2G(程序申請的內存大小) * 0.2(用於程序運行的內存比例) = 800M,可以滿足存儲200000數據,避免內存溢出。



2. 運行緩慢

原因:因爲兩臺機器,每臺機器可用於shuffle的內存大小 = 2(機器數)* 1G(程序申請的內存大小)* 0.2(用於程序運行的內存比例)= 400M。

200000(批量處理的數據量)* 3k(單條TweetBean大小)= 600M,批量Shuffle的數據量大於機器可用內存,所以數據會Flush到硬盤,導致讀取數據緩慢。

解決方法:調整程序Shuffle可用內存,如下:

程序申請內存資源:2G

內存分配情況 : 

1. 20%用於程序運行

2. 60%用於Shuffle

3. 20%用於RDD緩存


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