交互之外:Netflix在Jupyter筆記本上的創新工作

交互之外:Netflix在Jupyter筆記本上的創新工作

來自專欄論智6 人贊了文章

來源:Netflix技術博客

編譯:weakish

【編者按】Michelle Ufford(Netflix大數據工具負責人)、M Pacer(Netflix工程師、Jupyter核心開發者)、Matthew Seal(Netflix工程師)、Kyle Kelley(Netflix工程師)介紹了Netflix如何拓展Jupyter notebook使用場景,以及為支持新使用場景進行的基礎設施建設。

Jupyter notebook在數據科學家當中十分流行,它是編寫快速原型和進行探索性分析的一種高效工具。在Netflix,我們進一步開疆拓土,重新設想了notebook的形態、適用人群、用途,並且投入很多資源以實現我們的願景。

本文將分享我們的動機,我們為什麼覺得Jupyter notebook這麼有競爭力。本文也將介紹我們的notebook基礎設施的組成部分,同時探索我們在Netflix的一些創新的使用notebook的方式。

如果你比較匆忙,我們建議你直接從使用案例一節開始閱讀。

動機

數據賦能Netflix。數據滲入我們的想法,為我們的決策提供信息,並挑戰我們的假設。數據為在前所未有的尺度上的試驗和創新提供燃料。數據幫助我們發現美妙的內容並向全世界一億三千萬會員提供個性化的體驗。

實現這一切可不是小事一樁;它需要全面的工程支持和基礎設施支撐。每天有超過一萬億事件寫入攝取信息流的過程,經過處理後,再寫入100PB的數據倉庫雲。同時每天運行150000項數據任務,範圍無所不包,從報告分析到機器學習,到推薦演算法。為了支撐如此巨大的尺度上的使用案例,我們創建了一個業界領先的靈活、強大、複雜(必要的複雜性)的數據平台。我們同時創建了補充工具及服務的豐富生態系統,比如Genie(聯合任務執行服務)和Metacat(聯合元存儲)。這些工具簡化了複雜度,使其可以支持全公司範圍廣泛的使用需求。

Netflix的數據角色

譯者註:上圖羅列了Netflix的數據角色,包括商業分析師、數據分析師、量化分析師、演算法工程師、分析工程師、數據工程師、數據科學家、機器學習科學家、研究科學家。

多樣性的數據使用者很令人興奮,但它不是沒有代價的:數據平台——以及配套的工具、服務生態系統——必須支持更多使用案例、語言、訪問模式,等等。為了更好地理解這一問題,考慮3種常見角色:分析工程師、數據科學家、數據工程師。

不同角色(分析工程師、數據科學家、數據工程師)可能選擇不同的工具和語言

一般來說,每種角色依賴不同的工具和語言組合。例如,一個數據工程師可能在IntelliJ中使用Scala創建一個包含數萬億音視頻流事件的新的聚合數據集。一個分析工程師可能使用SQL和Tableau基於這一聚合創建關於全球音視頻流質量的報告。這份報告可能導致一個數據科學家在RStudio下用R編寫一個新的音視頻流壓縮模型。表面上看,這些都是分散的、不存在互補性的工作流程。但是,如果我們深挖一些,我們會發現每個工作流程中都有一些相通的任務:

  • 數據探索 —— 發生在項目早期;可能包括查看樣本數據,運行查詢請求以進行統計分析和探索性分析,以及可視化數據。
  • 數據準備 —— 迭代任務;可能包括清理、標準化、轉換、逆歸一化、聚合數據;通常是整個項目最花時間的任務。
  • 數據校驗 —— 重複任務;可能包括查看樣本數據,運行查詢請求以進行統計分析、聚合分析,以及可視化數據;通常作為數據探索、數據準備、開發、部署前、部署後等階段的一部分。
  • 產品化 —— 發生在項目後期;可能包括部署代碼至生產環境,裝填數據集,訓練模型,校驗數據,規劃工作流程。

為了幫助拓展使用者範圍,我們想要讓這些任務儘可能地省力。為了幫助拓展我們的平台,我們想要最小化需要支持的工具數量。但是怎麼才能做到呢?沒有一個工具可以完成所有這些任務;不僅如此,單個任務經常需要多種工具。然而,當我們再加上一層抽象的時候,在這些工具和語言之上湧現出了一種共同模式:運行代碼,探索數據,呈現結果。

