張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐|DataFunTalk

導(dǎo)讀:大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)負(fù)責(zé)數(shù)據(jù)領(lǐng)域所有離線(xiàn)任務(wù)的編排調(diào)度,是數(shù)據(jù)中臺(tái)的重要組成部分。隨著任務(wù)量變大,調(diào)度系統(tǒng)面臨調(diào)度性能變差和穩(wěn)定性降低等挑戰(zhàn)。本次分享主要講述快手在每日數(shù)十萬(wàn)任務(wù)的場(chǎng)景下,如何應(yīng)對(duì)這些挑戰(zhàn),著重介紹在高性能和高可用等方面的建設(shè)經(jīng)驗(yàn)。

本次分享包含四個(gè)部分:

  • 背景介紹:包括任務(wù)調(diào)度系統(tǒng)的定位、挑戰(zhàn)與目標(biāo)、以及快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)的發(fā)展歷程;
  • 快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)整體設(shè)計(jì):包括調(diào)度模型和系統(tǒng)架構(gòu);
  • 任務(wù)調(diào)度系統(tǒng)的關(guān)鍵技術(shù):將聚焦在低調(diào)度延遲、高可用和開(kāi)放能力三部分;
  • 任務(wù)調(diào)度系統(tǒng)的應(yīng)用、成果和未來(lái)規(guī)劃。
張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

01

快手任務(wù)調(diào)度背景

對(duì)于調(diào)度系統(tǒng),大家應(yīng)該都不陌生。我們?cè)谌粘9ぷ髦?,?huì)碰到很多調(diào)度的場(chǎng)景,例如通過(guò)定時(shí)任務(wù)每天發(fā)送日?qǐng)?bào)或者選擇合適的負(fù)載機(jī)器來(lái)執(zhí)行任務(wù)。根據(jù)側(cè)重點(diǎn)不同,調(diào)度系統(tǒng)可以分為資源調(diào)度系統(tǒng)和任務(wù)調(diào)度系統(tǒng)。

  • 資源調(diào)度系統(tǒng):主要關(guān)注底層物理資源的分配,往往管理著較大的物理集群,為使用者提供良好的資源抽象。常見(jiàn)的資源調(diào)度系統(tǒng)包括 Yarn、k8s、mesos 等。
  • 任務(wù)調(diào)度系統(tǒng):主要關(guān)注任務(wù)及時(shí)準(zhǔn)確地執(zhí)行,為使用者提供任務(wù)定時(shí)、工作流調(diào)度等能力。常見(jiàn)的任務(wù)調(diào)度系統(tǒng)包括 Airflow,DolphinScheduler,Azkaban 等。

資源調(diào)度系統(tǒng)和任務(wù)調(diào)度系統(tǒng)并不是對(duì)立的,而是協(xié)作關(guān)系。任務(wù)調(diào)度系統(tǒng)常常會(huì)依賴(lài)于資源調(diào)度系統(tǒng)來(lái)執(zhí)行任務(wù)。本文將聚焦在任務(wù)調(diào)度系統(tǒng)。

張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

任務(wù)調(diào)度在各類(lèi)場(chǎng)景中發(fā)揮著重要作用。大數(shù)據(jù)的原始數(shù)據(jù)一般是業(yè)務(wù)庫(kù)、服務(wù)端日志和客戶(hù)端日志,這些原始數(shù)據(jù)的價(jià)值密度是很低的。如果要提煉出高價(jià)值的信息,往往需要:

1. 經(jīng)過(guò)數(shù)據(jù)接入進(jìn)入大數(shù)據(jù)系統(tǒng);

2. 然后經(jīng)過(guò)精心建模,層層加工,生產(chǎn)出高價(jià)值的數(shù)據(jù);

3. 最后經(jīng)過(guò)數(shù)據(jù)分發(fā)到合適的存儲(chǔ)引擎中,然后通過(guò)服務(wù)化提供給數(shù)據(jù)應(yīng)用,例如數(shù)據(jù)分析、在線(xiàn)服務(wù)、模型訓(xùn)練等。

在這整個(gè)過(guò)程中,會(huì)有很多任務(wù)負(fù)責(zé)數(shù)據(jù)的接入、加工和分發(fā)。這些任務(wù)交織依賴(lài),形成了一個(gè)大的有向圖。數(shù)據(jù)生產(chǎn)的核心,就是需要對(duì)這個(gè)圖進(jìn)行統(tǒng)一調(diào)度。為此,需要有一個(gè)統(tǒng)一的任務(wù)調(diào)度系統(tǒng)。任務(wù)調(diào)度系統(tǒng)是大數(shù)據(jù)生產(chǎn)的核心,它并不是孤立存在的,會(huì)依賴(lài)于底層的資源如大數(shù)據(jù)資源和容器資源,并為上層應(yīng)用如數(shù)據(jù)開(kāi)發(fā)、ABTest 平臺(tái)、指標(biāo)生產(chǎn)、機(jī)器學(xué)習(xí)等提供服務(wù)。

張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

