' 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks '

"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

故事的起源

在考慮分析工具的未來時,我們最初問了自己幾個基本問題:

· 數據科學家將使用什麼接口將統計分析的結果與業務通信?

· 數據工程師如何編寫代碼以確保每小時運行一次?

· 機器學習工程師如何封裝他們的同事可以重用的模型迭代?

我們還想知道:是否有一個工具可以支持所有這些場景?

"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

故事的起源

在考慮分析工具的未來時,我們最初問了自己幾個基本問題:

· 數據科學家將使用什麼接口將統計分析的結果與業務通信?

· 數據工程師如何編寫代碼以確保每小時運行一次?

· 機器學習工程師如何封裝他們的同事可以重用的模型迭代?

我們還想知道:是否有一個工具可以支持所有這些場景?

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

一個有希望的工具是Jupyter notebook。在Netflix,Notebooks已經被用於數據科學,但也越來越多地用於其他類型的工作負載。由於其靈活性和高擴展性,加上其龐大而充滿活力的開源社區,Notebooks是一個引人注目的選擇。因此,我們深入研究瞭如何將其用作用戶的公共接口。

Notebooks本質上是託管的JSON文檔,具有一個簡單的接口來執行其中的代碼。他們擅長通過單元來表達迭代的工作單元,這使得報告和執行隔離更加容易。此外,使用不同的內核,Notebooks可以支持多種語言和執行模式。這些屬性意味著我們可以為高級用戶公開任意級別的複雜性,同時為消費者呈現更容易遵循的敘述——所有這些都在一個文檔中。

我們知道,我們選擇的任何工具都需要能夠調度工作負載。隨著Jupyter notebook的潛力越來越明顯,我們開始考慮如何安排一個Notebooks。Notebooks的特性雖然非常適合交互式工作,但卻不適合按計劃執行。如果您已經熟悉Notebooks—包括它們的優點和缺點—您甚至可能認為我們將所有etl工作負載都轉移到Notebooks上有點瘋狂。

戰勝苦難

從表面上看,Notebook帶來了很多挑戰:它們經常被更改,它們的單元輸出不需要匹配代碼,它們很難測試,而且沒有簡單的方法來動態配置它們的執行。此外,您需要一個Notebook服務器來運行它們,這將創建體系結構依賴項來促進執行。這些問題引起了一些內部對這個想法的反對。但隨著我們為Notebook生態系統引入新的工具,這種情況已經發生了變化。