碰巧有一個開源項目正是為此設計的:Jupyter Notebook

Jupyter Notebook

nteract下的Jupyter notebook,其中使用了Vega和Altair可視化

始於2014年的Jupyter項目的目標是創建一組一致的工具,用於科研、可重現工作流程、計算敘述、數據分析。這些工具遷移到業界的效果很不錯,今天Jupyter notebook已經成為數據科學家工具箱的必備之物。Jupyter曾被授予2017年度ACM軟體系統獎,該獎授予對技術概念和商業接受度方面產生了持久影響的軟體系統,歷史上Java、Unix、Web曾獲此獎。

在我們看來,Jupyter notebook極具競爭力,它提供了這些核心功能:

  • 語言無關的內省和執行代碼的消息傳遞協議
  • 描述代碼、代碼輸出、markdown筆記的可編輯文件格式
  • 基於web的用戶界面,以供編寫、運行代碼,以及可視化輸出

Jupyter使用核作為計算引擎,Jupyter協議提供了與核通訊的標準消息傳遞API。這一協議使分離內容編寫(用戶界面)和代碼執行(核)的可組合架構成為可能。通過將運行時從界面中隔離出去,notebook可以在保持配置執行環境的靈活性的同時,跨多語言。如果存在知道如何基於Jupyter協議通訊的語言核,notebook就可以通過與核收發消息來運行代碼。

支撐這一切的是將代碼和結果保存在一起的文件格式。這意味著,無需重新運行代碼,就可以在之後訪問結果。此外,notebook保存了給出上下文的豐富文本。這使notebook成為溝通業務上下文,文檔化假設,注釋代碼,描述結論等的理想格式。

使用案例

在眾多使用案例中,我們現在最常用的用途有三種:數據訪問、notebook模板、計劃notebook。

數據訪問

Netflix最早引入notebook是為了支持數據科學工作流程。隨著越來越多的數據科學家開始使用notebook,我們看到了擴張其工具效應的機會。我們意識到,我們可以利用Jupyter notebook的多功能和架構,拓展其使用範圍為通用的數據訪問。我們從2017年第三季度開始認真對待這一想法,將notebook從小眾工具提升為數據平台的一等公民。

從使用者的角度來說,notebook提供了一個互動式地運行代碼、探索輸出、可視化數據的易用界面——全都可以通過雲端開發環境達成。我們同時維護了一個Python庫,加強了對平台API的訪問。這意味著使用者基本上可以在notebook中編程訪問整個平台。由於notebook的用途廣泛、功能強大、使用方便,我們發現notebook在整個數據平台的各種使用者中間自然而然地快速流行開來。

現在,notebook是Netflix內處理數據最流行的工具。

notebook模板

隨著我們為notebook擴展平台支持,我們開始引入新功能以滿足新使用案例的需求。由此湧現出了參數化notebook。顧名思義,參數化notebook讓你可以指定代碼中的參數,並在運行時輸入數值。這提供了出色的機制,讓使用者可以將notebook定義為可重用的模板。

使用者為這些模板找到的用途出乎意料地多。其中一部分最常見的用途是:

  • 數據科學家: 以不同的係數運行試驗,並總結結果
  • 數據工程師: 作為部署流程的一部分,執行一組數據質量審計
  • 數據分析師: 分享預備好的查詢和可視化,讓股東以比Tableau更深入的方式探索數據
  • 軟體工程師: 每次遇到錯誤,發送排錯腳本的結果到郵箱

計劃notebook

我們利用notebook比較新穎的一種方式是將其作為計劃工作流程的統一層。

由於每個notebook可以運行任意核,我們可以支持使用者定義的任何執行環境。同時因為notebook描述的是分割為單元的線性執行流,我們可以將錯誤映射到具體的單元。這讓使用者可以簡要地描述執行和可視化,以後運行時可以精確地報告結果。

這一範式意味著我們可以用notebook處理互動式工作,之後平滑地遷移到計劃重複運行的工作。這對使用者來說非常方便。許多使用者在單本notebook中構造整個工作流程,當他們準備就緒,可以部署的時候,只需複製/粘貼進一些單獨文件以便計劃執行。將notebook視作邏輯工作流程,讓我們很容易就可以像其他工作流程一樣做計劃。

