精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文了解 DataLeap 中的 Notebook

精選
開(kāi)發(fā)
在數(shù)據(jù)開(kāi)發(fā)領(lǐng)域,Notebook 廣泛應(yīng)用于數(shù)據(jù)清理和轉(zhuǎn)換、數(shù)值模擬、統(tǒng)計(jì)建模、數(shù)據(jù)可視化、構(gòu)建和訓(xùn)練機(jī)器學(xué)習(xí)模型等方面。但是顯然,做數(shù)據(jù)開(kāi)發(fā),只有 Notebook 是不夠的。

一、概述

Notebook 是一種支持 REPL 模式的開(kāi)發(fā)環(huán)境。所謂「REPL」,即「讀取-求值-輸出」循環(huán):輸入一段代碼,立刻得到相應(yīng)的結(jié)果,并繼續(xù)等待下一次輸入。它通常使得探索性的開(kāi)發(fā)和調(diào)試更加便捷。在 Notebook 環(huán)境,你可以交互式地在其中編寫(xiě)你的代碼、運(yùn)行代碼、查看輸出、可視化數(shù)據(jù)并查看結(jié)果,使用起來(lái)非常靈活。

在數(shù)據(jù)開(kāi)發(fā)領(lǐng)域,Notebook 廣泛應(yīng)用于數(shù)據(jù)清理和轉(zhuǎn)換、數(shù)值模擬、統(tǒng)計(jì)建模、數(shù)據(jù)可視化、構(gòu)建和訓(xùn)練機(jī)器學(xué)習(xí)模型等方面。

但是顯然,做數(shù)據(jù)開(kāi)發(fā),只有 Notebook 是不夠的。在火山引擎 DataLeap 數(shù)據(jù)研發(fā)平臺(tái),我們提供了任務(wù)開(kāi)發(fā)、發(fā)布調(diào)度、監(jiān)控運(yùn)維等一系列能力。我們將 Notebook 作為一種任務(wù)類型,加入了數(shù)據(jù)研發(fā)平臺(tái),使用戶既能擁有 Notebook 交互式的開(kāi)發(fā)體驗(yàn),又能享受一站式大數(shù)據(jù)研發(fā)治理套件提供的便利。如果還不夠直觀的話,試想以下場(chǎng)景:

在交互式運(yùn)行和可視化圖表的加持下,你很快就調(diào)試完成了一份 Notebook。簡(jiǎn)單整理了下代碼,根據(jù)使用到的數(shù)據(jù)配置了上游任務(wù)依賴,上線了周期調(diào)度,并順手掛了報(bào)警。之后,基本上就不用管這個(gè)任務(wù)了:不需要每天手動(dòng)檢查上游數(shù)據(jù)是否就緒;不需要每天來(lái)點(diǎn)擊運(yùn)行,因?yàn)檎{(diào)度系統(tǒng)會(huì)自動(dòng)幫你執(zhí)行這個(gè) Notebook;執(zhí)行失敗了有報(bào)警,可以直接上平臺(tái)來(lái)處理;上游數(shù)據(jù)出錯(cuò)了,可以請(qǐng)他們發(fā)起深度回溯,統(tǒng)一修數(shù)。

二、選型

2019 年末,在決定要支持 Notebook 任務(wù)的時(shí)候,我們調(diào)研了許多 Notebook 的實(shí)現(xiàn),包括 Jupyter、Polynote、Zeppelin、Deepnote 等。Jupyter Notebook 是 Notebook 的傳統(tǒng)實(shí)現(xiàn),它有著極其豐富的生態(tài)以及龐大的用戶群體,相信許多人都用過(guò)這個(gè)軟件。事實(shí)上,在字節(jié)跳動(dòng)數(shù)據(jù)平臺(tái)發(fā)展早期,就有了在物理機(jī)集群上統(tǒng)一部署的 Jupyter(基于多用戶方案 JupyterHub),供內(nèi)部的用戶使用??紤]到用戶習(xí)慣和其強(qiáng)大的生態(tài),Jupyter 最終成為了我們的選擇。

圖片

Jupyter Notebook 是一個(gè) Web 應(yīng)用。通常認(rèn)為其有兩個(gè)核心的概念:Notebook 和 Kernel。