在快手,大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)挑戰(zhàn)主要包括三部分:

  • 任務(wù)量大:有數(shù)十萬(wàn)個(gè)任務(wù),上百萬(wàn)條依賴(lài)關(guān)系;這給任務(wù)調(diào)度系統(tǒng)的性能帶來(lái)了挑戰(zhàn),大任務(wù)量會(huì)導(dǎo)致性能惡化。
  • 任務(wù)交織依賴(lài):任務(wù)之間相互依賴(lài),組成一個(gè)大的有向圖。一個(gè)任務(wù)可能有上萬(wàn)個(gè)上游,也可能有數(shù)萬(wàn)個(gè)下游任務(wù)。這給任務(wù)調(diào)度系統(tǒng)的穩(wěn)定性帶來(lái)了挑戰(zhàn),一個(gè)任務(wù)的調(diào)度出錯(cuò)有可能導(dǎo)致大面積故障。
  • 場(chǎng)景多樣:調(diào)度場(chǎng)景多,執(zhí)行方式多,任務(wù)類(lèi)型多,給系統(tǒng)的功能帶來(lái)了挑戰(zhàn),要求功能豐富且可擴(kuò)展。

與這些挑戰(zhàn)對(duì)應(yīng),目標(biāo)也包括三部分:

  • 高性能:支持百萬(wàn)級(jí)任務(wù)的調(diào)度,調(diào)度延遲控制在秒級(jí)或者毫秒級(jí);
  • 高可用:系統(tǒng)要準(zhǔn)時(shí)調(diào)度,不重不錯(cuò),且具有高穩(wěn)定性,避免造成鏈路數(shù)據(jù)質(zhì)量或者數(shù)據(jù)時(shí)效故障;
  • 功能強(qiáng):具有豐富的調(diào)度執(zhí)行方式,具有強(qiáng)大的開(kāi)放能力,打造豐富的生態(tài)體系,為上層應(yīng)用提供便捷的服務(wù)。
張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

縱觀快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)的發(fā)展歷程,可以分為四個(gè)階段。

1. 在 2016 年,整體規(guī)模較小,采用當(dāng)時(shí)主流 Airflow 作為任務(wù)調(diào)度引擎。隨著時(shí)間的推移,快手的業(yè)務(wù)蓬勃發(fā)展,任務(wù)規(guī)模也急速增長(zhǎng),Airflow 性能和穩(wěn)定性不再能滿(mǎn)足要求。

2. 在 2019 年,為了解決 Airflow 的問(wèn)題,我們自研了任務(wù)調(diào)度系統(tǒng) Kwaiflow,旨在支持百萬(wàn)級(jí)別的任務(wù)規(guī)模。

3. 在 2020 年,我們升級(jí) Kwaiflow 到 2.0 版本,支持例行、觸發(fā)式、補(bǔ)數(shù)據(jù)、阻斷多個(gè)場(chǎng)景,融合質(zhì)量、安全等數(shù)據(jù)全生態(tài)。

4. 在 2021 下半年,我們開(kāi)始打造新一代調(diào)度系統(tǒng) Kwaiflow 3.0,以支持秒級(jí)調(diào)度,支持千萬(wàn)級(jí)任務(wù)規(guī)模。

在過(guò)去的五六年,快手的任務(wù)數(shù)每年成倍數(shù)增長(zhǎng),從數(shù)千個(gè)增長(zhǎng)到當(dāng)前的數(shù)十萬(wàn)個(gè),接入的平臺(tái)數(shù)從 0 增長(zhǎng)到數(shù)十個(gè),用戶(hù)當(dāng)前已覆蓋公司幾乎所有的業(yè)務(wù)方。

張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

在初期,快手使用 Airflow 當(dāng)作任務(wù)調(diào)度引擎,但后來(lái)又放棄了。我們?yōu)槭裁磿?huì)做出這樣的選擇呢?這就需要分析 Airflow 的優(yōu)點(diǎn)和痛點(diǎn)。Airflow 是以編程方式創(chuàng)建、調(diào)度和監(jiān)控工作流的開(kāi)源系統(tǒng)。Airflow 具有很多優(yōu)點(diǎn),包括:

  • 能力豐富,具有豐富的任務(wù)類(lèi)型,易用的流程控制;
  • UI 易用,較為方便地進(jìn)行可視化運(yùn)維;
  • 組件少易部署,上手難度不大。

這些優(yōu)點(diǎn)是我們選擇 Airflow 的原因。

但隨著任務(wù)規(guī)模增大,Airflow 的痛點(diǎn)也很明顯:

  • 性能較差:我們發(fā)現(xiàn),當(dāng) Airflow 單集群 Dag 數(shù)近 1 萬(wàn)時(shí),單任務(wù)調(diào)度延遲 P99 高達(dá) 5min,鏈路調(diào)度延遲高達(dá)數(shù)十分鐘,鏈路時(shí)效性難以保障。為了滿(mǎn)足業(yè)務(wù)增長(zhǎng),我們搭建了多個(gè)集群,運(yùn)維成本倍增。
  • 穩(wěn)定性不足:當(dāng)時(shí) Airflow Scheduler 沒(méi)有 HA,任務(wù)執(zhí)行時(shí)環(huán)境和資源不隔離,容易 OOM,導(dǎo)致調(diào)度故障比較多,年均故障數(shù)約 8 個(gè)。
  • 集成度低:二次開(kāi)發(fā)成本大,和周邊系統(tǒng)集成度低,開(kāi)放能力差,難以快速構(gòu)建生態(tài)。

