這次改的是用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
前端彈窗讓使用者填寫spark相關參數
然後寫入jupyter的 kernel.json
然後使用者使用該kernel建立 spark on k8s-ed notebook, 編寫spark作業.
二、代理spark webUI頁面到jupyterlab的url裡面
重點在代理映射的url, spark ui這部分實際是整個開發裡難度最高的, 為此我專門在jupyterlab的 pod 裡面撸了兩個代理伺服器, 一個http 7層代理, 一個socks5四層代理一起開發測試.
然後貼一下生成的 kernel.json供開發人員參考
這裡隻講改造思路, 具體代碼我就先不貼了, 以後機會合适, 再公開出來.
關鍵資訊打碼或用xxx代替, 但是長期關注我的, 應該會知道我主要服務的是哪家公司.
補充兩點, 為了確定代理sparkui正常, 需要設定~/.jupyter/jupyter_notebook_config.py内容, 允許跨域通路内容
同時, 需要在代理handler裡面覆寫jupyter自己的finish方法, 否則jupyter會強制使用application/json header來傳回代理的頁面