Netflix實踐:1.48億用戶觀看電影,Python在幕後提供全生命週期支持

導讀: Netflix (官方中文名稱:網飛)是全球最大的視頻流媒體平臺,在除中國大陸地區之外的所有國家和地區都提供視頻點播服務。全球的觀衆都在追棒 Netflix,而如此成功的 Netflix,其內部主要使用的又是什麼編程語言呢?那就是今年成爲語言流行指數榜單冠軍 的Python!讓我們一起來看看 Python 在 Netflix 是如何應用的。


由於我們團隊中有很多成員準備參加 PyCon,因此我們想分享一些經驗,介紹 Python 在 Netflix 中是如何應用的。我們在整個內容生命週期中使用 Python,從決定爲哪些內容提供資金,到運營爲1.48億會員提供視頻服務的 CDN。我們使用並貢獻了許多開源 Python 包,其中的一些包將在本文中提到。

Open Connect(開放連接)

Open Connect 是 Netflix 的內容分發網絡(content delivery network,CDN)。考慮 Netflix 基礎設施的運作的一種簡單但不精確的方法是,參照在你按下遙控器上的“播放”按鍵之前發生的所有事情(例如,你是否已經登錄?你有何計劃?你看過什麼電影?這樣我們就可以給你推薦新電影,你想看什麼?)都是發生在亞馬遜網絡服務中(Amazon Web Services,AWS),而之後發生的所有事情(即視頻流)都是發生在 Open Connect 網絡中。內容放在 Open Connect CDN 中的服務器網絡上,儘可能靠近終端用戶,爲我們的客戶改善流媒體體驗,並降低 Netflix 和我們的互聯網服務供應商(Internet Service Provider,ISP)合作伙伴的成本。

設計、構建和運營這個 CDN 基礎設置需要各種軟件系統,其中很多都是用 Python 編寫的。構成 CDN 大部分的網絡設備主要是由 Python 應用程序管理。這樣的應用程序跟蹤我們網絡設備的庫存:都有哪些設備、哪些型號,用什麼硬件組件,都位於什麼位置。這些設備的配置由幾個其他系統控制,包括數據源、設備配置的應用和備份。用於收集運行狀況和其他運營數據的設備交互是另一個 Python 應用程序。長期以來,Python 一直是網絡領域中流行的編程語言,因爲它是一種直觀語言,允許工程師能夠快速解決網絡問題。隨後,人們開發了許多有用的庫,使得 Python 更爲容易學習和使用。

Demand Engineering(需求工程)

Demand Engineering 負責 Netflix 雲計算的區域故障轉移、流量分配、容量運營和集羣效率。我們可以很自豪地說,我們團隊的工具主要是由 Python 構建的。編排故障轉移的服務使用 numpy 和 scipy 來執行數值分析,boto3 對 AWS 基礎設施進行更改,rq 用於運行異步工作負載,我們將其打包在一個 Flask API 的薄層中。放入 bpython shell 並進行臨時製作的能力已經不止一次挽救了局面。

我們是 Jupyter Notebook 和 nteract 的重度用戶,可以分析運營數據和原型可視化工具,以幫助我們檢測容量回歸(capacity regressions)。

CORE(核心)

CORE 團隊在我們的警報和統計分析工作中使用 Python。在警報系統顯示問題時,我們依靠許多統計和數學庫(如 numpy、scipy、ruptures、pandas)來幫助自動分析 1000 多個相關信號。我們開發了一個用於團隊內外的時間序列相關係統,以及分佈式工作系統,用於並行化大量的分析工作,以快速交付結果。

Python 也是我們通常用來自動化任務、數據挖掘和清理的工具,也是可視化工作的便攜來源。

監控、警報和自動修復

Insight Engineering 團隊負責構建和操作用於運營洞察力、警報、診斷和自動修復的工具。隨着 Python 越來越受歡迎,該團隊現在支持 Python 客戶端的大多數服務。一個例子就是 Spectator Python 客戶端庫,這是一種用於檢測代碼以記錄維度時間序列度量的庫。我們構建了 Python 庫來與其他 Netflix 平臺級服務進行交互。除了庫之外,Winston 和 Bolt 產品也使用了 Python 框架(Gunicorn + Flask + Flask-RESTPlus)來構建。