由于這些痛點(diǎn)的存在,我們決定自研任務(wù)調(diào)度系統(tǒng)。

張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

02

快手任務(wù)調(diào)度整體設(shè)計(jì)

在 2019 年中旬,我們開(kāi)始自研任務(wù)調(diào)度系統(tǒng) Kwaiflow,并在下半年上線(xiàn) 1.0 版本。

Kwaiflow 是快手通用、高性能、易擴(kuò)展的分布式工作流調(diào)度系統(tǒng)。其設(shè)計(jì)目標(biāo)從兩方面考慮。

在功能型目標(biāo)方面

  • 場(chǎng)景豐富:支持多場(chǎng)景調(diào)度,多種環(huán)境執(zhí)行,支持多樣易擴(kuò)展的任務(wù)類(lèi)型
  • 運(yùn)維便捷:可以進(jìn)行可視化、智能、便捷地運(yùn)維
  • 便于開(kāi)放:具有強(qiáng)大的開(kāi)放能力,易于系統(tǒng)集成,構(gòu)建統(tǒng)一生態(tài)

在非功能型目標(biāo)方面

  • 高容量:支持百萬(wàn)級(jí)任務(wù)容量
  • 高性能:秒級(jí)或者亞秒級(jí)調(diào)度延遲
  • 高可用:可用性 99.99%,線(xiàn)上問(wèn)題少,出現(xiàn)時(shí)能及時(shí)發(fā)現(xiàn)快速并處理

在定位上,Kwaiflow 基于大數(shù)據(jù)體系和其它基礎(chǔ)設(shè)施,提供調(diào)度、執(zhí)行等核心能力,同時(shí)具有運(yùn)維、監(jiān)控報(bào)警、智能診斷、開(kāi)放服務(wù)等重要能力,構(gòu)建調(diào)度生態(tài);面向數(shù)據(jù)處理、流程編排、算法調(diào)度和分布式計(jì)算等場(chǎng)景。

張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

在調(diào)度模型上,Kwaiflow 采用了兩層實(shí)體的調(diào)度模型:

  • Task:執(zhí)行模板,用于執(zhí)行某一類(lèi)型的代碼;Task 有很多類(lèi)型,例如 HiveTask 用于執(zhí)行 Hive SQL,BashTask 用于執(zhí)行 Bash 腳本,HivePartitionSensorTask 用于探測(cè) hive 表分區(qū)是否存在。
  • DAG:一系列 Task 的集合,具有調(diào)度定時(shí)等屬性。

在依賴(lài)關(guān)系方面,DAG 之間可以相互依賴(lài),既可以同周期依賴(lài),也可以跨周期依賴(lài),還可以有依賴(lài)偏移。DAG 內(nèi)的 Task 之間也可以依賴(lài),由于他們調(diào)度屬性一致,所以都為同周期依賴(lài)。

一般來(lái)講,常見(jiàn)的調(diào)度模型除了雙層實(shí)體模型外,還有單層實(shí)體模型。單層實(shí)體模型沒(méi)有 DAG 的概念,只有 Task,Task 具有調(diào)度屬性,Task 之間相互依賴(lài)。兩種模型各有優(yōu)劣。雙層模型更適合快手的情況,具有更強(qiáng)的表達(dá)力,使用場(chǎng)景更廣泛,當(dāng)然也具有一定的復(fù)雜性。

張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

在系統(tǒng)架構(gòu)上:

  • API Server 提供各式各樣的接口,負(fù)責(zé)統(tǒng)一接入。
  • Scheduler 負(fù)責(zé)調(diào)度,不同的調(diào)度場(chǎng)景會(huì)有不同類(lèi)型的調(diào)度器,包括例行、觸發(fā)式、補(bǔ)數(shù)據(jù)、阻斷調(diào)度器。在例行調(diào)度器中,任務(wù)實(shí)例生成后,會(huì)依次經(jīng)過(guò)定時(shí)檢測(cè)、依賴(lài)檢測(cè)和資源檢測(cè)。如果都通過(guò),會(huì)提交到 Queue Service 中。
  • Queue Service 為帶 ack 機(jī)制的消息隊(duì)列服務(wù),會(huì)有不同的 channel,以便隔離任務(wù)。
  • Worker 負(fù)責(zé)任務(wù)的執(zhí)行,從屬一個(gè) worker 分組。不同分組的 Worker 消費(fèi) Queue Service 中不同 Channel 的任務(wù),根據(jù)不同的任務(wù)類(lèi)型進(jìn)行執(zhí)行。執(zhí)行分為本地執(zhí)行和容器化執(zhí)行兩種方式,本地執(zhí)行是指任務(wù)實(shí)例在 worker 內(nèi)通過(guò)新建進(jìn)程的方式執(zhí)行;具有啟動(dòng)快的特點(diǎn);容器化執(zhí)行是指在 k8s 遠(yuǎn)程執(zhí)行用戶(hù)代碼,具有資源隔離和環(huán)境隔離的特點(diǎn)。