我們也可以計劃其他種類的工作。執行一項Spark或Presto工作時,插入源代碼至新創建的notebook,然後執行。那本notebook便成為不可更改的歷史紀錄,包含所有東西——源代碼、參數、運行時配置、執行日誌、錯誤信息,等等。調錯時,這提供了一個探查的快捷入口,因為所有相關的信息都在一處,同時notebook可供運行,以便進行互動式調試。

Notebook基礎設施

在Netflix的規模上支持這些使用案例需要全面的基礎設施。我們將簡要介紹其中一些項目。

nteract是基於React的Jupyter notebook用戶界面。它提供了一個簡潔直觀的界面,以及一些改進,例如單元內的工具欄,拖放單元,內建的數據探索工具。

Papermill是用來支持我們之前提到的參數化notebook的工具。Papermill讓我們可以並行執行使用不同參數組合的多本notebook。Papermill還可以收集、總結一組notebook中的指標。

Commuter是一個輕量級的查看、分享notebook的服務。它提供了一個兼容Jupyter的內容API,使得讀取本地或遠程(Amazon S3)的notebook一樣方便。它同時提供了一個目錄瀏覽器,以供查找和分享notebook。

Titus是一個容器管理平台,支持可伸縮、可靠的容器執行,同時集成了Amazon AWS服務。Titus是Netflix內部創建的工具,並用於生產環境(串流、推薦、內容系統)。

我們將在後續的文章中更深入地探索這些基礎設施。現在,讓我們重點關注三個基礎組件:存儲、計算、界面。

Netflix的notebook基礎設施

存儲

Netflix數據平台使用Amazon S3和EFS作為雲存儲,notebook視為虛擬文件系統。這意味著每個使用者在EFS上有一個家目錄,其中包含了notebook工作區。這個工作區中存放了所有用戶創建、上傳的notebook。當使用者互動式地運行notebook時,所有的讀寫活動發生在工作區中。[workspace + filename]的組合構成notebook的命名空間,例如/efs/users/kylek/notebooks/MySparkJob.ipynb。這一命名空間用於查看、分享、計劃notebook。這一慣例可以防止名稱衝突,同時從中了解使用者是誰以及notebook在EFS卷中的位置也很容易。

工作區路徑可以為使用者抽象掉雲存儲的複雜性。例如,在列出目錄的時候,只顯示notebook的文件名,如MySparkJob.ipynb。在終端下則可以通過~/notebooks/MySparkJob.ipynb訪問這一文件。

notebook存儲和訪問

當使用者計劃一本notebook時,調度程序會從EFS複製使用者的notebook到S3的共享目錄。S3上的notebook成為調度程序信任的源notebook。調度程序每次運行notebook時,基於源notebook初始化一本新notebook。新notebook是實際執行的notebook,並成為這次執行的不可更改的記錄,包括代碼、輸出、日誌。我們稱之為輸出notebook

Netflix的工作以協作為基礎。因此使用者開始分享notebook的URL一點也不讓人吃驚。隨著這一做法的流行,我們經常碰到因為多人同時訪問同一notebook而導致的意外覆蓋。使用者希望能以只讀的方式分享活躍的notebook。這導致我們創建了commuter。commuter在幕後提供了Jupyter兼容的/files/api/contens API,以列出目錄內容,查看文件內容,訪問文件元數據。這意味著使用者可以安全地查看notebook,無需擔心影響生產環境的工作或正在運行的notebook。

計算

管理計算資源是處理數據最有挑戰性的部分之一。在Netflix尤其如此,因為我們在AWS上部署了一個高伸縮性的容器化架構。數據平台的所有工作運行在容器中——包括查詢、數據流、notebook。因此我們很自然地想要抽象掉儘可能多的複雜性。

使用者運行notebook服務時會配備一個容器。我們默認分配的容器資源可以滿足大約87.3%的執行模式。資源不夠用的時候,使用者可以通過簡單的界面請求更多資源。

我們同時也通過預先準備好的容器鏡像提供統一的執行環境。鏡像預裝了常用庫和一組默認核。並不是鏡像中的一切都是靜態的——我們的核會拉取最新版本的Spack以及最新的平台集群配置。預先準備好的鏡像減少了新建notebook所需的配置時間和麻煩,並且在一般情況下保持了單一的執行環境。

這一切背後的功臣是我們的Docker容器服務Titus。我們進一步在服務中封裝了用戶特定的服務配置和鏡像。鏡像種同時包括用戶的安全組和角色,以及所包含的庫常用的環境變數。這意味著使用者可以在基礎設施上花更少的時間,在數據上花更多的時間。

