天天看點

Jupyter生态二次開發系列(三)

這次改的是用jupyterlab 跑 spark on k8s

jupyterlab本身是跑在k8s裡面的,然後甲方因為比較不懂計算機這東西, 導緻無論開多大記憶體,無論用vaex還是pandas都會記憶體溢出,是以打算用spark on k8s方式跑,認為這樣就不會溢出了,當然,實際上還是會溢出的。

如何搭建spark on k8s就不說了,官網就有教程。隻說一下改造思路。

這裡有兩個難點,一個是spark kernel的建立,如果采用提前建立spark叢集的方式, 那麼jupyterlab跑在pod裡面,不能連接配接到已經建立好的叢集。如果是cluster方式啟動driver, jupyter又不能用互動的方式編寫pyspark。是以我們采用的方式是按需在lab裡面建立spark kernel,然後再用這個建立的spark kernel去啟動spark driver,用這個driver去拉起一個spark on k8s叢集。第二個web ui這塊是因為jupyterlab on k8s是多人使用的,是以官網和其他資料上說的将spark driver的4040端口通過kubectl port-forward映射出來,但是因為多人使用, 每個人的driver都是在pod裡面的localhost:4040,我們不知道同時有多少人使用spark on k8s,如果采用端口映射并且采用順位綁定主控端端口(就是這個不行換下一個),jupyter裡面無法獲知pod外面映射的端口是什麼。是以我撸了兩段代碼, 一段是在lab裡面建立 spark kernel,一段是把spark driver的web ui 通過代理方式映射到 jupyterlab的url裡面。

大概說一下改造的思路

一、建立spark kernel

在lab頁面裡增加菜單項, 用以添加spark kernel 

Jupyter生态二次開發系列(三)

前端彈窗讓使用者填寫spark相關參數

Jupyter生态二次開發系列(三)

然後寫入jupyter的 kernel.json

Jupyter生态二次開發系列(三)

然後使用者使用該kernel建立 spark on k8s-ed notebook, 編寫spark作業.

二、代理spark webUI頁面到jupyterlab的url裡面

Jupyter生态二次開發系列(三)

重點在代理映射的url,  spark ui這部分實際是整個開發裡難度最高的, 為此我專門在jupyterlab的 pod 裡面撸了兩個代理伺服器, 一個http 7層代理, 一個socks5四層代理一起開發測試.

然後貼一下生成的 kernel.json供開發人員參考

這裡隻講改造思路, 具體代碼我就先不貼了, 以後機會合适, 再公開出來.

關鍵資訊打碼或用xxx代替, 但是長期關注我的, 應該會知道我主要服務的是哪家公司.

補充兩點, 為了確定代理sparkui正常, 需要設定~/.jupyter/jupyter_notebook_config.py内容, 允許跨域通路内容

同時, 需要在代理handler裡面覆寫jupyter自己的finish方法, 否則jupyter會強制使用application/json header來傳回代理的頁面

繼續閱讀