除此之外,還有其它關(guān)鍵模塊,包括日志服務(wù)、報(bào)警服務(wù)、事件服務(wù)、實(shí)例血緣服務(wù)等。

張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

03

快手任務(wù)調(diào)度系統(tǒng)關(guān)鍵技術(shù)

1. 關(guān)鍵技術(shù):低調(diào)度延遲

調(diào)度延遲是指理論起調(diào)時(shí)刻到實(shí)際開(kāi)始運(yùn)行用戶(hù)代碼的時(shí)間差。調(diào)度延遲是衡量任務(wù)調(diào)度系統(tǒng)性能的重要指標(biāo)之一,該指標(biāo)越小越好。

任務(wù)實(shí)例從生成,到開(kāi)始運(yùn)行用戶(hù)代碼,需要經(jīng)過(guò)等待時(shí)間就緒、等待依賴(lài)就緒、等待資源就緒和準(zhǔn)備運(yùn)行環(huán)境四個(gè)階段。要有較小的調(diào)度延遲,就需要減少各個(gè)階段的系統(tǒng)時(shí)間損耗。調(diào)度延遲的主要因素與處理方案有:

  • 定時(shí)器。定時(shí)器在探測(cè)時(shí)間就緒環(huán)節(jié)起作用,一個(gè)精準(zhǔn)的、支持百萬(wàn)級(jí)別高吞吐的定時(shí)器,對(duì)低調(diào)度延遲至關(guān)重要。優(yōu)秀的定時(shí)器,時(shí)間損耗可以控制在毫秒內(nèi)。
  • 數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)。任務(wù)實(shí)例狀態(tài)發(fā)生變更后,需要對(duì)狀態(tài)進(jìn)行持久化。通過(guò)索引、讀寫(xiě)分離、分庫(kù)分表等方式,可以將單次數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)耗時(shí)控制在 1 ~ 3ms,總體耗時(shí)控制在 10ms 左右 。
  • 狀態(tài)轉(zhuǎn)變。任務(wù)實(shí)例自生成到運(yùn)行結(jié)束,會(huì)經(jīng)歷多次狀態(tài)轉(zhuǎn)變。狀態(tài)轉(zhuǎn)變高效與否是調(diào)度延遲的重要因素。一般來(lái)說(shuō)有兩種辦法:輪詢(xún)與事件觸發(fā)。我們采用的是事件觸發(fā)方式,第一時(shí)間感知狀態(tài)轉(zhuǎn)變。通過(guò)事件觸發(fā),時(shí)間損耗可以控制在毫秒內(nèi)。
  • 運(yùn)行環(huán)境準(zhǔn)備。這個(gè)環(huán)節(jié)主要工作包括加載鏡像、初始化運(yùn)行環(huán)境等。我們主要采用了預(yù)加載和鏡像預(yù)熱技術(shù)。不同的運(yùn)行環(huán)境,時(shí)間損耗不一樣,會(huì)在亞秒到分鐘不等。

這四個(gè)因素中,后兩者相對(duì)較復(fù)雜,接下來(lái)著重介紹狀態(tài)轉(zhuǎn)變和運(yùn)行環(huán)境準(zhǔn)備這兩部分。

張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

首先看狀態(tài)轉(zhuǎn)變這個(gè)因素。任務(wù)從發(fā)布,到調(diào)度執(zhí)行完成,會(huì)經(jīng)歷數(shù)次或者十?dāng)?shù)次狀態(tài)變化。如何進(jìn)行快速高效地狀態(tài)轉(zhuǎn)變是一個(gè)重要的問(wèn)題。Kwaiflow 的解決辦法是采用 Akka actor。充分利用了 akka actor 高性能特點(diǎn)。

具體來(lái)講:

1. Kwaiflow 的任務(wù)從 API Server 發(fā)布后,經(jīng)過(guò) Entry Actor 加載到 DagLoader Actors 中等待時(shí)間就緒;

2. 在時(shí)間就緒后,由 Instance Generator Actors 生成任務(wù)實(shí)例,然后進(jìn)入 Dependency Detector Actor 探測(cè)上游依賴(lài)就緒情況;

3. 在依賴(lài)就緒后,進(jìn)入 Resource Detector Actor 探測(cè)資源就緒情況;

4. 在資源就緒后,任務(wù)實(shí)例通過(guò) Queue Service 下發(fā)到 worker 中。

5. 任務(wù)實(shí)例在 worker 被接收后,將會(huì)由 Processor Actor 執(zhí)行,執(zhí)行前后會(huì)依次經(jīng)歷代碼渲染、Prehook、代碼執(zhí)行、Posthook 四個(gè)步驟。

6. 如果執(zhí)行成功,則流程終止;如果執(zhí)行失敗,Posthook 會(huì)將信息通過(guò) Processor Actor、ResultHandlerActor 傳遞給 scheduler 的 RetryerActor 進(jìn)行重試操作。