信息安全

信息安全團隊使用 Python 爲 Netflix 實現了許多高層次目標:安全自動化、風險分類、自動修復和漏洞識別等等。我們有許多成功的 Python 開源項目,包括 Security Monkey(我們團隊最活躍的開源項目)。我們利用 Python 來保護使用 Bless 的 SSH 資源。基礎設施安全團隊利用 Python 幫助使用 Repokid 進行 IAM 權限調整。我們使用 Python 來幫助使用 Lemur 生成 TLS 證書。

我們最近的一些項目包括 Prism:一種批處理框架,用於幫助安全工程師測量平整道路採用、風險因素,並識別源代碼中的漏洞。我們目前爲 Prism 提供了 Python 和 Ruby 庫。Diffy 取證分類工具完全使用 Python 編寫。我們還使用 Python 來檢測使用 Lanius 的敏感數據。

個性化算法

我們在更廣泛的個性化機器學習基礎設施中,廣泛使用 Python 來訓練一些 Netflix 體驗關鍵方面的機器學習模型:從我們的推薦算法到圖片個性化,再到營銷算法。例如,一些算法使用 TensorFlow、Keras 和 PyTorch 來學習深度神經網絡,XGBoost 和 LightGBM 來學習梯度提升決策樹,或者 Python 中更廣泛的科學堆棧(numpy、scipy、sklearn、matplotlib、pandas、cvxpy 等等)。由於我們不斷嘗試新的方法,我們使用 Jupyter Notebook 來驅動我們的許多實驗。我們還開發了一些更高級別的庫,以幫助將這些庫與我們的其他生態系統集成(如數據訪問、事實記錄和特徵提取、模型評估和發佈)。

機器學習基礎設施

除了個性化之外,Netflix 還將機器學習應用於整個公司的數百個用例中。其中有許多應用程序都是 Metaflow 提供支持的,這是一個 Python 框架,可以使從原型階段到生產階段執行機器項目變得很容易。

Metafolw 提升了 Python 的極限:我們利用良好的並行化和優化的 Python 代碼來獲取 10Gbps 的數據,處理內存中數億個數據點,並協調數萬個 CPU 內核的計算。

Notebook

我們是 Netflix 的 Jupyter Notebook 的擁躉,我們之前已經寫過這項投資的原因和性質,請參閱《Beyond Interactive: Notebook Innovation at Netflix》。

但是,在我們如何提供這些服務方面,Python 發揮着重要的作用。當我們需要開發、調試、探索和原型化與 Jupyter 生態系統的不同交互時,Python 是一種主要語言。我們使用 Python 爲 Jupyter 服務器構建自定義擴展,允許我們代表用戶管理日誌記錄、歸檔、發佈和克隆筆記本等任務。我們通過不同的 Jupyter 內核爲用戶提供了多種風格的 Python,並使用 Python 管理這些內核規範的部署。

編排

大數據編排團隊(The Big Data Orchestration team)負責提供所有服務和工具來安排和執行 ETL 和 Ad hoc 管道。

編排服務的許多組件都是用 Python 編寫的。從我們的調度程序開始,它使用 Jupyter Notebook 和 papermill 來提供模板化的作業類型(如 Spark、Presto 等等)。這使得我們的用戶能夠以標準化的、簡單的方式來表達需要執行的工作。要想知道有關這一主題的更多詳情,請參閱《Part2:Scheduling Noteebooks at Netflix》:

在需要人工干預的情況下,我們一直使用 notebook 作爲真正的運行手冊。即:重新啓動過去一小時內所有失敗的事情。

在內部,我們還構建了一個完全用 Python 編寫的事件驅動平臺。我們已經創建了來自多個系統的事件流,這些系統將統一到一個工具中。這允許我們能夠定義過濾事件的條件,以及響應或路由事件的動作。因此,我們能夠解耦微服務,並能夠了解數據平臺上發生的所有事情。

我們的團隊還構建了 pygenie 客戶端,它與 genie(一種聯合作業執行服務)接口。在內部,我們對這個庫進行了額外的擴展,可應用業務約定並與 Netflix 平臺集成。這些庫是用戶以變成方式與大數據平臺中的工作進行交互的主要方式。

