大數據計算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緩存