整個(gè)流程具有三個(gè)特點(diǎn):

  • 全流程事件觸發(fā):無(wú)輪詢(xún),任務(wù)發(fā)布、調(diào)度、執(zhí)行、重試,均為事件觸發(fā)。
  • 高吞吐:采用異步并發(fā)的方式,能快速調(diào)起大量任務(wù)實(shí)例
  • 簡(jiǎn)單易用:無(wú)需使用底層 API 進(jìn)行鎖和線(xiàn)程管理,專(zhuān)注業(yè)務(wù)實(shí)現(xiàn)。

采用 actor,狀態(tài)轉(zhuǎn)變導(dǎo)致的時(shí)間損耗控制在毫秒級(jí)別。

張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

接下來(lái)我們看運(yùn)行環(huán)境準(zhǔn)備這個(gè)因素。這和執(zhí)行場(chǎng)景有關(guān)。為了滿(mǎn)足不同的執(zhí)行場(chǎng)景,Kwaiflow 提供了兩種執(zhí)行方式:容器化執(zhí)行和本地執(zhí)行。

  • 容器化執(zhí)行:任務(wù)實(shí)例每次執(zhí)行前,在 k8s 按需申請(qǐng)容器資源,在容器中執(zhí)行任務(wù)實(shí)例,執(zhí)行完后,及時(shí)釋放容器資源。優(yōu)點(diǎn)是實(shí)現(xiàn)了執(zhí)行時(shí)的資源隔離和環(huán)境隔離;缺點(diǎn)是每次都需要申請(qǐng)和初始化容器資源,啟動(dòng)耗時(shí)長(zhǎng)。容器化執(zhí)行適合對(duì)資源、環(huán)境敏感的任務(wù),例如 Bash 任務(wù)。為了減少容器化執(zhí)行的啟動(dòng)耗時(shí),我們將鏡像分為自定義鏡像和通用鏡像,對(duì)通用鏡像進(jìn)行預(yù)熱,提前分發(fā)到機(jī)器中,減少鏡像下載耗時(shí)。通過(guò)鏡像預(yù)熱,可以將啟動(dòng)耗時(shí)從分鐘級(jí)降低到秒級(jí)。
  • 本地執(zhí)行:任務(wù)實(shí)例在 worker 機(jī)中,通過(guò)新建進(jìn)程的方式執(zhí)行。同一個(gè) worker 機(jī)中的所有任務(wù)實(shí)例共享計(jì)算資源和執(zhí)行環(huán)境。優(yōu)點(diǎn)是啟動(dòng)耗時(shí)短,overhead ??;缺點(diǎn)是資源和環(huán)境不隔離,一個(gè)任務(wù)實(shí)例執(zhí)行異常有可能導(dǎo)致整個(gè) worker 機(jī) crash。本地執(zhí)行適合對(duì)資源、環(huán)境不敏感的任務(wù),例如 Hive 和 Sensor 任務(wù)。本地執(zhí)行的啟動(dòng)耗時(shí)一般在亞秒級(jí)。
張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

2. 關(guān)鍵技術(shù):高可用

高可用對(duì)調(diào)度系統(tǒng)來(lái)說(shuō)非常重要。為了保障 Kwaiflow 的高可用,我們主要從兩方面進(jìn)行考慮:系統(tǒng)設(shè)計(jì)和故障發(fā)現(xiàn)處理。在系統(tǒng)設(shè)計(jì)上,Kwaiflow 可以做到高可靠執(zhí)行,即任務(wù)實(shí)例在復(fù)雜環(huán)境中 Exactly Once 執(zhí)行,做到不漏,且盡量不重。

對(duì)于高可靠執(zhí)行,常見(jiàn)的故障場(chǎng)景包括組件故障或者組件失聯(lián)。例如 scheduler crash、容器化任務(wù)與 worker 失聯(lián)等。

為了達(dá)到高可靠,我們主要從三方面考慮:

  • Failover 機(jī)制方面:通過(guò)自動(dòng)故障轉(zhuǎn)移和魯棒通信協(xié)議,來(lái)實(shí)現(xiàn)組件的自動(dòng)容錯(cuò)。例如 Kwaiflow 采用主備 Master,多 worker 的設(shè)計(jì)來(lái)避免單點(diǎn)問(wèn)題;各個(gè)組件之間采用魯棒通信協(xié)議來(lái)避免失聯(lián)問(wèn)題。協(xié)議包括 scheduler Executor 通信協(xié)議、Executor Runner 通信協(xié)議、External Job 通信協(xié)議。右圖展示了 Executor Runner 通信協(xié)議的主要流程,協(xié)議規(guī)定了任務(wù)提交、正常執(zhí)行、異常執(zhí)行、通信失聯(lián)的處理辦法,不依賴(lài)外部系統(tǒng)的狀態(tài)。
  • 避免遺漏執(zhí)行方面:通過(guò)消息 ack 機(jī)制,保障消息不丟失;同時(shí)通過(guò)定期兜底巡檢,保障任務(wù)實(shí)例不遺漏。
  • 避免重復(fù)執(zhí)行方面:通過(guò)狀態(tài)機(jī)轉(zhuǎn)移圖,避免不合理狀態(tài)轉(zhuǎn)變;同時(shí)通過(guò)重試前清理前一個(gè)實(shí)例,避免重復(fù)執(zhí)行。
