1. 程式人生 > 實用技巧 >Serverless 在大規模資料處理的實踐

Serverless 在大規模資料處理的實踐

作者 | 西流 阿里雲技術專家

前言

當您第一次接觸 Serverless 的時候,有一個不那麼明顯的新使用方式:與傳統的基於伺服器的方法相比,Serverless 服務平臺可以使您的應用快速水平擴充套件,並行處理的工作更加有效。這主要是因為 Serverless 可以不必為閒置的資源付費,不用擔心預留的資源不夠。而在傳統的使用正規化中,使用者必須預留成百上千的伺服器來做一些高度並行化但執行時長較短的任務,而且必須為每一臺伺服器買單,即使有的伺服器已經不再工作了。

以阿里雲 Serverless 產品——函式計算為例,便可以完美解決您上述所有顧慮:

  • 如果您的任務本身計算量不是很大,但是有大量的併發任務請求需要並行處理, 比如多媒體檔案處理、文件轉換等;

  • 一個任務本身計算量很大,要求單個任務很快處理完,並且還能支援並行處理多個任務。

在這種場景下,使用者唯一關注的就是:您的任務是可以分治拆解並且子任務是可以並行處理的,一個需要一個小時才能處理完的長任務,可以分解成 360 個獨立的 10 秒長的子任務並行處理,這樣,以前您要花一個小時才能處理完的任務,現在只需要 10 秒就可以搞定。由於採用的是按量計費的模型,完成的計算量和成本是大致相當的,而傳統模型則因為預留資源肯定會存在浪費,浪費的費用也是需要您去承擔的。

接下來,將詳細闡述 Serverless 在大規模資料處理上的實踐。

極致彈性擴縮容應對計算波動

在介紹相關的大規模資料處理示例之前, 這裡先簡單介紹一下函式計算。

1. 函式計算簡介

  • 開發者使用程式語言編寫應用和服務,函式計算支援的開發語言請參見開發語言列表;

  • 開發者上傳應用到函式計算;

  • 觸發函式執行:觸發方式包括 OSS、API 閘道器、日誌服務、表格儲存以及函式計算 API、SDK 等;

  • 動態擴容以響應請求:函式計算可以根據使用者請求量自動擴容,該過程對您和您的使用者均透明無感知;

  • 根據函式的實際執行時間按量計費:函式執行結束後,可以通過賬單來檢視執行費用,收費粒度精確到 100 毫秒。

詳情:函式計算官網

至此,您大約可以簡單理解到函式計算是怎麼運作的,接下來以大量視訊並行轉碼的案例來闡述:假設一家在家教育或娛樂相關的企業,老師授課視訊或者新的片源一般是集中式產生,而您希望這些視訊被快速轉碼處理完以便能讓客戶快速看到視訊回放。比如在當下疫情中,線上教育產生的課程激增,而出課高峰一般是 10 點、12 點、16 點、18 點等明顯的峰值段,特定的時間內(比如半個小時)處理完所有新上傳的視訊是一個通用而且普遍的需求。

2. 彈性高可用的音視訊處理系統

  • OSS 觸發器

如上圖所示,使用者上傳一個視訊到 OSS,OSS 觸發器自動觸發函式執行,函式計算自動擴容,執行環境內的函式邏輯呼叫 FFmpeg 進行視訊轉碼,並且將轉碼後的視訊儲存回 OSS。

  • 訊息觸發器

如上圖所示,應用只需要發一個訊息,自動觸發函式執行音視訊處理的任務即可,函式計算自動擴容,執行環境內的函式邏輯呼叫 FFmpeg 進行視訊轉碼, 並且將轉碼後的視訊儲存回 OSS。

  • 直接手動呼叫 SDK 執行音視訊處理任務

以 python 為例,大致如下:

python # -- coding: utf-8 -- import fc2 import json client = fc2.Client(endpoint="http://123456.cn-hangzhou.fc.aliyuncs.com",accessKeyID="xxxxxxxx",accessKeySecret="yyyyyy") # 可選擇同步/非同步呼叫 resp = client.invoke_function("FcOssFFmpeg", "transcode", payload=json.dumps( { "bucket_name" : "test-bucket", "object_key" : "video/inputs/a.flv", "output_dir" : "video/output/a_out.mp4" })).data print(resp)

從上面我們也可以看出,觸發函式執行的方式也很多,同時簡單配置下 SLS 日誌,就可以很快實現一個彈性高可用、按量付費的音視訊處理系統,同時能提供免運維、具體業務資料視覺化、強大自定義監控報警等超強功能的 dashboard。

目前已經落地的音視訊案例有 UC、語雀、躺平設計之家、虎撲以及幾家線上教育的頭部客戶等,其中有些客戶高峰期間,彈性使用到了萬核以上 CPU 計算資源,並行處理的視訊達到 1700+,同時提供了極高的價效比。

