關於spark job並行的問題

  • 2019 年 10 月 30 日
  • 筆記

今天被同事問了一個簡單又不簡單的問題,一個spark app裡面有兩個job,那麼,他們可以並行執行嗎?

首先我們要了解一點,我們寫的程式碼同一個執行緒都是按照順序執行的,那麼我們的job應該都是串列一個個執行。。。但真是這樣么?

理論上,我們寫spark core都不會用到多執行緒,那個程式碼的執行確實是一條線下去,當遇到action運算元時會被阻塞,開始解析並執行這個spark任務,當任務執行完才會繼續往下走。我們可以想想平時提交多job的任務,在webui上是不是一開始只看見一個job,一個執行完了才會有下一個。

那麼如何並行呢?其實我們可以通過簡單的多執行緒實現,只要我們的driver能讀到多個action,那麼他會把任務都提交上去,也就實現了我們job並行。

這個其實很好理解,完全符合我們一般寫程式碼的邏輯,但是如果把這個擴展到spark streaming,可能就不是那麼好使了,為什麼呢?我們知道流處理是不間斷的,會一遍又一遍重複去執行你的任務,這個時候如果你說是一條執行緒從頭到尾,那就玩不下去了,那麼這個時候spark是怎麼處理的呢?我們可以簡單這麼理解,他會先將我們的程式碼邏輯解析出來,放到一個集合,然後在寫個死循環,每隔一段時間去把集合裡面的邏輯執行一遍。這樣一來spark streaming就不局限於單個執行緒執行了,因為所有job都解析好了,我只是要去執行job,那我當然可以開啟一個執行緒池,直接去執行任務了,而事實上,如果你看它底層實現,也確實是這樣,並且提供了spark.streaming.concurrentJobs參數給我們配置job的並發度,也就不用我們自己去寫多執行緒了,當然,默認是1,也就是串列執行。