張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

高可用方面,還有一個(gè)重要的系統(tǒng)設(shè)計(jì)是分級(jí)保障??焓衷谶M(jìn)行大型活動(dòng)例如春節(jié)、奧運(yùn)時(shí),整體數(shù)據(jù)量大幅度增長(zhǎng),局部數(shù)據(jù)呈數(shù)倍增長(zhǎng)。但計(jì)算資源是有限的,計(jì)算資源的增長(zhǎng)往往不能匹配數(shù)據(jù)量的增長(zhǎng),不能讓所有的任務(wù)和往常一樣按時(shí)產(chǎn)出。這時(shí)候我們就需要進(jìn)行分級(jí)保障。

所謂分級(jí)保障,就是在資源有限的情況下,讓高優(yōu)任務(wù)得到特權(quán),優(yōu)先得到執(zhí)行,優(yōu)先獲得充足的優(yōu)質(zhì)資源,保障產(chǎn)出時(shí)間;而低優(yōu)任務(wù)則會(huì)被延遲調(diào)度執(zhí)行,分配更少的資源。

在快手,整個(gè)離線(xiàn)體系,包括 Kwaiflow、Hive、Yarn、HDFS 等,都具有分級(jí)保障的能力。這里介紹 Kwaiflow 的分級(jí)保障能力,包括三方面:

  • Kwaiflow 調(diào)度器具有分級(jí)調(diào)度的能力。Kwaiflow 調(diào)度器能感知到資源調(diào)度系統(tǒng)的狀態(tài),在資源不足時(shí),Kwaiflow 任務(wù)會(huì)在調(diào)度器排隊(duì),高優(yōu)任務(wù)排在前面,低優(yōu)任務(wù)排在后面;當(dāng)資源得到釋放時(shí),高優(yōu)任務(wù)優(yōu)先被調(diào)度。
  • Kwaiflow 的執(zhí)行器按照不同優(yōu)先級(jí)進(jìn)行分組。包括三組:P0 執(zhí)行器組、P1 執(zhí)行器組以及 P2 P3 執(zhí)行器組。P0 執(zhí)行器用于執(zhí)行最高優(yōu)先級(jí)的 P0 任務(wù),具有充足的 worker,P0 任務(wù)實(shí)例基本不會(huì)在執(zhí)行器層被限制。對(duì)于 P2 P3 分組,在調(diào)度高峰期,任務(wù)實(shí)例很多時(shí),可能存在排隊(duì)執(zhí)行的情況。
  • Kwaiflow 具有較強(qiáng)的人工管控能力,可以人為地允許或者阻斷某些任務(wù)的調(diào)度。典型使用場(chǎng)景是在大型活動(dòng)期間,可以根據(jù)預(yù)案,對(duì)低優(yōu)先級(jí)的任務(wù)人為進(jìn)行延遲調(diào)度,保障資源分配給高優(yōu)任務(wù)。
張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

前面主要從系統(tǒng)設(shè)計(jì)方面介紹了線(xiàn)上故障的自動(dòng)規(guī)避。Kwaiflow 高可用的第二個(gè)方面是故障的發(fā)現(xiàn)和處理。如果故障發(fā)現(xiàn)不及時(shí)、處理不迅速,會(huì)出現(xiàn)大規(guī)模的調(diào)度錯(cuò)誤或者調(diào)度延遲故障。在快手調(diào)度系統(tǒng)發(fā)展的過(guò)程中,我們碰到過(guò)這樣的大故障,為了避免再次發(fā)生,我們建立了完備的監(jiān)控預(yù)案體系。

  • 在監(jiān)控方面,我們分成使用層、服務(wù)層、依賴(lài)層三個(gè)層次,并劃分監(jiān)控優(yōu)先級(jí),采用不同的響應(yīng)方式。
  • 在故障預(yù)案方面,我們有兩類(lèi)預(yù)案:系統(tǒng)故障處理預(yù)案用于處理調(diào)度系統(tǒng)自身問(wèn)題;數(shù)據(jù)異常處理預(yù)案用于處理鏈路數(shù)據(jù)不正確的問(wèn)題。我們沉淀了多場(chǎng)景的阻斷恢復(fù)和補(bǔ)數(shù)據(jù)工具,能夠在數(shù)分鐘內(nèi)啟動(dòng)數(shù)據(jù)恢復(fù)。
  • 在演練方面,我們定期對(duì)預(yù)案進(jìn)行演練,保證預(yù)案的可用性,操作的熟練性。
張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

3. 關(guān)鍵技術(shù):開(kāi)放能力