最後,我們團隊致力於爲 papermill 和 scrapbook 開源項目做出貢獻。我們爲此進行的工作既適用於我們自己的用例,也適用於外部用例。我們的這些努力在開源社區獲得了很大吸引力,我們很高興能夠爲這些共享項目做出貢獻。

實驗平臺

用於實驗的科學計算團隊正在爲科學家和工程師創建一個分析 AB 測試和其他實驗的平臺。科學家和工程師可以在數據、統計和可視化這三個方面做出新的創新。

Metrics Repo 是一個基於 PyPika 的 Python 框架,它允許貢獻者編寫可重用的參數化 SQL 查詢。它是任何新分析的切入點。

因果模式庫是一個 Python 和 R 框架,供科學家爲因果推理提供新的模型。它利用了 PyArrow 和 RPy2,因此可以使用這兩種語言的任何一種無縫地計算統計數據。

可視化庫是基於 Plotly。因爲 Plotly 是一種廣泛採用的可視化規範,因此有許多工具可以讓貢獻者生成我們平臺可以使用的輸出。

合作伙伴生態系統

合作伙伴生態系統小組正在擴展 Python 在設備上測試 Netflix 應用程序的使用範圍。Python 正在形成一個新的 CI 基礎架構的核心,包括控制我們的編排服務器、控制 Spinnaker、測試用例查詢和過濾,以及在設備和容器上調度測試運行。使用 TensorFlow 在 Python 中進行額外的運行後分析,以確定哪些測試最有可能顯示哪些設備上的問題。

視頻編碼與媒體雲工程

我們的團隊負責對 Netflix 目錄進行編碼(和重新編碼),並利用機器學習來深入瞭解該目錄。我們將 Python 用於大約 50 個項目,如 vmaf 和 mezzfs,我們使用名爲 Archer 的媒體映射化簡平臺( media map-reduce platform)構建計算機視覺解決方案,並在許多內部項目中使用 Python。我們還開源了一些工具來簡化 Python 項目的開發/分發,比如 setupmeta 和 pickley。

Netflix 動畫與 NVFX

Python 是我們用於創建動畫和 VFX 內容的所有主要應用程序的行業標準,毫無疑問,我們正在大量使用它。我們與 Maya 和 Nuke 的所有集成都是用 Python 實現的,而我們的 Shotgun 工具的大部分也是用 Python 實現的。我們剛剛開始在雲端中使用我們的工具,並與其部署我們自己的許多定製的 Python AMI / 容器。

內容機器學習、科學與分析

內容機器學習團隊廣泛使用 Python 來開發機器學習模型,這些模型是預測所有內容的受衆規模、收視率和其他需求指標的核心。


文中涉及到的部分項目、庫的官方地址:

Open Connect:https://openconnect.netflix.com/en/

bpython:https://bpython-interpreter.org/

nteract:https://nteract.io/

visualization tools:https://github.com/nteract/nteract/tree/master/packages/data-explorer

Spectator:https://github.com/Netflix/spectator-py

Security Monkey:https://github.com/Netflix/security_monkey

Bless:https://github.com/Netflix/bless

Repokid:https://github.com/Netflix/repokid

Lemur:https://github.com/Netflix/lemur

papermill:https://papermill.readthedocs.io/en/latest/

pygenie:https://github.com/Netflix/pygenie

scrapbook:https://nteract-scrapbook.readthedocs.io/en/latest/

PyPika:https://pypika.readthedocs.io/en/latest/

PyArrow:https://arrow.apache.org/docs/python/

RPy2:https://rpy2.readthedocs.io/en/version_2.8.x/

Plotly:https://plot.ly/

vmaf:https://github.com/Netflix/vmaf/blob/master/resource/doc/references.md

mezzfs:https://medium.com/netflix-techblog/mezzfs-mounting-object-storage-in-netflixs-media-processing-platform-cda01c446ba

setupmeta:https://pypi.org/project/setupmeta/

pickley:https://pypi.org/project/pickley/


原文鏈接:

https://medium.com/netflix-techblog/python-at-netflix-bba45dae649e

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章