對我們來說,最大的遊戲規則改變者是Papermill(https://github.com/nteract/papermill)。Papermill是一個nteract庫,它考慮到生產生態系統,為Notebook的可配置和可靠執行而構建。Papermill的工作相當簡單。它採用一個Papermill路徑和一些參數輸入,然後使用呈現的輸入執行請求的Papermill。當每個單元執行時,它將生成的工件保存到一個單獨的輸出Papermill中。

"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

故事的起源

在考慮分析工具的未來時,我們最初問了自己幾個基本問題:

· 數據科學家將使用什麼接口將統計分析的結果與業務通信?

· 數據工程師如何編寫代碼以確保每小時運行一次?

· 機器學習工程師如何封裝他們的同事可以重用的模型迭代?

我們還想知道:是否有一個工具可以支持所有這些場景?

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

一個有希望的工具是Jupyter notebook。在Netflix,Notebooks已經被用於數據科學,但也越來越多地用於其他類型的工作負載。由於其靈活性和高擴展性,加上其龐大而充滿活力的開源社區,Notebooks是一個引人注目的選擇。因此,我們深入研究瞭如何將其用作用戶的公共接口。

Notebooks本質上是託管的JSON文檔,具有一個簡單的接口來執行其中的代碼。他們擅長通過單元來表達迭代的工作單元,這使得報告和執行隔離更加容易。此外,使用不同的內核,Notebooks可以支持多種語言和執行模式。這些屬性意味著我們可以為高級用戶公開任意級別的複雜性,同時為消費者呈現更容易遵循的敘述——所有這些都在一個文檔中。

我們知道,我們選擇的任何工具都需要能夠調度工作負載。隨著Jupyter notebook的潛力越來越明顯,我們開始考慮如何安排一個Notebooks。Notebooks的特性雖然非常適合交互式工作,但卻不適合按計劃執行。如果您已經熟悉Notebooks—包括它們的優點和缺點—您甚至可能認為我們將所有etl工作負載都轉移到Notebooks上有點瘋狂。

戰勝苦難

從表面上看,Notebook帶來了很多挑戰:它們經常被更改,它們的單元輸出不需要匹配代碼,它們很難測試,而且沒有簡單的方法來動態配置它們的執行。此外,您需要一個Notebook服務器來運行它們,這將創建體系結構依賴項來促進執行。這些問題引起了一些內部對這個想法的反對。但隨著我們為Notebook生態系統引入新的工具,這種情況已經發生了變化。

對我們來說,最大的遊戲規則改變者是Papermill(https://github.com/nteract/papermill)。Papermill是一個nteract庫,它考慮到生產生態系統,為Notebook的可配置和可靠執行而構建。Papermill的工作相當簡單。它採用一個Papermill路徑和一些參數輸入,然後使用呈現的輸入執行請求的Papermill。當每個單元執行時,它將生成的工件保存到一個單獨的輸出Papermill中。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

Papermill使我們在處理Notebook文檔時實現範例更改。由於Papermill不修改源Notebook,所以我們在工作定義中添加了一個函數屬性——這通常是Notebook空間中缺少的。我們的輸入(一個notebook JSON文檔和輸入參數)被視為不可變記錄,用於生成不可變輸出文檔的執行。該單個輸出文檔提供了執行的代碼、每個代碼單元的輸出和日誌,以及一個可重複的模板,可以在將來的任何時候輕鬆地重新運行該模板。

Papermill的另一個特點是它可以從很多地方讀寫。這使我們能夠存儲我們的輸出Notebook與高耐用性和方便的訪問,以提供一個可靠的管道。今天,我們默認將輸出Notebook存儲到一個s3 bucket中,這個bucket由commuter(https://github.com/nteract/commuter)管理,這是nteract的另一個項目,它提供筆記本的只讀顯示。

因此,無論哪個系統最支持我們的用戶,輸出Notebook都可以成為獨立的記錄。這使得分析作業或相關工作就像鏈接到服務或S3前綴一樣簡單。用戶可以使用這些鏈接來調試問題、檢查結果和創建新模板,而不會影響原始工作流。

此外,由於Papermill控制自己的運行時進程,我們不需要任何notebook服務器或其他基礎設施來針對notebook內核執行。這消除了託管Notebook服務帶來的一些複雜性,因為我們是在更簡單的上下文中執行的。

"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

故事的起源

在考慮分析工具的未來時,我們最初問了自己幾個基本問題:

· 數據科學家將使用什麼接口將統計分析的結果與業務通信?

· 數據工程師如何編寫代碼以確保每小時運行一次?

· 機器學習工程師如何封裝他們的同事可以重用的模型迭代?

我們還想知道:是否有一個工具可以支持所有這些場景?

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

一個有希望的工具是Jupyter notebook。在Netflix,Notebooks已經被用於數據科學,但也越來越多地用於其他類型的工作負載。由於其靈活性和高擴展性,加上其龐大而充滿活力的開源社區,Notebooks是一個引人注目的選擇。因此,我們深入研究瞭如何將其用作用戶的公共接口。

Notebooks本質上是託管的JSON文檔,具有一個簡單的接口來執行其中的代碼。他們擅長通過單元來表達迭代的工作單元,這使得報告和執行隔離更加容易。此外,使用不同的內核,Notebooks可以支持多種語言和執行模式。這些屬性意味著我們可以為高級用戶公開任意級別的複雜性,同時為消費者呈現更容易遵循的敘述——所有這些都在一個文檔中。

我們知道,我們選擇的任何工具都需要能夠調度工作負載。隨著Jupyter notebook的潛力越來越明顯,我們開始考慮如何安排一個Notebooks。Notebooks的特性雖然非常適合交互式工作,但卻不適合按計劃執行。如果您已經熟悉Notebooks—包括它們的優點和缺點—您甚至可能認為我們將所有etl工作負載都轉移到Notebooks上有點瘋狂。

戰勝苦難

從表面上看,Notebook帶來了很多挑戰:它們經常被更改,它們的單元輸出不需要匹配代碼,它們很難測試,而且沒有簡單的方法來動態配置它們的執行。此外,您需要一個Notebook服務器來運行它們,這將創建體系結構依賴項來促進執行。這些問題引起了一些內部對這個想法的反對。但隨著我們為Notebook生態系統引入新的工具,這種情況已經發生了變化。

對我們來說,最大的遊戲規則改變者是Papermill(https://github.com/nteract/papermill)。Papermill是一個nteract庫,它考慮到生產生態系統,為Notebook的可配置和可靠執行而構建。Papermill的工作相當簡單。它採用一個Papermill路徑和一些參數輸入,然後使用呈現的輸入執行請求的Papermill。當每個單元執行時,它將生成的工件保存到一個單獨的輸出Papermill中。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

Papermill使我們在處理Notebook文檔時實現範例更改。由於Papermill不修改源Notebook,所以我們在工作定義中添加了一個函數屬性——這通常是Notebook空間中缺少的。我們的輸入(一個notebook JSON文檔和輸入參數)被視為不可變記錄,用於生成不可變輸出文檔的執行。該單個輸出文檔提供了執行的代碼、每個代碼單元的輸出和日誌,以及一個可重複的模板,可以在將來的任何時候輕鬆地重新運行該模板。

Papermill的另一個特點是它可以從很多地方讀寫。這使我們能夠存儲我們的輸出Notebook與高耐用性和方便的訪問,以提供一個可靠的管道。今天,我們默認將輸出Notebook存儲到一個s3 bucket中,這個bucket由commuter(https://github.com/nteract/commuter)管理,這是nteract的另一個項目,它提供筆記本的只讀顯示。

因此,無論哪個系統最支持我們的用戶,輸出Notebook都可以成為獨立的記錄。這使得分析作業或相關工作就像鏈接到服務或S3前綴一樣簡單。用戶可以使用這些鏈接來調試問題、檢查結果和創建新模板,而不會影響原始工作流。

此外,由於Papermill控制自己的運行時進程,我們不需要任何notebook服務器或其他基礎設施來針對notebook內核執行。這消除了託管Notebook服務帶來的一些複雜性,因為我們是在更簡單的上下文中執行的。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

為了進一步提高notebook的可靠性,我們將notebook推入git,並在對使用Papermill的notebook進行測試後才將其推廣到生產服務中。如果一個notebook變得太複雜而不容易測試,我們有一個本地存儲庫,我們可以將代碼合併到一個更傳統的包中。這使我們能夠在將notebook作為傳統代碼推廣方面獲得常規CI工具的好處,但仍然允許我們使用notebook作為集成工具進行探索和迭代。

因此,我們的notebook被版本化,在執行之前和之後作為不可變的記錄推送到可靠的數據存儲中,在它們可用之前進行測試,並在運行時使專門化參數化。用戶友好但不可靠的notebook格式現在對於我們的數據管道來說是可靠的,而且相對於非notebook執行模式,我們獲得了一個關鍵的改進:我們的輸入和輸出是完整的文檔,完全可執行,並且可以在同一個界面中共享。

Notebook Scheduling

即使有一個支持測試、版本控制和Notebook顯示的平臺,我們仍然缺少一個關鍵組件,以使用戶能夠定期運行帶有觸發執行的工作——或者更簡單地說,我們需要一個調度層。通過web界面執行一個Notebook對於用戶的視覺反饋和反應性反饋非常好,但是一旦你有了工作,你就需要一個工具來代替你執行。

這個方程的執行面用Papermill是容易的。我們可以計算運行時參數並將它們注入到Notebook中,運行Papermill,並將結果存儲到數據倉庫中。該體系結構將參數化的Papermill與調度解耦,在選擇調度程序時提供了靈活性。因此,幾乎任何cron字符串和/或事件消費工具都可以運行我們到目前為止設置的工作。

"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

故事的起源

在考慮分析工具的未來時,我們最初問了自己幾個基本問題:

· 數據科學家將使用什麼接口將統計分析的結果與業務通信?

· 數據工程師如何編寫代碼以確保每小時運行一次?

· 機器學習工程師如何封裝他們的同事可以重用的模型迭代?

我們還想知道:是否有一個工具可以支持所有這些場景?

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

一個有希望的工具是Jupyter notebook。在Netflix,Notebooks已經被用於數據科學,但也越來越多地用於其他類型的工作負載。由於其靈活性和高擴展性,加上其龐大而充滿活力的開源社區,Notebooks是一個引人注目的選擇。因此,我們深入研究瞭如何將其用作用戶的公共接口。

Notebooks本質上是託管的JSON文檔,具有一個簡單的接口來執行其中的代碼。他們擅長通過單元來表達迭代的工作單元,這使得報告和執行隔離更加容易。此外,使用不同的內核,Notebooks可以支持多種語言和執行模式。這些屬性意味著我們可以為高級用戶公開任意級別的複雜性,同時為消費者呈現更容易遵循的敘述——所有這些都在一個文檔中。

我們知道,我們選擇的任何工具都需要能夠調度工作負載。隨著Jupyter notebook的潛力越來越明顯,我們開始考慮如何安排一個Notebooks。Notebooks的特性雖然非常適合交互式工作,但卻不適合按計劃執行。如果您已經熟悉Notebooks—包括它們的優點和缺點—您甚至可能認為我們將所有etl工作負載都轉移到Notebooks上有點瘋狂。

戰勝苦難

從表面上看,Notebook帶來了很多挑戰:它們經常被更改,它們的單元輸出不需要匹配代碼,它們很難測試,而且沒有簡單的方法來動態配置它們的執行。此外,您需要一個Notebook服務器來運行它們,這將創建體系結構依賴項來促進執行。這些問題引起了一些內部對這個想法的反對。但隨著我們為Notebook生態系統引入新的工具,這種情況已經發生了變化。

對我們來說,最大的遊戲規則改變者是Papermill(https://github.com/nteract/papermill)。Papermill是一個nteract庫,它考慮到生產生態系統,為Notebook的可配置和可靠執行而構建。Papermill的工作相當簡單。它採用一個Papermill路徑和一些參數輸入,然後使用呈現的輸入執行請求的Papermill。當每個單元執行時,它將生成的工件保存到一個單獨的輸出Papermill中。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

Papermill使我們在處理Notebook文檔時實現範例更改。由於Papermill不修改源Notebook,所以我們在工作定義中添加了一個函數屬性——這通常是Notebook空間中缺少的。我們的輸入(一個notebook JSON文檔和輸入參數)被視為不可變記錄,用於生成不可變輸出文檔的執行。該單個輸出文檔提供了執行的代碼、每個代碼單元的輸出和日誌,以及一個可重複的模板,可以在將來的任何時候輕鬆地重新運行該模板。

Papermill的另一個特點是它可以從很多地方讀寫。這使我們能夠存儲我們的輸出Notebook與高耐用性和方便的訪問,以提供一個可靠的管道。今天,我們默認將輸出Notebook存儲到一個s3 bucket中,這個bucket由commuter(https://github.com/nteract/commuter)管理,這是nteract的另一個項目,它提供筆記本的只讀顯示。

因此,無論哪個系統最支持我們的用戶,輸出Notebook都可以成為獨立的記錄。這使得分析作業或相關工作就像鏈接到服務或S3前綴一樣簡單。用戶可以使用這些鏈接來調試問題、檢查結果和創建新模板,而不會影響原始工作流。

此外,由於Papermill控制自己的運行時進程,我們不需要任何notebook服務器或其他基礎設施來針對notebook內核執行。這消除了託管Notebook服務帶來的一些複雜性,因為我們是在更簡單的上下文中執行的。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

為了進一步提高notebook的可靠性,我們將notebook推入git,並在對使用Papermill的notebook進行測試後才將其推廣到生產服務中。如果一個notebook變得太複雜而不容易測試,我們有一個本地存儲庫,我們可以將代碼合併到一個更傳統的包中。這使我們能夠在將notebook作為傳統代碼推廣方面獲得常規CI工具的好處,但仍然允許我們使用notebook作為集成工具進行探索和迭代。

因此,我們的notebook被版本化,在執行之前和之後作為不可變的記錄推送到可靠的數據存儲中,在它們可用之前進行測試,並在運行時使專門化參數化。用戶友好但不可靠的notebook格式現在對於我們的數據管道來說是可靠的,而且相對於非notebook執行模式,我們獲得了一個關鍵的改進:我們的輸入和輸出是完整的文檔,完全可執行,並且可以在同一個界面中共享。

Notebook Scheduling

即使有一個支持測試、版本控制和Notebook顯示的平臺,我們仍然缺少一個關鍵組件,以使用戶能夠定期運行帶有觸發執行的工作——或者更簡單地說,我們需要一個調度層。通過web界面執行一個Notebook對於用戶的視覺反饋和反應性反饋非常好,但是一旦你有了工作,你就需要一個工具來代替你執行。

這個方程的執行面用Papermill是容易的。我們可以計算運行時參數並將它們注入到Notebook中,運行Papermill,並將結果存儲到數據倉庫中。該體系結構將參數化的Papermill與調度解耦,在選擇調度程序時提供了靈活性。因此,幾乎任何cron字符串和/或事件消費工具都可以運行我們到目前為止設置的工作。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

這意味著只要有一些基本功能,就可以輕鬆地調度Notebook。相反,您將在這裡花費精力選擇您最關心的調度程序的次要屬性。您可能希望重用團隊已經熟悉的工具,或者選擇滿足其他操作需求。如果您沒有首選的調度器,或者以前沒有使用過調度器,那麼Airflow(https://airflow.apache.org/project.html)是一個開源工具,可以很好地發揮這個作用。

在我們的例子中,我們關心的次要屬性是:

· 為外部事件觸發或等待功能

· 能夠在受控執行環境中啟動(例如Docker)

· 捕獲並公開關於執行和失敗的度量

· 併發控制

· 動態重試的可配置性

· 可靠性團隊代表用戶進行調解的能力

這些需求給我們留下了一些可以考慮的潛在選項,包括開源和閉源解決方案。在徹底研究了我們的選項之後,我們選擇了Netflix開發的一個名為Meson(https://airflow.apache.org/project.html)的調度程序。Meson是一個通用工作流編排和調度框架,用於跨異構系統執行ML管道。我們選擇Meson的主要原因之一是它對Netflix現有基於雲的基礎設施(包括我們的數據平臺)的深度支持。

用戶工作流程

有了適當的調度程序,開發人員將如何看待這一點?讓我們研究一個假設的數據工作流。假設我們希望按設備類型聚合視頻播放,以瞭解我們的成員使用哪些設備來觀看內容。因為我們是全球性的,所以我們需要按地區劃分聚合,這樣我們就可以瞭解世界各地最流行的設備。而且,一旦每天的結果準備好了,我們想把更新後的報告推送給我們的分析師。

首先,我們需要一個工作流程的時間表。假設每天凌晨2點。大多數調度程序接受crontab作為調度觸發器,因此一個0 2 * * *就滿足了這個要求。

接下來,我們需要將工作分解為邏輯工作單元。我們希望收集數據,聚合數據,並向用戶報告結果。為了表示這項工作,我們將定義一個DAG(https://en.wikipedia.org/wiki/Directed_acyclic_graph),其中每個作業都表示為圖中的一個節點,每條邊表示成功運行後的下一個作業。

"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

故事的起源

在考慮分析工具的未來時,我們最初問了自己幾個基本問題:

· 數據科學家將使用什麼接口將統計分析的結果與業務通信?

· 數據工程師如何編寫代碼以確保每小時運行一次?

· 機器學習工程師如何封裝他們的同事可以重用的模型迭代?

我們還想知道:是否有一個工具可以支持所有這些場景?

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

一個有希望的工具是Jupyter notebook。在Netflix,Notebooks已經被用於數據科學,但也越來越多地用於其他類型的工作負載。由於其靈活性和高擴展性,加上其龐大而充滿活力的開源社區,Notebooks是一個引人注目的選擇。因此,我們深入研究瞭如何將其用作用戶的公共接口。

Notebooks本質上是託管的JSON文檔,具有一個簡單的接口來執行其中的代碼。他們擅長通過單元來表達迭代的工作單元,這使得報告和執行隔離更加容易。此外,使用不同的內核,Notebooks可以支持多種語言和執行模式。這些屬性意味著我們可以為高級用戶公開任意級別的複雜性,同時為消費者呈現更容易遵循的敘述——所有這些都在一個文檔中。

我們知道,我們選擇的任何工具都需要能夠調度工作負載。隨著Jupyter notebook的潛力越來越明顯,我們開始考慮如何安排一個Notebooks。Notebooks的特性雖然非常適合交互式工作,但卻不適合按計劃執行。如果您已經熟悉Notebooks—包括它們的優點和缺點—您甚至可能認為我們將所有etl工作負載都轉移到Notebooks上有點瘋狂。

戰勝苦難

從表面上看,Notebook帶來了很多挑戰:它們經常被更改,它們的單元輸出不需要匹配代碼,它們很難測試,而且沒有簡單的方法來動態配置它們的執行。此外,您需要一個Notebook服務器來運行它們,這將創建體系結構依賴項來促進執行。這些問題引起了一些內部對這個想法的反對。但隨著我們為Notebook生態系統引入新的工具,這種情況已經發生了變化。

對我們來說,最大的遊戲規則改變者是Papermill(https://github.com/nteract/papermill)。Papermill是一個nteract庫,它考慮到生產生態系統,為Notebook的可配置和可靠執行而構建。Papermill的工作相當簡單。它採用一個Papermill路徑和一些參數輸入,然後使用呈現的輸入執行請求的Papermill。當每個單元執行時,它將生成的工件保存到一個單獨的輸出Papermill中。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

Papermill使我們在處理Notebook文檔時實現範例更改。由於Papermill不修改源Notebook,所以我們在工作定義中添加了一個函數屬性——這通常是Notebook空間中缺少的。我們的輸入(一個notebook JSON文檔和輸入參數)被視為不可變記錄,用於生成不可變輸出文檔的執行。該單個輸出文檔提供了執行的代碼、每個代碼單元的輸出和日誌,以及一個可重複的模板,可以在將來的任何時候輕鬆地重新運行該模板。

Papermill的另一個特點是它可以從很多地方讀寫。這使我們能夠存儲我們的輸出Notebook與高耐用性和方便的訪問,以提供一個可靠的管道。今天,我們默認將輸出Notebook存儲到一個s3 bucket中,這個bucket由commuter(https://github.com/nteract/commuter)管理,這是nteract的另一個項目,它提供筆記本的只讀顯示。

因此,無論哪個系統最支持我們的用戶,輸出Notebook都可以成為獨立的記錄。這使得分析作業或相關工作就像鏈接到服務或S3前綴一樣簡單。用戶可以使用這些鏈接來調試問題、檢查結果和創建新模板,而不會影響原始工作流。

此外,由於Papermill控制自己的運行時進程,我們不需要任何notebook服務器或其他基礎設施來針對notebook內核執行。這消除了託管Notebook服務帶來的一些複雜性,因為我們是在更簡單的上下文中執行的。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

為了進一步提高notebook的可靠性,我們將notebook推入git,並在對使用Papermill的notebook進行測試後才將其推廣到生產服務中。如果一個notebook變得太複雜而不容易測試,我們有一個本地存儲庫,我們可以將代碼合併到一個更傳統的包中。這使我們能夠在將notebook作為傳統代碼推廣方面獲得常規CI工具的好處,但仍然允許我們使用notebook作為集成工具進行探索和迭代。

因此,我們的notebook被版本化,在執行之前和之後作為不可變的記錄推送到可靠的數據存儲中,在它們可用之前進行測試,並在運行時使專門化參數化。用戶友好但不可靠的notebook格式現在對於我們的數據管道來說是可靠的,而且相對於非notebook執行模式,我們獲得了一個關鍵的改進:我們的輸入和輸出是完整的文檔,完全可執行,並且可以在同一個界面中共享。

Notebook Scheduling

即使有一個支持測試、版本控制和Notebook顯示的平臺,我們仍然缺少一個關鍵組件,以使用戶能夠定期運行帶有觸發執行的工作——或者更簡單地說,我們需要一個調度層。通過web界面執行一個Notebook對於用戶的視覺反饋和反應性反饋非常好,但是一旦你有了工作,你就需要一個工具來代替你執行。

這個方程的執行面用Papermill是容易的。我們可以計算運行時參數並將它們注入到Notebook中,運行Papermill,並將結果存儲到數據倉庫中。該體系結構將參數化的Papermill與調度解耦,在選擇調度程序時提供了靈活性。因此,幾乎任何cron字符串和/或事件消費工具都可以運行我們到目前為止設置的工作。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

這意味著只要有一些基本功能,就可以輕鬆地調度Notebook。相反,您將在這裡花費精力選擇您最關心的調度程序的次要屬性。您可能希望重用團隊已經熟悉的工具,或者選擇滿足其他操作需求。如果您沒有首選的調度器,或者以前沒有使用過調度器,那麼Airflow(https://airflow.apache.org/project.html)是一個開源工具,可以很好地發揮這個作用。

在我們的例子中,我們關心的次要屬性是:

· 為外部事件觸發或等待功能

· 能夠在受控執行環境中啟動(例如Docker)

· 捕獲並公開關於執行和失敗的度量

· 併發控制

· 動態重試的可配置性

· 可靠性團隊代表用戶進行調解的能力

這些需求給我們留下了一些可以考慮的潛在選項,包括開源和閉源解決方案。在徹底研究了我們的選項之後,我們選擇了Netflix開發的一個名為Meson(https://airflow.apache.org/project.html)的調度程序。Meson是一個通用工作流編排和調度框架,用於跨異構系統執行ML管道。我們選擇Meson的主要原因之一是它對Netflix現有基於雲的基礎設施(包括我們的數據平臺)的深度支持。

用戶工作流程

有了適當的調度程序,開發人員將如何看待這一點?讓我們研究一個假設的數據工作流。假設我們希望按設備類型聚合視頻播放,以瞭解我們的成員使用哪些設備來觀看內容。因為我們是全球性的,所以我們需要按地區劃分聚合,這樣我們就可以瞭解世界各地最流行的設備。而且,一旦每天的結果準備好了,我們想把更新後的報告推送給我們的分析師。

首先,我們需要一個工作流程的時間表。假設每天凌晨2點。大多數調度程序接受crontab作為調度觸發器,因此一個0 2 * * *就滿足了這個要求。

接下來,我們需要將工作分解為邏輯工作單元。我們希望收集數據,聚合數據,並向用戶報告結果。為了表示這項工作,我們將定義一個DAG(https://en.wikipedia.org/wiki/Directed_acyclic_graph),其中每個作業都表示為圖中的一個節點,每條邊表示成功運行後的下一個作業。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

在這種情況下,我們需要四個Notebook。一個是收集我們的輸入數據。一是用地理信息增強我們的原始數據。每個區域參數化一個。一個是把我們的研究結果寫進報告。例如,我們的聚合Notebook可能有一個參數化的執行,比如:

"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

故事的起源

在考慮分析工具的未來時,我們最初問了自己幾個基本問題:

· 數據科學家將使用什麼接口將統計分析的結果與業務通信?

· 數據工程師如何編寫代碼以確保每小時運行一次?

· 機器學習工程師如何封裝他們的同事可以重用的模型迭代?

我們還想知道:是否有一個工具可以支持所有這些場景?

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

一個有希望的工具是Jupyter notebook。在Netflix,Notebooks已經被用於數據科學,但也越來越多地用於其他類型的工作負載。由於其靈活性和高擴展性,加上其龐大而充滿活力的開源社區,Notebooks是一個引人注目的選擇。因此,我們深入研究瞭如何將其用作用戶的公共接口。

Notebooks本質上是託管的JSON文檔,具有一個簡單的接口來執行其中的代碼。他們擅長通過單元來表達迭代的工作單元,這使得報告和執行隔離更加容易。此外,使用不同的內核,Notebooks可以支持多種語言和執行模式。這些屬性意味著我們可以為高級用戶公開任意級別的複雜性,同時為消費者呈現更容易遵循的敘述——所有這些都在一個文檔中。

我們知道,我們選擇的任何工具都需要能夠調度工作負載。隨著Jupyter notebook的潛力越來越明顯,我們開始考慮如何安排一個Notebooks。Notebooks的特性雖然非常適合交互式工作,但卻不適合按計劃執行。如果您已經熟悉Notebooks—包括它們的優點和缺點—您甚至可能認為我們將所有etl工作負載都轉移到Notebooks上有點瘋狂。

戰勝苦難

從表面上看,Notebook帶來了很多挑戰:它們經常被更改,它們的單元輸出不需要匹配代碼,它們很難測試,而且沒有簡單的方法來動態配置它們的執行。此外,您需要一個Notebook服務器來運行它們,這將創建體系結構依賴項來促進執行。這些問題引起了一些內部對這個想法的反對。但隨著我們為Notebook生態系統引入新的工具,這種情況已經發生了變化。

對我們來說,最大的遊戲規則改變者是Papermill(https://github.com/nteract/papermill)。Papermill是一個nteract庫,它考慮到生產生態系統,為Notebook的可配置和可靠執行而構建。Papermill的工作相當簡單。它採用一個Papermill路徑和一些參數輸入,然後使用呈現的輸入執行請求的Papermill。當每個單元執行時,它將生成的工件保存到一個單獨的輸出Papermill中。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

Papermill使我們在處理Notebook文檔時實現範例更改。由於Papermill不修改源Notebook,所以我們在工作定義中添加了一個函數屬性——這通常是Notebook空間中缺少的。我們的輸入(一個notebook JSON文檔和輸入參數)被視為不可變記錄,用於生成不可變輸出文檔的執行。該單個輸出文檔提供了執行的代碼、每個代碼單元的輸出和日誌,以及一個可重複的模板,可以在將來的任何時候輕鬆地重新運行該模板。

Papermill的另一個特點是它可以從很多地方讀寫。這使我們能夠存儲我們的輸出Notebook與高耐用性和方便的訪問,以提供一個可靠的管道。今天,我們默認將輸出Notebook存儲到一個s3 bucket中,這個bucket由commuter(https://github.com/nteract/commuter)管理,這是nteract的另一個項目,它提供筆記本的只讀顯示。

因此,無論哪個系統最支持我們的用戶,輸出Notebook都可以成為獨立的記錄。這使得分析作業或相關工作就像鏈接到服務或S3前綴一樣簡單。用戶可以使用這些鏈接來調試問題、檢查結果和創建新模板,而不會影響原始工作流。

此外,由於Papermill控制自己的運行時進程,我們不需要任何notebook服務器或其他基礎設施來針對notebook內核執行。這消除了託管Notebook服務帶來的一些複雜性,因為我們是在更簡單的上下文中執行的。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

為了進一步提高notebook的可靠性,我們將notebook推入git,並在對使用Papermill的notebook進行測試後才將其推廣到生產服務中。如果一個notebook變得太複雜而不容易測試,我們有一個本地存儲庫,我們可以將代碼合併到一個更傳統的包中。這使我們能夠在將notebook作為傳統代碼推廣方面獲得常規CI工具的好處,但仍然允許我們使用notebook作為集成工具進行探索和迭代。

因此,我們的notebook被版本化,在執行之前和之後作為不可變的記錄推送到可靠的數據存儲中,在它們可用之前進行測試,並在運行時使專門化參數化。用戶友好但不可靠的notebook格式現在對於我們的數據管道來說是可靠的,而且相對於非notebook執行模式,我們獲得了一個關鍵的改進:我們的輸入和輸出是完整的文檔,完全可執行,並且可以在同一個界面中共享。

Notebook Scheduling

即使有一個支持測試、版本控制和Notebook顯示的平臺,我們仍然缺少一個關鍵組件,以使用戶能夠定期運行帶有觸發執行的工作——或者更簡單地說,我們需要一個調度層。通過web界面執行一個Notebook對於用戶的視覺反饋和反應性反饋非常好,但是一旦你有了工作,你就需要一個工具來代替你執行。

這個方程的執行面用Papermill是容易的。我們可以計算運行時參數並將它們注入到Notebook中,運行Papermill,並將結果存儲到數據倉庫中。該體系結構將參數化的Papermill與調度解耦,在選擇調度程序時提供了靈活性。因此,幾乎任何cron字符串和/或事件消費工具都可以運行我們到目前為止設置的工作。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

這意味著只要有一些基本功能,就可以輕鬆地調度Notebook。相反,您將在這裡花費精力選擇您最關心的調度程序的次要屬性。您可能希望重用團隊已經熟悉的工具,或者選擇滿足其他操作需求。如果您沒有首選的調度器,或者以前沒有使用過調度器,那麼Airflow(https://airflow.apache.org/project.html)是一個開源工具,可以很好地發揮這個作用。

在我們的例子中,我們關心的次要屬性是:

· 為外部事件觸發或等待功能

· 能夠在受控執行環境中啟動(例如Docker)

· 捕獲並公開關於執行和失敗的度量

· 併發控制

· 動態重試的可配置性

· 可靠性團隊代表用戶進行調解的能力

這些需求給我們留下了一些可以考慮的潛在選項,包括開源和閉源解決方案。在徹底研究了我們的選項之後,我們選擇了Netflix開發的一個名為Meson(https://airflow.apache.org/project.html)的調度程序。Meson是一個通用工作流編排和調度框架,用於跨異構系統執行ML管道。我們選擇Meson的主要原因之一是它對Netflix現有基於雲的基礎設施(包括我們的數據平臺)的深度支持。

用戶工作流程

有了適當的調度程序,開發人員將如何看待這一點?讓我們研究一個假設的數據工作流。假設我們希望按設備類型聚合視頻播放,以瞭解我們的成員使用哪些設備來觀看內容。因為我們是全球性的,所以我們需要按地區劃分聚合,這樣我們就可以瞭解世界各地最流行的設備。而且,一旦每天的結果準備好了,我們想把更新後的報告推送給我們的分析師。

首先,我們需要一個工作流程的時間表。假設每天凌晨2點。大多數調度程序接受crontab作為調度觸發器,因此一個0 2 * * *就滿足了這個要求。

接下來,我們需要將工作分解為邏輯工作單元。我們希望收集數據,聚合數據,並向用戶報告結果。為了表示這項工作,我們將定義一個DAG(https://en.wikipedia.org/wiki/Directed_acyclic_graph),其中每個作業都表示為圖中的一個節點,每條邊表示成功運行後的下一個作業。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

在這種情況下,我們需要四個Notebook。一個是收集我們的輸入數據。一是用地理信息增強我們的原始數據。每個區域參數化一個。一個是把我們的研究結果寫進報告。例如,我們的聚合Notebook可能有一個參數化的執行,比如:

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

我們有幾行代碼來執行一個簡單的SQL語句。您可以看到,在單元格[4]中,我們從Papermill注入的參數覆蓋了默認的region_code。run_date已經是我們想要的,所以我們將保留默認值,而不是覆蓋它。

然後調度程序執行一個簡單的命令來運行Notebook。

papermill s3://etlbucket/jobs/templates/vid_agg.ipynb s3://etlbucket/jobs/outputs/${timestamp}_vid_agg_fr.ipynb -p region_code fr

Done!很簡單,不是嗎?現在,這是一個人為設計的例子,可能並不能反映我們的數據工程師實際是如何進行這項工作的,但它確實有助於演示在工作流中如何將所有東西組合在一起。

服務自愈

在將新技術引入平臺時,需要考慮的另一個重要方面是調試和支持用戶的能力。對於Notebook,這可能是我們的調度器系統中最有益的方面。

讓我們深入探討一下如何應對失敗。假設我們前面的例子Notebook出了問題。我們如何調試和修復這個問題?我們首先要查看的是Notebook的輸出。它將具有堆棧跟蹤,並最終具有與錯誤相關的任何輸出信息。

"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

故事的起源

在考慮分析工具的未來時,我們最初問了自己幾個基本問題:

· 數據科學家將使用什麼接口將統計分析的結果與業務通信?

· 數據工程師如何編寫代碼以確保每小時運行一次?

· 機器學習工程師如何封裝他們的同事可以重用的模型迭代?

我們還想知道:是否有一個工具可以支持所有這些場景?

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

一個有希望的工具是Jupyter notebook。在Netflix,Notebooks已經被用於數據科學,但也越來越多地用於其他類型的工作負載。由於其靈活性和高擴展性,加上其龐大而充滿活力的開源社區,Notebooks是一個引人注目的選擇。因此,我們深入研究瞭如何將其用作用戶的公共接口。

Notebooks本質上是託管的JSON文檔,具有一個簡單的接口來執行其中的代碼。他們擅長通過單元來表達迭代的工作單元,這使得報告和執行隔離更加容易。此外,使用不同的內核,Notebooks可以支持多種語言和執行模式。這些屬性意味著我們可以為高級用戶公開任意級別的複雜性,同時為消費者呈現更容易遵循的敘述——所有這些都在一個文檔中。

我們知道,我們選擇的任何工具都需要能夠調度工作負載。隨著Jupyter notebook的潛力越來越明顯,我們開始考慮如何安排一個Notebooks。Notebooks的特性雖然非常適合交互式工作,但卻不適合按計劃執行。如果您已經熟悉Notebooks—包括它們的優點和缺點—您甚至可能認為我們將所有etl工作負載都轉移到Notebooks上有點瘋狂。

戰勝苦難

從表面上看,Notebook帶來了很多挑戰:它們經常被更改,它們的單元輸出不需要匹配代碼,它們很難測試,而且沒有簡單的方法來動態配置它們的執行。此外,您需要一個Notebook服務器來運行它們,這將創建體系結構依賴項來促進執行。這些問題引起了一些內部對這個想法的反對。但隨著我們為Notebook生態系統引入新的工具,這種情況已經發生了變化。

對我們來說,最大的遊戲規則改變者是Papermill(https://github.com/nteract/papermill)。Papermill是一個nteract庫,它考慮到生產生態系統,為Notebook的可配置和可靠執行而構建。Papermill的工作相當簡單。它採用一個Papermill路徑和一些參數輸入,然後使用呈現的輸入執行請求的Papermill。當每個單元執行時,它將生成的工件保存到一個單獨的輸出Papermill中。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

Papermill使我們在處理Notebook文檔時實現範例更改。由於Papermill不修改源Notebook,所以我們在工作定義中添加了一個函數屬性——這通常是Notebook空間中缺少的。我們的輸入(一個notebook JSON文檔和輸入參數)被視為不可變記錄,用於生成不可變輸出文檔的執行。該單個輸出文檔提供了執行的代碼、每個代碼單元的輸出和日誌,以及一個可重複的模板,可以在將來的任何時候輕鬆地重新運行該模板。

Papermill的另一個特點是它可以從很多地方讀寫。這使我們能夠存儲我們的輸出Notebook與高耐用性和方便的訪問,以提供一個可靠的管道。今天,我們默認將輸出Notebook存儲到一個s3 bucket中,這個bucket由commuter(https://github.com/nteract/commuter)管理,這是nteract的另一個項目,它提供筆記本的只讀顯示。

因此,無論哪個系統最支持我們的用戶,輸出Notebook都可以成為獨立的記錄。這使得分析作業或相關工作就像鏈接到服務或S3前綴一樣簡單。用戶可以使用這些鏈接來調試問題、檢查結果和創建新模板,而不會影響原始工作流。

此外,由於Papermill控制自己的運行時進程,我們不需要任何notebook服務器或其他基礎設施來針對notebook內核執行。這消除了託管Notebook服務帶來的一些複雜性,因為我們是在更簡單的上下文中執行的。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

為了進一步提高notebook的可靠性,我們將notebook推入git,並在對使用Papermill的notebook進行測試後才將其推廣到生產服務中。如果一個notebook變得太複雜而不容易測試,我們有一個本地存儲庫,我們可以將代碼合併到一個更傳統的包中。這使我們能夠在將notebook作為傳統代碼推廣方面獲得常規CI工具的好處,但仍然允許我們使用notebook作為集成工具進行探索和迭代。

因此,我們的notebook被版本化,在執行之前和之後作為不可變的記錄推送到可靠的數據存儲中,在它們可用之前進行測試,並在運行時使專門化參數化。用戶友好但不可靠的notebook格式現在對於我們的數據管道來說是可靠的,而且相對於非notebook執行模式,我們獲得了一個關鍵的改進:我們的輸入和輸出是完整的文檔,完全可執行,並且可以在同一個界面中共享。

Notebook Scheduling

即使有一個支持測試、版本控制和Notebook顯示的平臺,我們仍然缺少一個關鍵組件,以使用戶能夠定期運行帶有觸發執行的工作——或者更簡單地說,我們需要一個調度層。通過web界面執行一個Notebook對於用戶的視覺反饋和反應性反饋非常好,但是一旦你有了工作,你就需要一個工具來代替你執行。

這個方程的執行面用Papermill是容易的。我們可以計算運行時參數並將它們注入到Notebook中,運行Papermill,並將結果存儲到數據倉庫中。該體系結構將參數化的Papermill與調度解耦,在選擇調度程序時提供了靈活性。因此,幾乎任何cron字符串和/或事件消費工具都可以運行我們到目前為止設置的工作。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

這意味著只要有一些基本功能,就可以輕鬆地調度Notebook。相反,您將在這裡花費精力選擇您最關心的調度程序的次要屬性。您可能希望重用團隊已經熟悉的工具,或者選擇滿足其他操作需求。如果您沒有首選的調度器,或者以前沒有使用過調度器,那麼Airflow(https://airflow.apache.org/project.html)是一個開源工具,可以很好地發揮這個作用。

在我們的例子中,我們關心的次要屬性是:

· 為外部事件觸發或等待功能

· 能夠在受控執行環境中啟動(例如Docker)

· 捕獲並公開關於執行和失敗的度量

· 併發控制

· 動態重試的可配置性

· 可靠性團隊代表用戶進行調解的能力

這些需求給我們留下了一些可以考慮的潛在選項,包括開源和閉源解決方案。在徹底研究了我們的選項之後,我們選擇了Netflix開發的一個名為Meson(https://airflow.apache.org/project.html)的調度程序。Meson是一個通用工作流編排和調度框架,用於跨異構系統執行ML管道。我們選擇Meson的主要原因之一是它對Netflix現有基於雲的基礎設施(包括我們的數據平臺)的深度支持。

用戶工作流程

有了適當的調度程序,開發人員將如何看待這一點?讓我們研究一個假設的數據工作流。假設我們希望按設備類型聚合視頻播放,以瞭解我們的成員使用哪些設備來觀看內容。因為我們是全球性的,所以我們需要按地區劃分聚合,這樣我們就可以瞭解世界各地最流行的設備。而且,一旦每天的結果準備好了,我們想把更新後的報告推送給我們的分析師。

首先,我們需要一個工作流程的時間表。假設每天凌晨2點。大多數調度程序接受crontab作為調度觸發器,因此一個0 2 * * *就滿足了這個要求。

接下來,我們需要將工作分解為邏輯工作單元。我們希望收集數據,聚合數據,並向用戶報告結果。為了表示這項工作,我們將定義一個DAG(https://en.wikipedia.org/wiki/Directed_acyclic_graph),其中每個作業都表示為圖中的一個節點,每條邊表示成功運行後的下一個作業。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

在這種情況下,我們需要四個Notebook。一個是收集我們的輸入數據。一是用地理信息增強我們的原始數據。每個區域參數化一個。一個是把我們的研究結果寫進報告。例如,我們的聚合Notebook可能有一個參數化的執行,比如:

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

我們有幾行代碼來執行一個簡單的SQL語句。您可以看到,在單元格[4]中,我們從Papermill注入的參數覆蓋了默認的region_code。run_date已經是我們想要的,所以我們將保留默認值,而不是覆蓋它。

然後調度程序執行一個簡單的命令來運行Notebook。

papermill s3://etlbucket/jobs/templates/vid_agg.ipynb s3://etlbucket/jobs/outputs/${timestamp}_vid_agg_fr.ipynb -p region_code fr

Done!很簡單,不是嗎?現在,這是一個人為設計的例子,可能並不能反映我們的數據工程師實際是如何進行這項工作的,但它確實有助於演示在工作流中如何將所有東西組合在一起。

服務自愈

在將新技術引入平臺時,需要考慮的另一個重要方面是調試和支持用戶的能力。對於Notebook,這可能是我們的調度器系統中最有益的方面。

讓我們深入探討一下如何應對失敗。假設我們前面的例子Notebook出了問題。我們如何調試和修復這個問題?我們首先要查看的是Notebook的輸出。它將具有堆棧跟蹤,並最終具有與錯誤相關的任何輸出信息。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

在這裡,我們看到我們的工作找不到主機名。錯誤的主機名。這可能不是用戶輸入錯誤,因此我們可能需要更改模板以獲得正確的主機名。在傳統的調度程序情況下,您需要創建作業執行環境的模擬,或者嘗試進行更改並重新提交類似的作業。在這裡,我們只是簡單地使用輸出Notebook和我們失敗的運行時參數,並將其加載到一個Notebook服務器。

通過幾次迭代並查看我們的作業庫方法,我們可以快速找到故障的修復方法。

"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

故事的起源

在考慮分析工具的未來時,我們最初問了自己幾個基本問題:

· 數據科學家將使用什麼接口將統計分析的結果與業務通信?

· 數據工程師如何編寫代碼以確保每小時運行一次?

· 機器學習工程師如何封裝他們的同事可以重用的模型迭代?

我們還想知道:是否有一個工具可以支持所有這些場景?

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

一個有希望的工具是Jupyter notebook。在Netflix,Notebooks已經被用於數據科學,但也越來越多地用於其他類型的工作負載。由於其靈活性和高擴展性,加上其龐大而充滿活力的開源社區,Notebooks是一個引人注目的選擇。因此,我們深入研究瞭如何將其用作用戶的公共接口。

Notebooks本質上是託管的JSON文檔,具有一個簡單的接口來執行其中的代碼。他們擅長通過單元來表達迭代的工作單元,這使得報告和執行隔離更加容易。此外,使用不同的內核,Notebooks可以支持多種語言和執行模式。這些屬性意味著我們可以為高級用戶公開任意級別的複雜性,同時為消費者呈現更容易遵循的敘述——所有這些都在一個文檔中。

我們知道,我們選擇的任何工具都需要能夠調度工作負載。隨著Jupyter notebook的潛力越來越明顯,我們開始考慮如何安排一個Notebooks。Notebooks的特性雖然非常適合交互式工作,但卻不適合按計劃執行。如果您已經熟悉Notebooks—包括它們的優點和缺點—您甚至可能認為我們將所有etl工作負載都轉移到Notebooks上有點瘋狂。

戰勝苦難

從表面上看,Notebook帶來了很多挑戰:它們經常被更改,它們的單元輸出不需要匹配代碼,它們很難測試,而且沒有簡單的方法來動態配置它們的執行。此外,您需要一個Notebook服務器來運行它們,這將創建體系結構依賴項來促進執行。這些問題引起了一些內部對這個想法的反對。但隨著我們為Notebook生態系統引入新的工具,這種情況已經發生了變化。

對我們來說,最大的遊戲規則改變者是Papermill(https://github.com/nteract/papermill)。Papermill是一個nteract庫,它考慮到生產生態系統,為Notebook的可配置和可靠執行而構建。Papermill的工作相當簡單。它採用一個Papermill路徑和一些參數輸入,然後使用呈現的輸入執行請求的Papermill。當每個單元執行時,它將生成的工件保存到一個單獨的輸出Papermill中。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

Papermill使我們在處理Notebook文檔時實現範例更改。由於Papermill不修改源Notebook,所以我們在工作定義中添加了一個函數屬性——這通常是Notebook空間中缺少的。我們的輸入(一個notebook JSON文檔和輸入參數)被視為不可變記錄,用於生成不可變輸出文檔的執行。該單個輸出文檔提供了執行的代碼、每個代碼單元的輸出和日誌,以及一個可重複的模板,可以在將來的任何時候輕鬆地重新運行該模板。

Papermill的另一個特點是它可以從很多地方讀寫。這使我們能夠存儲我們的輸出Notebook與高耐用性和方便的訪問,以提供一個可靠的管道。今天,我們默認將輸出Notebook存儲到一個s3 bucket中,這個bucket由commuter(https://github.com/nteract/commuter)管理,這是nteract的另一個項目,它提供筆記本的只讀顯示。

因此,無論哪個系統最支持我們的用戶,輸出Notebook都可以成為獨立的記錄。這使得分析作業或相關工作就像鏈接到服務或S3前綴一樣簡單。用戶可以使用這些鏈接來調試問題、檢查結果和創建新模板,而不會影響原始工作流。

此外,由於Papermill控制自己的運行時進程,我們不需要任何notebook服務器或其他基礎設施來針對notebook內核執行。這消除了託管Notebook服務帶來的一些複雜性,因為我們是在更簡單的上下文中執行的。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

為了進一步提高notebook的可靠性,我們將notebook推入git,並在對使用Papermill的notebook進行測試後才將其推廣到生產服務中。如果一個notebook變得太複雜而不容易測試,我們有一個本地存儲庫,我們可以將代碼合併到一個更傳統的包中。這使我們能夠在將notebook作為傳統代碼推廣方面獲得常規CI工具的好處,但仍然允許我們使用notebook作為集成工具進行探索和迭代。

因此,我們的notebook被版本化,在執行之前和之後作為不可變的記錄推送到可靠的數據存儲中,在它們可用之前進行測試,並在運行時使專門化參數化。用戶友好但不可靠的notebook格式現在對於我們的數據管道來說是可靠的,而且相對於非notebook執行模式,我們獲得了一個關鍵的改進:我們的輸入和輸出是完整的文檔,完全可執行,並且可以在同一個界面中共享。

Notebook Scheduling

即使有一個支持測試、版本控制和Notebook顯示的平臺,我們仍然缺少一個關鍵組件,以使用戶能夠定期運行帶有觸發執行的工作——或者更簡單地說,我們需要一個調度層。通過web界面執行一個Notebook對於用戶的視覺反饋和反應性反饋非常好,但是一旦你有了工作,你就需要一個工具來代替你執行。

這個方程的執行面用Papermill是容易的。我們可以計算運行時參數並將它們注入到Notebook中,運行Papermill,並將結果存儲到數據倉庫中。該體系結構將參數化的Papermill與調度解耦,在選擇調度程序時提供了靈活性。因此,幾乎任何cron字符串和/或事件消費工具都可以運行我們到目前為止設置的工作。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

這意味著只要有一些基本功能,就可以輕鬆地調度Notebook。相反,您將在這裡花費精力選擇您最關心的調度程序的次要屬性。您可能希望重用團隊已經熟悉的工具,或者選擇滿足其他操作需求。如果您沒有首選的調度器,或者以前沒有使用過調度器,那麼Airflow(https://airflow.apache.org/project.html)是一個開源工具,可以很好地發揮這個作用。

在我們的例子中,我們關心的次要屬性是:

· 為外部事件觸發或等待功能

· 能夠在受控執行環境中啟動(例如Docker)

· 捕獲並公開關於執行和失敗的度量

· 併發控制

· 動態重試的可配置性

· 可靠性團隊代表用戶進行調解的能力

這些需求給我們留下了一些可以考慮的潛在選項,包括開源和閉源解決方案。在徹底研究了我們的選項之後,我們選擇了Netflix開發的一個名為Meson(https://airflow.apache.org/project.html)的調度程序。Meson是一個通用工作流編排和調度框架,用於跨異構系統執行ML管道。我們選擇Meson的主要原因之一是它對Netflix現有基於雲的基礎設施(包括我們的數據平臺)的深度支持。

用戶工作流程

有了適當的調度程序,開發人員將如何看待這一點?讓我們研究一個假設的數據工作流。假設我們希望按設備類型聚合視頻播放,以瞭解我們的成員使用哪些設備來觀看內容。因為我們是全球性的,所以我們需要按地區劃分聚合,這樣我們就可以瞭解世界各地最流行的設備。而且,一旦每天的結果準備好了,我們想把更新後的報告推送給我們的分析師。

首先,我們需要一個工作流程的時間表。假設每天凌晨2點。大多數調度程序接受crontab作為調度觸發器,因此一個0 2 * * *就滿足了這個要求。

接下來,我們需要將工作分解為邏輯工作單元。我們希望收集數據,聚合數據,並向用戶報告結果。為了表示這項工作,我們將定義一個DAG(https://en.wikipedia.org/wiki/Directed_acyclic_graph),其中每個作業都表示為圖中的一個節點,每條邊表示成功運行後的下一個作業。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

在這種情況下,我們需要四個Notebook。一個是收集我們的輸入數據。一是用地理信息增強我們的原始數據。每個區域參數化一個。一個是把我們的研究結果寫進報告。例如,我們的聚合Notebook可能有一個參數化的執行,比如:

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

我們有幾行代碼來執行一個簡單的SQL語句。您可以看到,在單元格[4]中,我們從Papermill注入的參數覆蓋了默認的region_code。run_date已經是我們想要的,所以我們將保留默認值,而不是覆蓋它。

然後調度程序執行一個簡單的命令來運行Notebook。

papermill s3://etlbucket/jobs/templates/vid_agg.ipynb s3://etlbucket/jobs/outputs/${timestamp}_vid_agg_fr.ipynb -p region_code fr

Done!很簡單,不是嗎?現在,這是一個人為設計的例子,可能並不能反映我們的數據工程師實際是如何進行這項工作的,但它確實有助於演示在工作流中如何將所有東西組合在一起。

服務自愈

在將新技術引入平臺時,需要考慮的另一個重要方面是調試和支持用戶的能力。對於Notebook,這可能是我們的調度器系統中最有益的方面。

讓我們深入探討一下如何應對失敗。假設我們前面的例子Notebook出了問題。我們如何調試和修復這個問題?我們首先要查看的是Notebook的輸出。它將具有堆棧跟蹤,並最終具有與錯誤相關的任何輸出信息。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

在這裡,我們看到我們的工作找不到主機名。錯誤的主機名。這可能不是用戶輸入錯誤,因此我們可能需要更改模板以獲得正確的主機名。在傳統的調度程序情況下,您需要創建作業執行環境的模擬,或者嘗試進行更改並重新提交類似的作業。在這裡,我們只是簡單地使用輸出Notebook和我們失敗的運行時參數,並將其加載到一個Notebook服務器。

通過幾次迭代並查看我們的作業庫方法,我們可以快速找到故障的修復方法。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

現在已經修復了這個模板,可以將其推到源Notebook路徑。以後的任何執行,包括重試失敗的作業,都將獲取並運行更新後的模板。

Notebooks 整合

在Netflix,我們採用Notebook作為集成工具,而不是library的替代品。這意味著我們需要採用良好的集成測試,以確保我們的Notebook能夠順利執行,並且不會經常遇到bug。因為我們已經有了參數化執行模板的模式,所以我們重複這些與虛擬輸入的交互,作為對線性代碼路徑的測試。

papermill s3://etlbucket/jobs/templates/vid_agg.ipynb s3://etlbucket/jobs/tests/.ipynb -p region_code luna -p run_date 2017_01_01
"

在Netflix,我們投入了大量的努力,將Notebooks作為一個綜合開發平臺超越互動:看Netflix是如何將Jupyter Notebook使用到極致的。這個想法開始於對未來開發和協作接口的討論。它發展成為一個戰略賭注在Notebooks上,既作為一個互動的用戶界面,也作為統一的基礎,我們的工作流調度程序。在過去的一年裡,我們在這方面取得了重大進展,目前我們正在遷移Netflix數據平臺上運行的所有10,000個計劃作業,以使用基於Notebooks的執行。當我們完成後,每天將有超過15萬個Genie jobs運行在我們的平臺上的Notebooks上。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

故事的起源

在考慮分析工具的未來時,我們最初問了自己幾個基本問題:

· 數據科學家將使用什麼接口將統計分析的結果與業務通信?

· 數據工程師如何編寫代碼以確保每小時運行一次?

· 機器學習工程師如何封裝他們的同事可以重用的模型迭代?

我們還想知道:是否有一個工具可以支持所有這些場景?

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

一個有希望的工具是Jupyter notebook。在Netflix,Notebooks已經被用於數據科學,但也越來越多地用於其他類型的工作負載。由於其靈活性和高擴展性,加上其龐大而充滿活力的開源社區,Notebooks是一個引人注目的選擇。因此,我們深入研究瞭如何將其用作用戶的公共接口。

Notebooks本質上是託管的JSON文檔,具有一個簡單的接口來執行其中的代碼。他們擅長通過單元來表達迭代的工作單元,這使得報告和執行隔離更加容易。此外,使用不同的內核,Notebooks可以支持多種語言和執行模式。這些屬性意味著我們可以為高級用戶公開任意級別的複雜性,同時為消費者呈現更容易遵循的敘述——所有這些都在一個文檔中。

我們知道,我們選擇的任何工具都需要能夠調度工作負載。隨著Jupyter notebook的潛力越來越明顯,我們開始考慮如何安排一個Notebooks。Notebooks的特性雖然非常適合交互式工作,但卻不適合按計劃執行。如果您已經熟悉Notebooks—包括它們的優點和缺點—您甚至可能認為我們將所有etl工作負載都轉移到Notebooks上有點瘋狂。

戰勝苦難

從表面上看,Notebook帶來了很多挑戰:它們經常被更改,它們的單元輸出不需要匹配代碼,它們很難測試,而且沒有簡單的方法來動態配置它們的執行。此外,您需要一個Notebook服務器來運行它們,這將創建體系結構依賴項來促進執行。這些問題引起了一些內部對這個想法的反對。但隨著我們為Notebook生態系統引入新的工具,這種情況已經發生了變化。

對我們來說,最大的遊戲規則改變者是Papermill(https://github.com/nteract/papermill)。Papermill是一個nteract庫,它考慮到生產生態系統,為Notebook的可配置和可靠執行而構建。Papermill的工作相當簡單。它採用一個Papermill路徑和一些參數輸入,然後使用呈現的輸入執行請求的Papermill。當每個單元執行時,它將生成的工件保存到一個單獨的輸出Papermill中。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

Papermill使我們在處理Notebook文檔時實現範例更改。由於Papermill不修改源Notebook,所以我們在工作定義中添加了一個函數屬性——這通常是Notebook空間中缺少的。我們的輸入(一個notebook JSON文檔和輸入參數)被視為不可變記錄,用於生成不可變輸出文檔的執行。該單個輸出文檔提供了執行的代碼、每個代碼單元的輸出和日誌,以及一個可重複的模板,可以在將來的任何時候輕鬆地重新運行該模板。

Papermill的另一個特點是它可以從很多地方讀寫。這使我們能夠存儲我們的輸出Notebook與高耐用性和方便的訪問,以提供一個可靠的管道。今天,我們默認將輸出Notebook存儲到一個s3 bucket中,這個bucket由commuter(https://github.com/nteract/commuter)管理,這是nteract的另一個項目,它提供筆記本的只讀顯示。

因此,無論哪個系統最支持我們的用戶,輸出Notebook都可以成為獨立的記錄。這使得分析作業或相關工作就像鏈接到服務或S3前綴一樣簡單。用戶可以使用這些鏈接來調試問題、檢查結果和創建新模板,而不會影響原始工作流。

此外,由於Papermill控制自己的運行時進程,我們不需要任何notebook服務器或其他基礎設施來針對notebook內核執行。這消除了託管Notebook服務帶來的一些複雜性,因為我們是在更簡單的上下文中執行的。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

為了進一步提高notebook的可靠性,我們將notebook推入git,並在對使用Papermill的notebook進行測試後才將其推廣到生產服務中。如果一個notebook變得太複雜而不容易測試,我們有一個本地存儲庫,我們可以將代碼合併到一個更傳統的包中。這使我們能夠在將notebook作為傳統代碼推廣方面獲得常規CI工具的好處,但仍然允許我們使用notebook作為集成工具進行探索和迭代。

因此,我們的notebook被版本化,在執行之前和之後作為不可變的記錄推送到可靠的數據存儲中,在它們可用之前進行測試,並在運行時使專門化參數化。用戶友好但不可靠的notebook格式現在對於我們的數據管道來說是可靠的,而且相對於非notebook執行模式,我們獲得了一個關鍵的改進:我們的輸入和輸出是完整的文檔,完全可執行,並且可以在同一個界面中共享。

Notebook Scheduling

即使有一個支持測試、版本控制和Notebook顯示的平臺,我們仍然缺少一個關鍵組件,以使用戶能夠定期運行帶有觸發執行的工作——或者更簡單地說,我們需要一個調度層。通過web界面執行一個Notebook對於用戶的視覺反饋和反應性反饋非常好,但是一旦你有了工作,你就需要一個工具來代替你執行。

這個方程的執行面用Papermill是容易的。我們可以計算運行時參數並將它們注入到Notebook中,運行Papermill,並將結果存儲到數據倉庫中。該體系結構將參數化的Papermill與調度解耦,在選擇調度程序時提供了靈活性。因此,幾乎任何cron字符串和/或事件消費工具都可以運行我們到目前為止設置的工作。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

這意味著只要有一些基本功能,就可以輕鬆地調度Notebook。相反,您將在這裡花費精力選擇您最關心的調度程序的次要屬性。您可能希望重用團隊已經熟悉的工具,或者選擇滿足其他操作需求。如果您沒有首選的調度器,或者以前沒有使用過調度器,那麼Airflow(https://airflow.apache.org/project.html)是一個開源工具,可以很好地發揮這個作用。

在我們的例子中,我們關心的次要屬性是:

· 為外部事件觸發或等待功能

· 能夠在受控執行環境中啟動(例如Docker)

· 捕獲並公開關於執行和失敗的度量

· 併發控制

· 動態重試的可配置性

· 可靠性團隊代表用戶進行調解的能力

這些需求給我們留下了一些可以考慮的潛在選項,包括開源和閉源解決方案。在徹底研究了我們的選項之後,我們選擇了Netflix開發的一個名為Meson(https://airflow.apache.org/project.html)的調度程序。Meson是一個通用工作流編排和調度框架,用於跨異構系統執行ML管道。我們選擇Meson的主要原因之一是它對Netflix現有基於雲的基礎設施(包括我們的數據平臺)的深度支持。

用戶工作流程

有了適當的調度程序,開發人員將如何看待這一點?讓我們研究一個假設的數據工作流。假設我們希望按設備類型聚合視頻播放,以瞭解我們的成員使用哪些設備來觀看內容。因為我們是全球性的,所以我們需要按地區劃分聚合,這樣我們就可以瞭解世界各地最流行的設備。而且,一旦每天的結果準備好了,我們想把更新後的報告推送給我們的分析師。

首先,我們需要一個工作流程的時間表。假設每天凌晨2點。大多數調度程序接受crontab作為調度觸發器,因此一個0 2 * * *就滿足了這個要求。

接下來,我們需要將工作分解為邏輯工作單元。我們希望收集數據,聚合數據,並向用戶報告結果。為了表示這項工作,我們將定義一個DAG(https://en.wikipedia.org/wiki/Directed_acyclic_graph),其中每個作業都表示為圖中的一個節點,每條邊表示成功運行後的下一個作業。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

在這種情況下,我們需要四個Notebook。一個是收集我們的輸入數據。一是用地理信息增強我們的原始數據。每個區域參數化一個。一個是把我們的研究結果寫進報告。例如,我們的聚合Notebook可能有一個參數化的執行,比如:

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

我們有幾行代碼來執行一個簡單的SQL語句。您可以看到,在單元格[4]中,我們從Papermill注入的參數覆蓋了默認的region_code。run_date已經是我們想要的,所以我們將保留默認值,而不是覆蓋它。

然後調度程序執行一個簡單的命令來運行Notebook。

papermill s3://etlbucket/jobs/templates/vid_agg.ipynb s3://etlbucket/jobs/outputs/${timestamp}_vid_agg_fr.ipynb -p region_code fr

Done!很簡單,不是嗎?現在,這是一個人為設計的例子,可能並不能反映我們的數據工程師實際是如何進行這項工作的,但它確實有助於演示在工作流中如何將所有東西組合在一起。

服務自愈

在將新技術引入平臺時,需要考慮的另一個重要方面是調試和支持用戶的能力。對於Notebook,這可能是我們的調度器系統中最有益的方面。

讓我們深入探討一下如何應對失敗。假設我們前面的例子Notebook出了問題。我們如何調試和修復這個問題?我們首先要查看的是Notebook的輸出。它將具有堆棧跟蹤,並最終具有與錯誤相關的任何輸出信息。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

在這裡,我們看到我們的工作找不到主機名。錯誤的主機名。這可能不是用戶輸入錯誤,因此我們可能需要更改模板以獲得正確的主機名。在傳統的調度程序情況下,您需要創建作業執行環境的模擬,或者嘗試進行更改並重新提交類似的作業。在這裡,我們只是簡單地使用輸出Notebook和我們失敗的運行時參數,並將其加載到一個Notebook服務器。

通過幾次迭代並查看我們的作業庫方法,我們可以快速找到故障的修復方法。

 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

現在已經修復了這個模板,可以將其推到源Notebook路徑。以後的任何執行,包括重試失敗的作業,都將獲取並運行更新後的模板。

Notebooks 整合

在Netflix,我們採用Notebook作為集成工具,而不是library的替代品。這意味著我們需要採用良好的集成測試,以確保我們的Notebook能夠順利執行,並且不會經常遇到bug。因為我們已經有了參數化執行模板的模式,所以我們重複這些與虛擬輸入的交互,作為對線性代碼路徑的測試。

papermill s3://etlbucket/jobs/templates/vid_agg.ipynb s3://etlbucket/jobs/tests/.ipynb -p region_code luna -p run_date 2017_01_01
 一文了解Netflix 如何深度使用Scheduling Jupyter Notebooks

這意味著我們沒有使用Notebook作為代碼庫,因此也沒有迫切要求在Notebook上進行單元級測試,因為這些測試應該由底層庫封裝。相反,我們提倡Notebook開發的指導原則:

· 低分支因素:保持你的Notebook相當線性。如果您有許多條件或潛在的執行路徑,就很難確保端到端測試能夠很好地覆蓋所需的用例。

· 庫中的庫函數:如果您最終得到了可以獨立重用或重構的複雜函數,那麼這些函數很適合作為編碼庫而不是Notebook。在git中提供您的Notebook意味著您可以將共享的單元測試代碼放置在與您的 Notebook相同的git中,而不是試圖對複雜的Notebook進行單元測試。

· 短小精悍更好:一本用幾個簡單的單元格生成大量有用輸出和視覺效果的Notebook勝過一本十頁的手冊。這使您的Notebook更易於共享、理解和維護。

當遵循這些指導原則時,我們可以很容易地指導和支持我們的用戶跨越廣泛的用例和底層技術。

未來展望

通過到目前為止概述的選擇和技術,我們已經能夠開始構建我們在本文開頭描述的共享體驗。Netflix的內部用戶今年增長迅速,我們提前完成了完全替換之前的ETL和報告模式的計劃。

但我們還遠遠沒有完成。我們仍然有工作要做,以改善開發經驗和易於採用。也就是說,我們希望為使用nbdime(https://github.com/jupyter/nbdime)等工具的Notebook提供更好的代碼審查模式,將CI和平臺工具更多地集成到Notebook上,以及更容易地安排和共享Notebook。這些,以及更多有用的改進,將有助於使Notebook成為Netflix跨功能開發的一個共同而簡單的入門點。

ref:https://medium.com/netflix-techblog/scheduling-notebooks-348e6c14cfd6

"

相關推薦

推薦中...