開(kāi)放是數(shù)據(jù)中臺(tái)的核心競(jìng)爭(zhēng)力。只有足夠開(kāi)放,才能給予使用者自由的發(fā)揮空間,滿(mǎn)足更多使用場(chǎng)景;只有足夠開(kāi)放,才能構(gòu)建數(shù)據(jù)生態(tài),提供更豐富的能力。Kwaiflow 提供了多種開(kāi)放能力:

  • Kwaiflow 具有開(kāi)放的 API,支持多語(yǔ)言 SDK,提供了標(biāo)準(zhǔn)化的接入流程、使用手冊(cè)和接入 demo。
  • Kwaiflow 提供了標(biāo)準(zhǔn)的事件。包括任務(wù)操作事件、任務(wù)實(shí)例狀態(tài)變更事件、任務(wù)實(shí)例診斷事件等。根據(jù)這些事件,可以完整復(fù)現(xiàn)出任務(wù)和任務(wù)實(shí)例的全生命周期。
  • Kwaiflow 提供了插件化任務(wù)類(lèi)型。開(kāi)發(fā)者可以定義和開(kāi)發(fā)自定義的任務(wù)類(lèi)型,并進(jìn)行靈活測(cè)試、灰度上線(xiàn)和管理。
  • Kwaiflow 提供了 Hook,可以在用戶(hù)代碼運(yùn)行前后執(zhí)行。包括執(zhí)行前的 Prehook 和執(zhí)行后的 Posthook。常見(jiàn)場(chǎng)景包括用于代碼渲染、前置檢查的 Prehook,以及用于執(zhí)行后數(shù)據(jù)質(zhì)量檢測(cè)的 Posthook。
張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

04

快手任務(wù)調(diào)度系統(tǒng)的應(yīng)用與成果

如果把任務(wù)調(diào)度系統(tǒng)比作大樓的骨架,那么基于任務(wù)調(diào)度系統(tǒng)的應(yīng)用就是裝修完善、適于人工作生活的大廈。通過(guò)應(yīng)用,能更好地體現(xiàn)任務(wù)調(diào)度系統(tǒng)的價(jià)值。在快手,集成開(kāi)發(fā)平臺(tái)是任務(wù)調(diào)度系統(tǒng)的一個(gè)典型應(yīng)用。

集成開(kāi)發(fā)平臺(tái)是快手的一站式離線(xiàn)數(shù)據(jù)開(kāi)發(fā)平臺(tái)。它使用 kwaiflow 作為統(tǒng)一的編排與調(diào)度系統(tǒng),構(gòu)建了各類(lèi)的數(shù)據(jù)開(kāi)發(fā)運(yùn)維等服務(wù),提供了數(shù)據(jù)查詢(xún)、同步、開(kāi)發(fā)、服務(wù)化、運(yùn)維、管理等能力。

該平臺(tái)具有三個(gè)特點(diǎn):

  • 一站式:平臺(tái)涵蓋離線(xiàn)數(shù)據(jù)開(kāi)發(fā)的各環(huán)節(jié),包括數(shù)據(jù)接入、數(shù)據(jù)加工、數(shù)據(jù)分發(fā)和數(shù)據(jù)服務(wù)化。用戶(hù)可以方便地進(jìn)行數(shù)據(jù)源管理,創(chuàng)建數(shù)據(jù)接入任務(wù)將各種數(shù)據(jù)源導(dǎo)入到大數(shù)據(jù)系統(tǒng)中;用戶(hù)可以通過(guò)智能 IDE 編寫(xiě)、測(cè)試和發(fā)布 ETL 任務(wù),對(duì)數(shù)據(jù)進(jìn)行加工處理,產(chǎn)生高價(jià)值的數(shù)據(jù);用戶(hù)還可以創(chuàng)建數(shù)據(jù)分發(fā)任務(wù),將高價(jià)值數(shù)據(jù)分發(fā)到其它存儲(chǔ)引擎中,例如關(guān)系型數(shù)據(jù)庫(kù)、非關(guān)系型數(shù)據(jù)庫(kù)、緩存系統(tǒng)、OLAP 引擎等。用戶(hù)也可以直接通過(guò)配置的方式創(chuàng)建服務(wù)化 API,為線(xiàn)上系統(tǒng)提供服務(wù)。
  • 通用:集成開(kāi)發(fā)平臺(tái)能統(tǒng)一運(yùn)維 Kwaiflow 所有任務(wù),包括任務(wù)運(yùn)維、實(shí)例運(yùn)維、鏈路運(yùn)維等方式,適合數(shù)據(jù)開(kāi)發(fā)、定時(shí)調(diào)度、觸發(fā)式調(diào)度等場(chǎng)景。
  • 智能:在開(kāi)發(fā)環(huán)節(jié),通過(guò)智能 IDE,能及時(shí)發(fā)現(xiàn)代碼問(wèn)題;在運(yùn)維環(huán)節(jié),通過(guò)智能監(jiān)控、智能診斷,能及時(shí)發(fā)現(xiàn)任務(wù)和鏈路問(wèn)題,并輔助定位問(wèn)題原因。
張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