界面

之前提到了我們的願景,讓notebook成為處理數據的標準工具。但這帶來了一項有意思的挑戰:單一界面如何支持所有使用者?我們仍然不完全清楚這個問題的答案,但已經有了一些想法。

我們需要一個直觀的用戶界面,極簡主義風格的美學,也需要精心斟酌的用戶體驗,使困難的事情容易做到。nteract遵循這一理念,將簡單性和組合性作為核心設計原則。這使得nteract成為我們想要做的工作的理想構件。

我們最常從使用者那裡聽到的抱怨之一是缺乏跨語言的原生數據可視化,使用Python之外的語言的人特別愛抱怨這一點。nteract的數據探索工具提供了語言無關的迅速探索數據的方式。之前我們說過,要讓困難的事情容易做到,這是一個很好的例子。

你可以在MyBinder的樣例notebook上直接體驗數據探索工具的效果:(注意:載入可能需要花一分鐘)

mybinder.org/v2/gh/nter

使用nteract的數據探索工具可視化世界幸福感報告數據集

我們也引入了參數表示的原生支持,這使得計劃notebook和創建可重用模板更加容易了。

nteract原生支持參數化notebook

儘管notebook已經在Netflix提供了大量價值,其實一切才剛剛開始。我們需要在前端和後端投入更多以提升notebook總的體驗。我們接下來12個月的工作將聚焦在提升可靠性、可見性和協作性上。上下文環境對使用者來說是第一位的,因此我們正致力於提升可見性,包括集群狀態、核狀態、工作歷史,等等。我們同時致力於自動版本控制,原生應用內計劃,更好地支持可視化Spark的DataFrame,更穩定的Scala核。我們將在之後的博客文章中討論這些工作的細節。

開源項目

Netflix一貫倡導開放源代碼。我們高度評價開源協作種湧現的活力、開放標準、想法交流。許多我們為Netflix數據平台開發的應用已經開源。同時,我們不打算創建一次性的解決方案,或屈從於「非我所創」的心態。只要有可能,我們利用現有的開源項目,並向其貢獻代碼,例如Spark、Jupyter、pandas。

我們之前描述的基礎設施重度依賴Jupyter項目的生態系統,但也有一些分歧之處。最主要的是我們選擇了nteract作為Netflix的notebook用戶界面。我們做出這一決定有很多原因,包括對齊我們的技術棧和設計哲學。隨著我們突破notebook可以做什麼的限制,我們很可能會創建新工具、庫、服務。這些作為nteract生態系統組成部分的項目也將開源。

我們認識到對Netflix有意義的東西不一定對所有人有意義。因此我們在設計這些項目的時候考慮了模塊性。這樣,你可以只選用對你的環境有意義的組件,例如Papermill,而不用投入整個Netflix的notebook生態系統。

後續

作為一個平台團隊,我們的責任是讓Netflix人可以在數據上做出令人驚嘆的東西。notebook在Netflix已經有了驚人的影響力。隨著我們在這一領域的更多投入,我們很興奮,能看到這一影響的擴大。如果你希望成為我們的一員,可以看看我們的招聘頁面。

呀!感謝你耐心讀完這篇長文。不過本文只是浮光掠影地介紹了我們在notebook上做的工作。在後續的博客文章中,我們將更深入地探索notebook計劃背後的架構。在這篇文章發布之前,你可以通過以下途徑了解更多Netflix在數據上做什麼,怎麼做:

  • Twitter上的NetflixData賬號
  • YouTube上的Netflix Data頻道
  • Netflix Research網站:research.netflix.com

同時我們也樂不可支地贊助今年的JupyterCon。我們的工程師將在JupyterCon上做5場演講:

  • 8/22 1:30 PM, How to Build on top of Jupyter』s Protocols, Kyle Kelley
  • 8/23 1:50 PM, Scheduled Notebooks: Manageable and traceable code execution, Matthew Seal
  • 8/23 2:40 PM, Notebooks @ Netflix: From Analytics to Engineering, Michelle Ufford, Kyle Kelley
  • 8/23 5:00 PM, Making beautiful objects with Jupyter, M Pacer
  • 8/24 2:40 PM, Jupyter』s configuration system, M Pacer等
  • 8/25 9AM?—?5PM JupyterCon Community Sprint Day

推薦閱讀:

TAG:數據科學 | JupyterNotebookIPythonNotebook | Netflix |