2017-02-13 48 views
0

這是一段代碼片段。 (問題描述如下)爲什麼一個適度的火花廣播變量會使工作掛起?

val broadcastVarbannedDNS = sc.broadcast(filterList) 
val INPUT = hc.table(s"tableName").where(s"DS BETWEEN 2016120100 AND 2016120100").rdd.filter(x => !broadcastVarbannedDNS.value.map(str => x.getString(2).contains(str)).contains(true)) 
INPUT.count() 

filterList是一個帶有200k +行的csv。出來約9MB。

當我使用整個篩選器列表運行時,作業在篩選器階段掛起,並且沒有任何異常或提示顯示問題。日誌上也沒有。但是,當我將filterList文件剪切成幾百行時,它會像熱刀一樣通過黃油運行。立即,可以得出結論:「更大」的文件是問題,儘管9MB與應該能夠處理GB的緩存相比是微不足道的。任何幫助表示讚賞。

回答

1

我想象的問題是,如果你在過濾器中有RD記錄和M行記錄,那麼你的處理是O(M * N),因爲你正在檢查每條記錄對應的每行記錄。

這意味着如果處理N個記錄是1秒,並且你有200K行,那麼你正在運行200K秒,這將與掛起相同。

相關問題