任務(wù)調(diào)度系統(tǒng)要得到廣泛使用,不僅要有強(qiáng)大的自身能力,更要有豐富的生態(tài)體系。在快手,Kwaiflow 和大數(shù)據(jù)的其它系統(tǒng)深度集成,接入了 Kwaiflow,便可以便捷地使用其它大數(shù)據(jù)系統(tǒng)的能力??梢哉f(shuō),自身能力和生態(tài)體系對(duì) Kwaiflow 來(lái)說(shuō)同等重要。

首先,就自身而言,Kwaiflow 具有強(qiáng)大的調(diào)度執(zhí)行能力。包括多場(chǎng)景調(diào)度能力、多樣化的執(zhí)行能力、易用的運(yùn)維能力和高可用的特性。

其次,Kwaiflow 具有資源管控能力。接入 Kwaiflow,便可以方便地使用大數(shù)據(jù)資源和容器資源。

最后,Kwaiflow 無(wú)縫集成了其它中臺(tái)能力。包括數(shù)據(jù)質(zhì)量、數(shù)據(jù)安全體系、完整準(zhǔn)確的任務(wù)實(shí)例血緣、鏈路元數(shù)據(jù)、鏈路保障體系。

張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

將從性能、功能和使用情況三個(gè)方面介紹 Kwaiflow 的成果。

在性能方面,和 Airflow 相比,有極大的提升:

  • 在規(guī)模上,Kwaiflow 初版設(shè)計(jì)容量為百萬(wàn)級(jí)別任務(wù),當(dāng)前已有數(shù)十萬(wàn)的任務(wù)數(shù),和 Airflow 單集群不超過(guò) 1 萬(wàn)相比,提升了數(shù)十倍。
  • 在性能上,Kwaiflow 調(diào)度高峰期的調(diào)度延遲 P99 小于 5 秒,和 Airflow 5 分鐘相比,有數(shù)量級(jí)的提升;Kwaiflow 起調(diào)速率十?dāng)?shù)萬(wàn)每分鐘,和 Airflow 數(shù)千每分鐘對(duì)比,提升了數(shù)十倍;Kwaiflow 運(yùn)行的并發(fā)實(shí)例數(shù)十?dāng)?shù)萬(wàn)萬(wàn),和 Airflow 小于1萬(wàn)相比,提升了十?dāng)?shù)倍。
  • 在穩(wěn)定性上,Kwaiflow 可用性為 99.99%, Airflow 則為 99.5%;Kwaiflow 年故障數(shù)約 1 個(gè),而 Airflow 年均為 8 個(gè)。

在功能方面,Kwaiflow:

  • 具有強(qiáng)大的調(diào)度能力,支持多調(diào)度場(chǎng)景、支持各種復(fù)雜依賴(lài)流程編排。
  • 具有靈活的執(zhí)行方式,豐富易擴(kuò)展的任務(wù)類(lèi)型。
  • 具有便捷的運(yùn)維中心,任務(wù)、實(shí)例、鏈路可視化運(yùn)維,智能化運(yùn)維。
  • 具有多種資源管控能力,支持多租戶(hù),可方便使用和管理大數(shù)據(jù)與容器資源。
  • 全面集成數(shù)據(jù)中臺(tái)能力,包括數(shù)據(jù)質(zhì)量與安全體系、血緣、元數(shù)據(jù)、鏈路保障體系。

在使用情況方面,Kwaiflow:

  • 面向全公司,接入了數(shù)據(jù)、算法領(lǐng)域數(shù)十個(gè)平臺(tái),包括指標(biāo)模型管理平臺(tái)、AB 測(cè)試平臺(tái)、用戶(hù)畫(huà)像、機(jī)器學(xué)習(xí)平臺(tái)等。
  • 面向主站、電商、商業(yè)化、海外、游戲等幾乎公司所有業(yè)務(wù)方。
張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

在未來(lái),Kwaiflow 主要朝著三個(gè)方向發(fā)展:

  • 更通用化:更好地支持觸發(fā)式調(diào)度,更復(fù)雜的在線(xiàn)流程編排,探索分布式計(jì)算。
  • 更高性能:更好地支持秒級(jí)調(diào)度,支持千萬(wàn)級(jí)規(guī)模任務(wù)實(shí)例,支持大規(guī)模觸發(fā)式調(diào)度。
  • 更豐富的功能:更豐富的容器資源管理能力,完善的自動(dòng)化測(cè)試系統(tǒng)和大規(guī)模模擬演練系統(tǒng),更加快速的部署能力。
張蕤:快手大數(shù)據(jù)任務(wù)調(diào)度系統(tǒng)設(shè)計(jì)與實(shí)踐

今天的分享就到這里,謝謝大家。

本文經(jīng)授權(quán)發(fā)布,不代表增長(zhǎng)黑客立場(chǎng),如若轉(zhuǎn)載,請(qǐng)注明出處:http://m.allfloridahomeinspectors.com/cgo/product/64351.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
上一篇 2022-04-13 12:10
下一篇 2022-04-13 12:15

增長(zhǎng)黑客Growthhk.cn薦讀更多>>

發(fā)表回復(fù)

登錄后才能評(píng)論