詳情可以參考:

任務分治,並行加速

這種將任務分而治之的思想應用在函式計算上是一件有趣的事情,在這裡舉一個例子,比如您有一個超大的 20G 的 1080P 高清視訊需要轉碼,即使您使用一臺高配機器,需要的時間可能還是要按小時計,如果中途出問題中斷轉碼,您只能重新開始再重複一遍轉碼的過程,如果您使用分治的思想+函式計算,轉碼的過程衍變為 分片-> 並行轉碼分片-> 合併分片,這樣就可以解決您上述的兩個痛點:

  • 分片和合成分片是記憶體級別的拷貝,需要的計算量極小,真正消耗計算量的轉碼,拆分成了很多子任務並行處理,在這個模型中,分片轉碼的最大時間基本等同於整個大視訊的轉碼時間;

  • 即使中途某個分片轉碼出現異常,只需要重試這個分片的轉碼即可,不需要整個大任務推倒重來。

通過將大任務合理的分解,配合使用函式計算,編寫一點 code,就可以快速完成一個彈性高可用、並行加速、按量付費的大型資料處理系統。

在介紹這個方案之前,我們先簡單介紹一下 Serverless 工作流,Serverless 工作流可以很好地將函式和其他雲服務和自建服務有組織地編排起來。

1. Serverless 工作流簡介

Serverless 工作流(Serverless Workflow)是一個用來協調多個分散式任務執行的全託管雲服務。在 Serverless 工作流中,您可以用順序、分支、並行等方式來編排分散式任務,Serverless 工作流會按照設定好的步驟可靠地協調任務執行,跟蹤每個任務的狀態轉換,並在必要時執行使用者定義的重試邏輯,以確保工作流順利完成。Serverless 工作流簡化了開發和執行業務流程所需要的任務協調、狀態管理以及錯誤處理等繁瑣工作,讓您聚焦業務邏輯開發。

詳情:Serverless 工作流官網

接下來以一個大視訊快速轉碼的案例來闡述 Serverless 工作編排函式,實現大計算任務的分解,並行處理子任務,最終達到快速完成單個大任務的目的。

2. 大視訊的快速多目標格式轉碼

如下圖所示,假設使用者上傳一個 mov 格式的視訊到 OSS,OSS 觸發器自動觸發函式執行,函式呼叫 FnF 執行,FnF 同時進行 1 種或者多種格式的轉碼(由 template.yml 中的 DST_FORMATS 引數控制),假設配置的是同時進行 mp4 和 flv 格式的轉碼。

  • 一個視訊檔案可以同時被轉碼成各種格式以及其他各種自定義處理,比如增加水印處理或者在 after-process 更新資訊到資料庫等;

  • 當有多個檔案同時上傳到 OSS,函式計算會自動伸縮,並行處理多個檔案,同時每次檔案轉碼成多種格式也是並行;

  • 結合 NAS + 視訊切片,可以解決超大視訊的轉碼,對於每一個視訊,先進行切片處理,然後並行轉碼切片,最後合成,通過設定合理的切片時間,可以大大加快較大視訊的轉碼速度;

  • fnf 可以跟蹤每一步執行情況,並且可以自定義每一個步驟的重試,提高任務系統的魯棒性,如:retry-example

詳情可以參考:fc-fnf-video-processing

在任務分治,並行加速具體的案例中,上面分享的是 CPU 密集型任務分解,但也可以進行 IO 密集型任務分解,比如這個需求:上海的 region 的 OSS bucket 中的一個 20G 大檔案,秒級轉存回杭州的 OSS Bucket 中。這裡也可以採用分治的思路,Master 函式在接到轉存任務之後,將超大檔案進行分片的 range 分配給每個 Worker 子函式,Worker 子函式並行轉存屬於自己那部分的分片,Master 函式待所有子 Worker 執行完畢之後,提交合並分片請求,完成整個轉存任務。

詳情可以參考:利用函式計算多例項併發實現秒級轉存超大檔案

總結

本文探討了 Serverless 服務平臺可以使您的應用快速水平擴充套件,並行處理的工作更加有效,並給出了具體的實踐案例,無論在 CPU 密集型還是 IO 密集型場景,函式計算 + Serverless 都能完美解決您以下顧慮:

  • 不必為閒置的資源付費

  • 不用擔心計算資源預留不夠

  • 大計算量的任務需要快速處理完畢

  • 更好的任務流程跟蹤

  • 完善的監控報警、免運維、業務資料視覺化等

  • ....

本文中對於 Serverless 音視訊處理只是一個示例,它展示的是函式計算配合 Serverless 工作流在離線計算場景中的能力和獨一無二的優勢。我們可以用發散的方式去拓展 Serverless 在大規模資料處理實踐的邊界,比如AI、基因計算、科學模擬等。希望本篇文章能吸引您,開啟您的 Serverless 奇妙之旅。