Notebook 指的是代碼文件,一般在文件系統(tǒng)中存儲(chǔ),后綴名為ipynb。Jupyter Notebook 后端提供了管理這些文件的能力,用戶可以通過(guò) Jupyter Notebook 的頁(yè)面創(chuàng)建、打開(kāi)、編輯、保存 Notebook。在 Notebook 中,用戶以一個(gè)一個(gè) Cell 的形式編寫(xiě)代碼,并按 Cell 運(yùn)行代碼。Notebook 文件的具體內(nèi)容格式,可參考 The Notebook file format (https://nbformat.readthedocs.io/en/latest/format_description.html)。

Kernel 是 Notebook 中的代碼實(shí)際的運(yùn)行環(huán)境,它是一個(gè)獨(dú)立的進(jìn)程。每一次「運(yùn)行」動(dòng)作,產(chǎn)生的效果是單個(gè) Cell 的代碼被運(yùn)行。具體來(lái)講,「運(yùn)行」就是把 Cell 內(nèi)的代碼片段,通過(guò) Jupyter Notebook 后端以特定格式發(fā)送給 Kernel 進(jìn)程,再?gòu)?Kernel 接受特定格式的返回,并反饋到頁(yè)面上。這里所說(shuō)的「特定格式」,可參考 Messaging in Jupyter(https://jupyter-client.readthedocs.io/en/stable/messaging.html)。

在 DataLeap 數(shù)據(jù)研發(fā)平臺(tái),開(kāi)發(fā)過(guò)程圍繞的核心是任務(wù)。用戶可以在項(xiàng)目下的任務(wù)開(kāi)發(fā)目錄創(chuàng)建子目錄和任務(wù),像 IDE 一樣通過(guò)目錄樹(shù)管理其任務(wù)。Notebook 也是一種任務(wù)類型,用戶可以啟動(dòng)一個(gè)獨(dú)立的任務(wù) Kernel 環(huán)境,像開(kāi)發(fā)其他普通任務(wù)一樣使用 Notebook。

圖片

三、技術(shù)路線

在 Jupyter 的生態(tài)下,除了 Notebook 本身,我們還注意到了很多其他組件。彼時(shí),JupyterLab 正在逐漸取代傳統(tǒng)的 Jupyter Notebook 界面,成為新的標(biāo)準(zhǔn)。JupyterHub 使用廣泛,是多用戶 Notebook 的版本答案。脫胎于 Jupyter Kernel Gateway(JKG)的 Enterprise Gateway(EG),提供了我們需要的 Remote Kernel(上述的獨(dú)立任務(wù) Kernel 環(huán)境)能力。2020 上半年,我們基于上面的三大組件,進(jìn)行二次開(kāi)發(fā),在字節(jié)跳動(dòng)數(shù)據(jù)研發(fā)平臺(tái)發(fā)布了 Notebook 任務(wù)類型。整體架構(gòu)預(yù)覽如圖。

圖片

JupyterLab

前端這一側(cè),我們選擇了基于更現(xiàn)代化的 JupyterLab (https://jupyterlab.readthedocs.io/en/stable/getting_started/overview.html) 進(jìn)行改造。我們刨去了它的周邊視圖,只留下了中間的 Cell 編輯區(qū),嵌入了 DataLeap 數(shù)據(jù)研發(fā)的頁(yè)面中。為了和 DataLeap 的視覺(jué)風(fēng)格更契合,從 2020 下半年到 2021 年初,我們還針對(duì)性地改進(jìn)了 JupyterLab 的 UI。這其中包括將整個(gè) JupyterLab 使用的代碼編輯器從 CodeMirror 統(tǒng)一到 DataLeap 數(shù)據(jù)研發(fā)使用的 Monaco Editor,同時(shí)還接入了 DataLeap 提供的 Python & SQL 代碼智能補(bǔ)全功能。

額外地,我們還開(kāi)發(fā)了定制的可視化 SDK,使得用戶在 Notebook 上計(jì)算得到的 Pandas Dataframe 可以接入 DataLeap 數(shù)據(jù)研發(fā)已經(jīng)提供的數(shù)據(jù)結(jié)果分析模塊,直接在 Notebook 內(nèi)部做一些簡(jiǎn)單的數(shù)據(jù)探查。

JupyterHub

JupyterHub(https://jupyterhub.readthedocs.io/en/stable/) 提供了可擴(kuò)展的認(rèn)證鑒權(quán)能力和環(huán)境創(chuàng)建能力。首先,由于用戶較多,因此為每個(gè)用戶提供單獨(dú)的 Notebook 實(shí)例不太現(xiàn)實(shí)。因此我們決定,按 DataLeap 項(xiàng)目來(lái)切分 Notebook 實(shí)例,同項(xiàng)目下的用戶共享一個(gè)實(shí)例(即一個(gè)項(xiàng)目實(shí)際上在 JupyterHub 是一個(gè)用戶)。這也與 DataLeap 的項(xiàng)目權(quán)限體系保持了一致。注意這里的「Notebook 實(shí)例」,在我們的配置下,是拉起一個(gè)運(yùn)行 JupyterLab 的環(huán)境。另外,由于我們會(huì)使用 Remote Kernel,所以在這個(gè)環(huán)境內(nèi),并不提供 Kernel 運(yùn)行的能力。

在認(rèn)證鑒權(quán)方面,我們讓 JupyterHub 請(qǐng)求我們業(yè)務(wù)后端提供的驗(yàn)證接口,判斷登錄態(tài)的用戶是否具備請(qǐng)求的對(duì)應(yīng) DataLeap 項(xiàng)目的權(quán)限,以實(shí)現(xiàn)權(quán)限體系對(duì)接。

在環(huán)境創(chuàng)建方面,我們通過(guò) OpenAPI 對(duì)接了字節(jié)跳動(dòng)內(nèi)部的 PaaS 服務(wù),為每一個(gè)使用了 Notebook 任務(wù)的 DataLeap 項(xiàng)目分配一個(gè) JupyterLab 實(shí)例,對(duì)應(yīng)一個(gè) PaaS 服務(wù)。由于直接新建一個(gè)服務(wù)的流程較長(zhǎng),速度較慢,因此我們還額外做了池化,預(yù)先啟動(dòng)一批服務(wù),當(dāng)有新項(xiàng)目的用戶登入時(shí)直接分配。

Enterprise Gateway

Jupyter Enterprise Gateway (https://jupyter-enterprise-gateway.readthedocs.io/en/latest/) 提供了在分布式集群(包括 YARN、Kubernetes 等)內(nèi)部啟動(dòng) Kernel 的能力,并成為了 Notebook 到集群內(nèi) Kernel 的代理。在原生的 Notebook 體系下,Kernel 是 Jupyter Notebook / JupyterLab 中的一個(gè)本地進(jìn)程;對(duì)于啟用了 Gateway 功能的 Notebook 實(shí)例,所有 Kernel 相關(guān)的功能的請(qǐng)求,如獲取 Kernel 類型、啟動(dòng) Kernel、運(yùn)行 Cell、中斷等,都會(huì)被代理到指定的 Gateway 上,再由 Gateway 代理到具體集群內(nèi)的 Kernel 里,形成了 Remote Kernel 的模式。

這樣帶來(lái)的好處是,Kernel 和 Notebook 分離,不會(huì)相互影響:例如某個(gè) Kernel 運(yùn)行占用物理內(nèi)存超限,不會(huì)導(dǎo)致其他同時(shí)運(yùn)行的 Kernel 掛掉,即使他們都通過(guò)同一個(gè) Notebook 實(shí)例來(lái)使用。

圖片

EG 本身提供的 Kernel 類型,和字節(jié)跳動(dòng)內(nèi)部系統(tǒng)并不完全兼容,需要我們自行修改和添加。我們首先以 Spark Kernel 的形式對(duì)接了字節(jié)跳動(dòng)內(nèi)部的 YARN 集群。Kernel 以 PySpark 的形式在 Cluster 模式的 Spark Driver 運(yùn)行,并提供一個(gè)默認(rèn)的 Spark Session。用戶可以通過(guò)在 Driver 上的 Kernel,直接發(fā)起運(yùn)行 Spark 相關(guān)代碼。同時(shí),為了滿足 Spark 用戶的使用習(xí)慣,我們額外提供了在同一個(gè) Kernel 內(nèi)交叉運(yùn)行 SQL 和 Scala 代碼的能力。

2020 下半年,伴隨著云原生的浪潮,我們還接入了字節(jié)跳動(dòng)云原生 K8s 集群,為用戶提供了 Python on K8s 的 Kernel。我們還擴(kuò)展了很多自定義的能力,例如支持自定義鏡像,以及針對(duì)于 Spark Kernel 的自定義 Spark 參數(shù)。

穩(wěn)定性方面,在當(dāng)時(shí)的版本,EG 存在異步不夠徹底的問(wèn)題,在 YARN 場(chǎng)景下,單個(gè) EG 進(jìn)程甚至只能跑起來(lái)十幾個(gè) Kernel。我們發(fā)現(xiàn)了這一問(wèn)題,并完成了各處所需的 async 邏輯改造,保證了服務(wù)的并發(fā)能力。另外,我們利用了字節(jié)跳動(dòng)內(nèi)部的負(fù)載均衡(nginx 七層代理集群)能力,部署多個(gè) EG 實(shí)例,并指定單個(gè) JupyterLab 實(shí)例的流量總是打到同一個(gè) EG 實(shí)例上,實(shí)現(xiàn)了基本的 HA。

四、架構(gòu)升級(jí)

當(dāng)使用 Notebook 的項(xiàng)目日漸增加時(shí),我們發(fā)現(xiàn),運(yùn)行中的 PaaS 服務(wù)實(shí)在太多了,之前的架構(gòu)造成了

部署麻煩。全量升級(jí) JupyterLab 較為痛苦。盡管有升級(jí)腳本,但是通過(guò) API 操作升級(jí)服務(wù),可能由于鏡像構(gòu)建失敗等原因,會(huì)造成卡單現(xiàn)象,因此每次全量升級(jí)后都是人工巡檢檢查升級(jí)狀態(tài),卡住的升級(jí)單人工點(diǎn)擊下一步。同時(shí)由于升級(jí)不同服務(wù)不會(huì)復(fù)用配置相同的鏡像,所以有多少服務(wù)就要構(gòu)建多少次鏡像,當(dāng)服務(wù)數(shù)量達(dá)到一定量級(jí)時(shí),我們的批量升級(jí)請(qǐng)求可能把內(nèi)部鏡像構(gòu)建服務(wù)壓垮。

JupyterLab 需要不斷的根據(jù)用戶增長(zhǎng)(項(xiàng)目增長(zhǎng))進(jìn)行擴(kuò)容,一旦預(yù)先啟動(dòng)好的資源池不夠,就會(huì)存在新項(xiàng)目里有用戶打開(kāi) Notebook,需要經(jīng)歷整個(gè) JupyterLab 服務(wù)創(chuàng)建、環(huán)境拉起的流程,速度較慢,影響體驗(yàn)。而且,JupyterLab 數(shù)量巨大后,遇到 bad case 的幾率增高,有些問(wèn)題不易復(fù)現(xiàn)、非常偶發(fā),重啟/遷移即可解決,但是在遇到的時(shí)候,用戶體驗(yàn)受影響較大。

運(yùn)維困難。當(dāng)用戶 JupyterLab 可能出現(xiàn)問(wèn)題,為了找到對(duì)應(yīng)的 JupyterLab,我們需要先根據(jù)項(xiàng)目對(duì)應(yīng)到 JupyterHub user,然后根據(jù) user 找到 JupyterHub 記錄的服務(wù) id,再去 PaaS 平臺(tái)找服務(wù),進(jìn) webshell。

當(dāng)然,還有資源的浪費(fèi)。雖然每個(gè)實(shí)例很小(1c1g),但是數(shù)量很多;有些項(xiàng)目并不總是在使用 Notebook,但 JupyterLab 依然運(yùn)行。

穩(wěn)定性存在問(wèn)題。一方面,JupyterHub 是一個(gè)單點(diǎn),升級(jí)需要先起后停,掛了有風(fēng)險(xiǎn)。另一方面,EG 入流量經(jīng)過(guò)特定負(fù)載均衡策略,本身是為了使 JupyterLab 固定往一個(gè) EG 請(qǐng)求。在 EG 升級(jí)時(shí),JupyterLab 請(qǐng)求的終端會(huì)隨之改變,極端情況下有可能造成 Kernel 啟動(dòng)多次的情況。

基于簡(jiǎn)化運(yùn)維成本、降低架構(gòu)復(fù)雜性,以及提高用戶體驗(yàn)的考慮,2021 上半年,我們對(duì)整體架構(gòu)進(jìn)行了一次改良。在新的架構(gòu)中,我們主要做了以下改進(jìn),大致簡(jiǎn)化為下圖:

  1. 移除 JupyterHub,將 JupyterLab 改為多實(shí)例無(wú)狀態(tài)常駐服務(wù),并實(shí)現(xiàn)對(duì)接 DataLeap 的多用戶鑒權(quán)。
  2. 改造原本落在 JupyterLab 本地的數(shù)據(jù)存儲(chǔ),包括用戶自定義配置、Session 維護(hù)和代碼文件讀寫(xiě)。
  3. EG 支持持久化 Kernel,將 Kernel 遠(yuǎn)程環(huán)境元信息持久化在遠(yuǎn)端存儲(chǔ)(MySQL)上,使其重啟時(shí)可以重連,且 JupyterLab 可以知道某個(gè) Kernel 需要通過(guò)哪個(gè) EG 連接。

圖片

鑒權(quán) & 安全

單用戶的 Jupyter Notebook / JupyterLab 的鑒權(quán)相對(duì)簡(jiǎn)單(實(shí)際上 JupyterLab 直接復(fù)用了 Jupyter Notebook 的這套代碼)。例如,使用默認(rèn)命令啟動(dòng)時(shí),會(huì)自動(dòng)生成一個(gè) token,同時(shí)自動(dòng)拉起瀏覽器。有了 token,就可以任意地訪問(wèn)這個(gè) Notebook。

事實(shí)上,JupyterHub 也是起到了維護(hù) token 的作用。前端會(huì)發(fā)起一個(gè)獲取 token 的 API 請(qǐng)求,再拿著獲取的 token 請(qǐng)求通過(guò) JupyterHub proxy 到真實(shí)的 Notebook 實(shí)例。而我們直接為 Jupyter Notebook 增加了 Auth 的功能,實(shí)現(xiàn)了在 JupyterLab 單實(shí)例上完成這套鑒權(quán)(此時(shí),使用了 DataLeap 服務(wù)簽發(fā)的 Token)。

圖片

最后,由于所有用戶會(huì)共享同一組 JupyterLab,我們還需要禁止一些接口的調(diào)用,以保證系統(tǒng)的安全。最典型的接口包括關(guān)閉服務(wù)(Shutdown),以及修改配置等。后續(xù) Notebook 所需的配置,轉(zhuǎn)由前端保存在瀏覽器內(nèi)。

代碼 & Session 持久化

Jupyter Notebook 使用 File Manager(https://github.com/jupyter-server/jupyter_server/blob/main/jupyter_server/services/contents/filemanager.py) 管理 Contents 相關(guān)讀寫(xiě)(對(duì)我們而言主要是 Notebook 代碼文件),原生行為是將代碼存儲(chǔ)在本地,多個(gè)服務(wù)實(shí)例之間無(wú)法共享同一份代碼,而且遷移時(shí)可能造成代碼丟失。

為了避免代碼丟失,我們的做法是,把代碼按項(xiàng)目分別存儲(chǔ)在 OSS 上并直接讀寫(xiě),同時(shí)解決了一些由于代碼文件元信息丟失,并發(fā)編輯導(dǎo)致的其他問(wèn)題。例如,當(dāng)多個(gè)頁(yè)面訪問(wèn)同一份代碼文件時(shí),都會(huì)從 OSS 獲取最新的 code,當(dāng)用戶存儲(chǔ)時(shí),前端會(huì)獲取最新的代碼文件,比較該文件的修改時(shí)間同前端存儲(chǔ)的是否一致,如果不同,則說(shuō)明有其它頁(yè)面存儲(chǔ)過(guò),會(huì)提示用戶選擇覆蓋或是恢復(fù)。

圖片

Notebook 使用 Session 管理用戶到 Kernel 的連接,例如前端通過(guò) POST /session 接口啟動(dòng) Kernel,GET /session 查看當(dāng)前運(yùn)行中的 Kernel。在 Session 處理方面,原生的 Notebook 使用了原生的 sqlite(in memory),見(jiàn)代碼(https://github.com/jupyter-server/jupyter_server/blob/main/jupyter_server/services/sessions/sessionmanager.py)。盡管我們并不明白這么做的意義何在(畢竟原生的 Notebook 重啟,一切都沒(méi)了),但我們順著這個(gè)原生的表結(jié)構(gòu)繼續(xù)前進(jìn),引入了 sqlalchemy 對(duì)接多種數(shù)據(jù)庫(kù),將 Session 數(shù)據(jù)搬到了 MySQL。

圖片

另一方面,由于我們啟動(dòng)的 Kernel,有一部分涉及 Spark on YARN,啟動(dòng)速度并不理想,因此早期我們?cè)黾恿斯δ埽裟硞€(gè) path 已有正在啟動(dòng)的 Kernel,則等其啟動(dòng)完畢而不是再啟動(dòng)一個(gè)新的。這個(gè)功能原先使用內(nèi)存中的 set 實(shí)現(xiàn),現(xiàn)在也移植到了數(shù)據(jù)庫(kù)上,通過(guò) sqlalchemy 來(lái)訪問(wèn)。

Kernel 持久化 & 訪問(wèn)

在 Remote Kernel 的場(chǎng)景下,一個(gè) JupyterLab 需要知道它的某個(gè) Kernel 具體在哪個(gè) EG 上。在之前一個(gè)項(xiàng)目一個(gè) JupyterLab 的狀態(tài)下,我們通過(guò)負(fù)載均衡簡(jiǎn)單處理這個(gè)問(wèn)題:即一個(gè) Server 總是只訪問(wèn)同一個(gè) Gateway。然而當(dāng) JupyterLab 成為無(wú)狀態(tài)服務(wù)時(shí),用戶并非固定只訪問(wèn)一個(gè) JupyterLab,也就不能保證總訪問(wèn)用戶 Kernel 所在的 EG。

另一個(gè)情況是,當(dāng) JupyterLab 或 EG 重啟時(shí),其上的 Kernel 都會(huì)關(guān)閉。當(dāng)我們升級(jí)相關(guān)服務(wù)時(shí),總是需要通知用戶準(zhǔn)備重啟 Kernel。因此,為了實(shí)現(xiàn)升級(jí)對(duì)用戶無(wú)感,我們?cè)?EG 這層開(kāi)發(fā)了持久化 Kernel 的特性。

Kernel Gateway 在啟動(dòng) Kernel 時(shí),記錄了關(guān)于 Kernel 的一些元信息,包括啟動(dòng)參數(shù)、連接 Kernel 使用的 IP/Port 等。有了這些信息,當(dāng)一個(gè) Kernel Gateway 重啟且 Remote Kernel 不關(guān)閉,就有辦法重新連接上。原本這些信息默認(rèn)在內(nèi)存 dict 中維護(hù),開(kāi)源倉(cāng)庫(kù)中有一套存儲(chǔ)在本地文件的方案;基于這套方案,我們擴(kuò)展了自研的存儲(chǔ)到 MySQL 的方案。

在多實(shí)例的場(chǎng)景下,每一個(gè) EG 實(shí)例依然會(huì)接管的各自的一部分 Kernel,并記錄每個(gè) Kernel 由誰(shuí)接管(探活、Cull Idle、連接使用等)。在其關(guān)閉前,需要清除接管信息,以便下次啟動(dòng)或其他實(shí)例啟動(dòng)時(shí)撈起。

為了減少 client(正常是 JupyterLab) 任意訪問(wèn) EG 的情況,一方面我們沿用了負(fù)載均衡的策略,另一方面 JupyterLab 在請(qǐng)求 Kernel 相關(guān)操作前,會(huì)先請(qǐng)求 EG 一次,由 EG 決定 JupyterLab 具體請(qǐng)求哪一個(gè) EG IP/Port。

圖片

當(dāng) EG 服務(wù)本身重啟或者升級(jí)時(shí),會(huì)在進(jìn)程退出之前去清除接管信息。當(dāng)頁(yè)面繼續(xù)訪問(wèn)時(shí),JupyterLab 服務(wù)將會(huì)隨機(jī)分發(fā)相應(yīng)請(qǐng)求,由其它的 EG 服務(wù)繼續(xù)接管。

收益

架構(gòu)升級(jí)簡(jiǎn)化后,整套 Notebook 服務(wù)的穩(wěn)定性獲得了極大的提升。由于實(shí)現(xiàn)了用戶無(wú)感知的升級(jí),不僅提升了用戶的使用體驗(yàn),運(yùn)維的成本也同時(shí)降低了。

部署的成本也極大地降低,包括算力、人力的節(jié)省。由于剝離了內(nèi)部依賴,我們得以將這套架構(gòu)部署在各種公有云、私有化場(chǎng)景。

五、調(diào)度方案

在前面,我們重點(diǎn)關(guān)注了怎么將 Jupyter 這套應(yīng)用嵌入到 DataLeap 數(shù)據(jù)研發(fā)中。這只覆蓋了我們 Notebook 任務(wù)的頁(yè)面調(diào)試功能。實(shí)際上,同時(shí)作為一個(gè)調(diào)度系統(tǒng),我們還需要關(guān)心怎么調(diào)度一個(gè) Notebook 任務(wù)。

首先,是和所有其他任務(wù)類型相同的部分:當(dāng) Notebook 任務(wù)所配置的上游依賴任務(wù)全部運(yùn)行完畢,開(kāi)始拉起本次 Notebook 任務(wù)的運(yùn)行。我們會(huì)根據(jù)任務(wù)的版本創(chuàng)建一個(gè)任務(wù)的快照,我們稱之為任務(wù)實(shí)例,并將其提交到我們的執(zhí)行器中。

對(duì)于 Notebook 任務(wù),在實(shí)例運(yùn)行前,我們會(huì)根據(jù) Notebook 任務(wù)對(duì)應(yīng)的版本,從 OSS 拷貝一份 Notebook 代碼文件,用于執(zhí)行。在具體的執(zhí)行流程中,我們使用了 Jupyter 生態(tài)中的 nbconvert (https://nbconvert.readthedocs.io/en/latest/) 來(lái)實(shí)現(xiàn)在沒(méi)有 Jupyter 應(yīng)用的前提下在后臺(tái)運(yùn)行這份 Notebook 文件,并將運(yùn)行后得到的結(jié)果 Notebook 文件傳回 OSS。nbconvert 的工作原理比較簡(jiǎn)單,且復(fù)用了 Jupyter 底層的代碼,具體如下:

  1. 根據(jù)指定的 Kernel Manager 或 Notebook 文件里的 Kernel 類型創(chuàng)建對(duì)應(yīng)的 Kernel Manager(https://github.com/jupyter/jupyter_client/blob/main/jupyter_client/manager.py);
  2. Kernel Manger 創(chuàng)建 Kernel Client,并啟動(dòng)一個(gè) Kernel;
  3. 遍歷 Notebook 文件里的 Cell,調(diào)用 Kernel Client 執(zhí)行 Cell 里的代碼;
  4. 獲取輸出結(jié)果,按照 nbformat 指定的 schema 填入 NotebookNode,并保存。

下圖是調(diào)度執(zhí)行 Notebook 的 Kernel 運(yùn)行流程和通過(guò)調(diào)試走 EG 的 Remote Kernel 運(yùn)行流程對(duì)比??梢钥闯?,它們的鏈路并沒(méi)有本質(zhì)上的區(qū)別,只不過(guò)是在調(diào)度執(zhí)行時(shí),不需要交互式的 Kernel 通信,以及 EG 的這些 Kernel Launcher 使用了 embed_kernel 在同進(jìn)程內(nèi)啟動(dòng) Kernel 而已。走到最底層,它們都是使用了 ipykernel 的(其他語(yǔ)言 kernel 同理)。

圖片

六、未來(lái)工作

Notebook 任務(wù)已成為字節(jié)跳動(dòng)內(nèi)部使用較為高頻的任務(wù)類型。在火山引擎,我們也可以購(gòu)買 DataLeap,即一站式大數(shù)據(jù)研發(fā)治理套件,開(kāi)通交互式分析的版本,使用到 DataLeap 的 Notebook 任務(wù)。

有的時(shí)候,我們發(fā)現(xiàn),我們有比 Jupyter 社區(qū)快半步的地方:比如基于 asyncio 異步優(yōu)化的 EG;比如給 Notebook 增加 Auth 能力。但社區(qū)的發(fā)展也很快:比如社區(qū)將 Jupyter 后端相關(guān)的代碼實(shí)現(xiàn),統(tǒng)一收斂到了jupyter_server;比如 EG 作者提出的 Kernel Provider 方案,令jupyter_server可以直接支持 Remote Kernel。

因此我們并未就此止步。目前,這套 Notebook 服務(wù)和 DataLeap 數(shù)據(jù)研發(fā)的其他前后端服務(wù),仍存在著割裂。未來(lái),我們希望精簡(jiǎn)架構(gòu),實(shí)現(xiàn)徹底的整合,使 Notebook 并非以嵌入的形式融合在 DataLeap 的產(chǎn)品中,而是使其原生就在 DataLeap 數(shù)據(jù)研發(fā)中被支持,帶來(lái)更好的性能,同時(shí)又保留所有 Jupyter 生態(tài)帶來(lái)的強(qiáng)大功能。另一方面,隨著 DataLeap 數(shù)據(jù)研發(fā)平臺(tái)對(duì)流式數(shù)據(jù)開(kāi)發(fā)的支持,我們也希望借助 Notebook 實(shí)現(xiàn)用戶對(duì)流式數(shù)據(jù)的探索、調(diào)試、可視化等功能的需求。相信不久的將來(lái),Notebook 能夠?qū)崿F(xiàn)流批一體化,來(lái)服務(wù)更加廣泛的用戶群體。

責(zé)任編輯:未麗燕 來(lái)源: 字節(jié)跳動(dòng)技術(shù)團(tuán)隊(duì)
相關(guān)推薦

2020-08-27 07:34:50

Zookeeper數(shù)據(jù)結(jié)構(gòu)

2024-02-01 11:57:31

this指針代碼C++

2023-11-20 08:18:49

Netty服務(wù)器

2023-04-26 15:43:24

容器編排容器編排工具

2022-02-25 07:34:36

MQTT協(xié)議RabbitMQ

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-11-11 19:09:13

架構(gòu)

2025-05-23 09:38:54

JWT開(kāi)發(fā)Go

2022-06-08 08:11:56

威脅建模網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2023-12-26 07:33:45

Redis持久化COW

2024-01-19 11:53:29

文件系統(tǒng)操作系統(tǒng)存儲(chǔ)

2023-08-26 20:56:02

滑動(dòng)窗口協(xié)議

2023-11-08 08:15:48

服務(wù)監(jiān)控Zipkin

2022-02-24 07:34:10

SSL協(xié)議加密

2023-10-27 08:15:45

2022-03-08 13:42:13

橫向移動(dòng)網(wǎng)絡(luò)攻擊

2024-07-26 00:00:10

2022-04-12 10:34:05

Web框架方案

2022-10-24 14:03:24

云計(jì)算IT托管服務(wù)

2025-05-12 08:50:00

apply()Pandas函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美精品第1页| 久久影院电视剧免费观看| 欧美成人免费播放| 国产精品久久久久久在线观看| 国产无遮挡裸体视频在线观看| 久久久国产午夜精品| 成人国产精品一区| 日韩三级av在线| 欧洲福利电影| 精品国产乱码久久久久久久久| 久久精品.com| 在线不卡日本v二区707| 久久免费看少妇高潮| 国产日韩精品入口| 国产成人无码精品| 久久久久亚洲| 亚洲人成电影在线| 麻豆av免费看| 国产精品伊人| 富二代精品短视频| 欧美做暖暖视频| 成年人视频免费在线观看| 高清在线不卡av| 91精品久久久久久久| 日韩欧美三级在线观看| 在线中文字幕亚洲| 中文字幕9999| 中文字幕丰满乱子伦无码专区| 日本亚洲视频| 欧美精品在线视频| www.色就是色| 中文字幕这里只有精品| 亚洲h在线观看| 日本高清视频免费在线观看| 95在线视频| 久久久久国产精品麻豆ai换脸| 国产91精品一区二区绿帽| 一级片在线观看视频| 久久亚洲国产精品一区二区| 亚洲91av视频| 国产无码精品视频| 欧美黄色一区| 超碰97人人做人人爱少妇| 国产又黄又粗又猛又爽的| 精品久久影院| 亚洲无av在线中文字幕| 国产黄色网址在线观看| 日本三级久久| 日韩精品一二三四区| xfplay5566色资源网站| 一级毛片精品毛片| 日韩久久精品一区| 成人三级做爰av| 国产精品中文| 欧美成人video| 成年人看片网站| 精品国产亚洲一区二区三区在线| 欧美久久久久久久久| 国产精品v日韩精品v在线观看| 亚洲综合在线电影| 在线观看亚洲精品| 特级丰满少妇一级| 成人影院在线免费观看| 欧美三级电影精品| 在线视频观看一区二区| 国产95亚洲| 欧美mv日韩mv国产| 波多野结衣先锋影音| 亚州精品视频| 一区二区三区高清国产| 国产传媒在线看| 91av精品| 久久免费国产视频| xxxxxx国产| 老司机一区二区三区| 国产精品www网站| 一区二区三区午夜| 国产成人高清在线| 国产一区免费视频| 搞黄视频免费在线观看| 国产精品久久久久久久裸模| 中文字幕一区二区三区四区五区人 | 日本人添下边视频免费| 久久精品亚洲成在人线av网址| 日韩国产一区三区| 中国女人特级毛片| 综合在线视频| 97婷婷涩涩精品一区| 无码视频一区二区三区| 国产做a爰片久久毛片| 国产精品日韩欧美一区二区三区| 欧美亚洲日本| 亚洲欧美日韩国产一区二区三区 | av成人 com a| 欧美性淫爽ww久久久久无| 国产永久免费网站| 农村少妇一区二区三区四区五区| 国产一区二区三区直播精品电影| 四虎免费在线视频| 香蕉久久久久久久av网站| 成人免费大片黄在线播放| 老熟妇高潮一区二区高清视频| 国产亚洲一区二区三区在线观看| 好色先生视频污| 中文在线аv在线| 日韩午夜在线影院| 加勒比综合在线| 黄色在线成人| 国产一区欧美二区三区| 天堂成人在线观看| 成人欧美一区二区三区| 免费观看精品视频| 18国产精品| 精品国产拍在线观看| 中文人妻av久久人妻18| 成人午夜av在线| 一本—道久久a久久精品蜜桃| 毛片在线网站| 精品国产免费一区二区三区香蕉| 潮喷失禁大喷水aⅴ无码| 亚洲影视综合| 国产精品三区四区| 国产黄大片在线观看画质优化| 色综合久久66| 亚洲乱码国产乱码精品精大量| 伊人色**天天综合婷婷| 国产精品视频播放| 国模吧精品人体gogo| 五月婷婷欧美视频| 国产sm在线观看| 久久久久av| 国产精品人成电影在线观看| 欧洲一区av| 欧美日韩视频在线| 久久福利小视频| 黄色日韩在线| 国产高清在线精品一区二区三区| 黄网站在线免费| 欧美日韩亚洲高清一区二区| 国产伦理片在线观看| 亚洲欧美日韩国产综合精品二区 | 国产精品69av| 黄色电影免费在线看| 欧美视频中文字幕在线| 精品中文字幕在线播放| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲一区久久久| 手机电影在线观看| 91精品国产色综合久久不卡电影 | 91黄色激情网站| 超碰97人人干| 丝袜脚交一区二区| 日韩精品欧美在线| av亚洲一区| 日韩在线视频国产| 国产麻豆免费视频| 夜夜精品浪潮av一区二区三区| 国产精品熟女一区二区不卡| 欧美1区2区| 国产精品久久久久久久久久久久冷 | 久久乐国产精品| 四虎精品在线| 91福利国产精品| 国精产品久拍自产在线网站| 久久成人免费日本黄色| 佐佐木明希av| 国产精品流白浆在线观看| 97精品久久久| 国产在线一在线二| 欧美剧在线免费观看网站| 婷婷在线精品视频| 成人免费毛片a| 日批视频在线免费看| 日韩久久电影| 成人免费视频网站| 午夜欧美巨大性欧美巨大| 中文欧美日本在线资源| 国产视频在线一区| 午夜久久久影院| 亚洲国产av一区| 国产老肥熟一区二区三区| 国产96在线 | 亚洲| 不卡视频在线| 爱情岛论坛亚洲入口| 天堂√8在线中文| 日韩中文字幕网| 天堂在线观看免费视频| 欧美性一二三区| 久久无码精品丰满人妻| 久久免费看少妇高潮| 日韩精品aaa| 亚洲一区二区三区免费在线观看| 亚洲欧美电影在线观看| 动漫3d精品一区二区三区乱码| 国产成人极品视频| caopen在线视频| 国产视频精品va久久久久久| 国产视频一区二区三| 色综合久久中文综合久久牛| 国产精品 欧美激情| 久久亚洲精精品中文字幕早川悠里 | 国产精品蜜芽在线观看| 中文字幕视频一区二区在线有码| 亚洲精品视频专区| 欧美优质美女网站| 日本亚洲欧美在线| 国产精品国产三级国产专播品爱网 | 五月婷婷视频在线| 亚洲少妇屁股交4| 久久成人激情视频| 国产91精品在线观看| 91制片厂毛片| 免费在线播放第一区高清av| 无码人妻精品一区二区蜜桃百度| 国产亚洲一区二区三区不卡| 国产精品区免费视频| 国产中文欧美日韩在线| 国产精品第一区| 中文字幕在线直播| 欧美大学生性色视频| 日本黄色片在线观看| 亚洲欧美国产另类| 日韩永久免费视频| 日韩欧美中文字幕制服| 91亚洲视频在线观看| 色婷婷av一区| 天天干天天干天天操| 亚洲一区二区视频在线观看| 夫妻性生活毛片| 国产精品成人在线观看| 久操视频在线观看免费| 91免费视频大全| 久久亚洲AV成人无码国产野外 | 中文字幕第69页| 久久精品男人天堂av| 欧美成人午夜精品免费| 91网址在线看| 一级国产黄色片| 99riav久久精品riav| 亚洲男人在线天堂| 99re成人在线| 精品无码国产一区二区三区51安| 成人亚洲一区二区一| 高清中文字幕mv的电影| 成人免费毛片嘿嘿连载视频| 美女搡bbb又爽又猛又黄www| 成人毛片在线观看| 2一3sex性hd| 99在线热播精品免费| 午夜av免费看| 91麻豆福利精品推荐| 白丝女仆被免费网站| 久久精品男人的天堂| 国产午夜福利一区| 国产精品视频yy9299一区| 美国精品一区二区| 日韩理论片网站| 黄色在线观看免费| 午夜精品久久久久久久99水蜜桃| 1级黄色大片儿| 色综合天天综合狠狠| 久久久久精彩视频| 欧美日韩精品一区二区| 国产伦精品一区二区三区视频痴汉| 8x8x8国产精品| 亚洲国产日韩在线观看| 日韩高清人体午夜| 国产美女性感在线观看懂色av| 中文字幕视频在线免费欧美日韩综合在线看 | 国产精品无人区| 日韩高清dvd碟片| 亚洲成人一区在线| 日韩色图在线观看| 欧美日韩国产影片| 亚洲精品成人电影| 亚洲精品自拍视频| www亚洲人| 精品综合久久久久久97| 欧产日产国产精品视频 | 国产精品sm调教免费专区| 欧美性感一类影片在线播放| 国产乱码精品一区二区三区精东 | 在线免费观看黄色网址| 色综合色综合久久综合频道88| 狠狠操一区二区三区| 国产精品久久久久av免费| 久久久91麻豆精品国产一区| 精品一区二区日本| 国产精品久久久久久影院8一贰佰| 福利在线一区二区| 日本免费新一区视频| 国产精品久久久久av免费| 久久天天久久| 国产欧美日韩伦理| 清纯唯美日韩| 成人在线播放网址| 日本美女视频一区二区| 无码人妻丰满熟妇区毛片蜜桃精品| 91亚洲精品乱码久久久久久蜜桃| 波兰性xxxxx极品hd| 精品国产电影一区| 国产男女裸体做爰爽爽| 精品亚洲一区二区三区在线播放 | 日韩精品一二| 久久在线观看视频| 3d欧美精品动漫xxxx无尽| 97超级碰碰| 青草国产精品| 国产97在线 | 亚洲| 国产剧情一区在线| 国产传媒国产传媒| 偷拍一区二区三区四区| 国产黄色片av| 日韩在线中文字幕| 伊人久久高清| 精品免费国产| 韩国自拍一区| 91丝袜超薄交口足| 国产精品伦一区二区三级视频| 国产精品一区二区三区四| 欧美成人精精品一区二区频| 中文字幕在线视频区| 日韩av片永久免费网站| 香蕉久久夜色精品国产更新时间 | 成年人黄色大片在线| 91视频免费在线| 日韩精品一区二区三区免费观看| 无码人妻丰满熟妇区毛片| av电影一区二区| 日韩黄色免费观看| 5858s免费视频成人| 日本精品在线| 成人在线精品视频| 四季av一区二区凹凸精品| 成年人在线观看视频免费| 国产亚洲欧美中文| 免费av网站在线| 亚洲欧美激情四射在线日| 色在线免费观看| 精品国产一区二区三区麻豆小说 | 国产精品久久精品国产| 女同性一区二区三区人了人一| 日本高清久久久| 国产精品福利一区| 国产精品爽爽久久| 久久视频国产精品免费视频在线| 日韩黄色碟片| 偷拍盗摄高潮叫床对白清晰| 国内精品免费**视频| 乱h高h女3p含苞待放| 宅男在线国产精品| 中文字幕有码在线观看| 1区1区3区4区产品乱码芒果精品| 一区二区三区四区日韩| 久久发布国产伦子伦精品| 亚洲一区二区三区四区中文字幕| 蜜桃91麻豆精品一二三区| 亚州国产精品久久久| 亚洲精品小区久久久久久| 亚洲国产精品毛片av不卡在线| 中国色在线观看另类| 91福利在线观看视频| 麻豆乱码国产一区二区三区| 136国产福利精品导航网址应用| 国产v片免费观看| 久久女同性恋中文字幕| 日本三级一区二区三区| 久久精品视频亚洲| 日韩在线成人| 无罩大乳的熟妇正在播放| 久久久精品tv| 国产精品爽爽久久| 久久人91精品久久久久久不卡| 老司机精品在线| 91香蕉视频污版| 亚洲女性喷水在线观看一区| 四虎永久在线精品免费网址| 国产mv久久久| 亚洲欧美综合久久久| 天堂www中文在线资源| 色婷婷综合久久久久中文 | 亚洲乱码国产乱码精品精可以看 | 精品99在线视频| 国产精品国产a级| 丰满肥臀噗嗤啊x99av| 日韩免费观看网站| 亚洲91中文字幕无线码三区| 制服丝袜第一页在线观看| 在线精品视频小说1| 羞羞视频在线免费国产| 欧美成人在线免费观看| 精品在线观看视频| 日本三级小视频| 久久精品国产亚洲精品| 欧美自拍一区| 国产美女18xxxx免费视频| 午夜精品久久久久久久久久 | 日本xxxx人| 国产精品jizz在线观看麻豆| 欧美日韩免费观看一区=区三区|