阿里數(shù)據(jù)研發(fā)崗位的工作大致可以概括為:了解需求→模型設(shè)計(jì)→ETL開發(fā)→測試→發(fā)布上線→日常運(yùn)維→任務(wù)下線。與傳統(tǒng)的數(shù)據(jù)倉庫開發(fā)(ETL)相比,阿里數(shù)據(jù)研發(fā)有如下幾個(gè)特點(diǎn):
- 業(yè)務(wù)變更頻繁——業(yè)務(wù)發(fā)展非常快,業(yè)務(wù)需求多且變更頻繁;
- 需要快速交付——業(yè)務(wù)驅(qū)動(dòng),需要快速給出結(jié)果;
- 頻繁發(fā)布上線——迭代周期以天為單位,每天需要發(fā)布數(shù)次;
- 運(yùn)維任務(wù)多——在集團(tuán)公共層平均每個(gè)開發(fā)人員負(fù)責(zé)上百多個(gè)任務(wù);
- 系統(tǒng)環(huán)境復(fù)雜——阿里平臺系統(tǒng)多為自研,且為了保證業(yè)務(wù)的發(fā)展,平臺系統(tǒng)的迭代速度較快,平臺的穩(wěn)定性壓力較大。
- 通過統(tǒng)一的計(jì)算平臺(MaxCompute)、統(tǒng)一的開發(fā)平臺、統(tǒng)一的數(shù)據(jù)模型規(guī)范和統(tǒng)一的數(shù)據(jù)研發(fā)規(guī)范,可以在一定程度上解決數(shù)據(jù)研發(fā)的痛點(diǎn)。
本文主要介紹MaxCompute和阿里巴巴內(nèi)部基于MaxCompute的大數(shù)據(jù)開發(fā)套件,并對在數(shù)據(jù)開發(fā)過程中經(jīng)常遇到的問題和相關(guān)解決方案進(jìn)行介紹。
1、統(tǒng)一計(jì)算平臺
阿里離線數(shù)據(jù)倉庫的存儲(chǔ)和計(jì)算都是在阿里云大數(shù)據(jù)計(jì)算服務(wù)MaxCompute上完成的。
大數(shù)據(jù)計(jì)算服務(wù)MaxCompute是由阿里云自主研發(fā)的海量數(shù)據(jù)處理平臺,主要服務(wù)于海量數(shù)據(jù)的存儲(chǔ)和計(jì)算,提供完善的數(shù)據(jù)導(dǎo)入方案,以及多種經(jīng)典的分布式計(jì)算模型,提供海量數(shù)據(jù)倉庫的解決方案,能夠更快速地解決用戶的海量數(shù)據(jù)計(jì)算問題,有效降低企業(yè)成本,并保障數(shù)據(jù)安全。
MaxCompute采用抽象的作業(yè)處理框架,將不同場景的各種計(jì)算任務(wù)統(tǒng)一在同一個(gè)平臺之上,共享安全、存儲(chǔ)、數(shù)據(jù)管理和資源調(diào)度,為來自不同用戶需求的各種數(shù)據(jù)處理任務(wù)提供統(tǒng)一的編程接口和界面。它提供數(shù)據(jù)上傳/下載通道、SQL、MapReduce、機(jī)器學(xué)習(xí)算法、圖編程模型和流式計(jì)算模型多種計(jì)算分析服務(wù),并且提供完善的安全解決方案。
1.MaxCompute的體系架構(gòu)
MaxCompute由四部分組成,分別是客戶端(MaxCompute Client)、接入層(MaxCompute Front End)、邏輯層(MaxCompute Server)及存儲(chǔ)與計(jì)算層(Apsara Core)。

圖:MaxCompute體系架構(gòu)圖
2.MaxCompute的特點(diǎn)
(1)計(jì)算性能高且更加普惠
2016年11月10日,Sort Benchmark在官方網(wǎng)站公布了2016年排序競賽CloudSort項(xiàng)目的最終成績。阿里云以$1.44/TB的成績獲得 Indy(專用目的排序)和Daytona(通用目的排序)兩個(gè)子項(xiàng)的世界冠軍,打破了AWS在2014年保持的紀(jì)錄$4.51/TB。這意味著阿里云將世界頂級的計(jì)算能力,變成普惠科技的云產(chǎn)品。CloudSort又被稱為“云計(jì)算效率之爭”,這項(xiàng)目賽比拼的是完成100TB數(shù)據(jù)排序誰的花費(fèi)更少,也是Sort Benchmark的各項(xiàng)比賽當(dāng)中最具現(xiàn)實(shí)意義的項(xiàng)目之一。
。2)集群規(guī)模大且穩(wěn)定性高
MaxCompute平臺共有幾萬臺機(jī)器、存儲(chǔ)近1000PB,支撐著阿里巴巴的很多業(yè)務(wù)系統(tǒng),包括數(shù)據(jù)倉庫、BI分析和決策支持、信用評估和無擔(dān)保貸款風(fēng)險(xiǎn)控制、廣告業(yè)務(wù)、每天幾十億流量的搜索和推薦相關(guān)性分析等,系統(tǒng)運(yùn)行非常穩(wěn)定。同時(shí),MaxCompute能保證數(shù)據(jù)的正確性,如對數(shù)據(jù)的準(zhǔn)確性要求非常高的螞蟻金服小額貸款業(yè)務(wù),就運(yùn)行于MaxCompute平臺之上。
。3)功能組件非常強(qiáng)大
- MaxCompute SQL:標(biāo)準(zhǔn)SQL的語法,提供各類操作和函數(shù)來處理數(shù)據(jù)。
- MaxCompute MapReduce:提供Java MapReduce 編程模型,通過接口編寫MR程序處理MaxCompute中的數(shù)據(jù)。還提供基于MapReduce的擴(kuò)展模型MR2,在該模型下,一個(gè)Map函數(shù)后可以接入連續(xù)多個(gè)Reduce函數(shù),執(zhí)行效率比普通的MapReduce模型高。
- MaxCompute Graph:面向迭代的圖計(jì)算處理框架,典型應(yīng)用有PageRank、單源最短距離算法、K-均值聚類算法。
- Spark:使用Spark接口編程處理存儲(chǔ)在MaxCompute中的數(shù)據(jù)。
- RMaxCompute:使用R處理MaxCompute中的數(shù)據(jù)。
- Volume:MaxCompute以Volume的形式支持文件,管理非二維表數(shù)據(jù)。
。4)安全性高
MaxCompute提供功能強(qiáng)大的安全服務(wù),為用戶的數(shù)據(jù)安全提供保護(hù)。MaxCompute采用多租戶數(shù)據(jù)安全體系,實(shí)現(xiàn)用戶認(rèn)證、項(xiàng)目空間的用戶與授權(quán)管理、跨項(xiàng)目空間的資源分享,以及項(xiàng)目空間的數(shù)據(jù)保護(hù)。如支付寶數(shù)據(jù),符合銀行監(jiān)管的安全性要求,支持各種授權(quán)鑒權(quán)審查和“最小訪問權(quán)限”原則,確保數(shù)據(jù)安全。
2、統(tǒng)一開發(fā)平臺
阿里數(shù)據(jù)開發(fā)平臺集成了多個(gè)子系統(tǒng)來解決實(shí)際生產(chǎn)中的各種痛點(diǎn)。圍繞MaxCompute計(jì)算平臺,從任務(wù)開發(fā)、調(diào)試、測試、發(fā)布、監(jiān)控、報(bào)警到運(yùn)維管理,形成了整套工具和產(chǎn)品,既提高了開發(fā)效率,又保證了數(shù)據(jù)質(zhì)量,并且在確保數(shù)據(jù)產(chǎn)出時(shí)效的同時(shí),能對數(shù)據(jù)進(jìn)行有效管理。
數(shù)據(jù)研發(fā)人員完成需求了解和模型設(shè)計(jì)之后,進(jìn)入開發(fā)環(huán)節(jié),開發(fā)工作流如圖所示。

圖:開發(fā)工作流圖
對應(yīng)于開發(fā)工作流的產(chǎn)品和工具如下圖所示,我們將對其功能進(jìn)行簡要介紹。
1.在云端(D2)
D2是集成任務(wù)開發(fā)、調(diào)試及發(fā)布,生產(chǎn)任務(wù)調(diào)度及大數(shù)據(jù)運(yùn)維,數(shù)據(jù)權(quán)限申請及管理等功能的一站式數(shù)據(jù)開發(fā)平臺,并能承擔(dān)數(shù)據(jù)分析工作臺的功能。

圖:對應(yīng)于開發(fā)工作流的產(chǎn)品和工具
用戶使用D2進(jìn)行數(shù)據(jù)開發(fā)的基本流程如下:
——用戶使用IDE進(jìn)行計(jì)算節(jié)點(diǎn)的創(chuàng)建,可以是SQL/MR任務(wù),也可以是Shell任務(wù)或者數(shù)據(jù)同步任務(wù)等,用戶需要編寫節(jié)點(diǎn)代碼、設(shè)置節(jié)點(diǎn)屬性和通過輸入輸出關(guān)聯(lián)節(jié)點(diǎn)間依賴。設(shè)置好這些后,可以通過試運(yùn)行來測試計(jì)算邏輯是否正確、結(jié)果是否符合預(yù)期。
——用戶點(diǎn)擊提交,節(jié)點(diǎn)進(jìn)入開發(fā)環(huán)境中,并成為某個(gè)工作流的其中一個(gè)節(jié)點(diǎn)。整個(gè)工作流可以被觸發(fā)調(diào)度,這種觸發(fā)可以是人為的(稱之為“臨時(shí)工作流”),也可以是系統(tǒng)自動(dòng)的(稱之為“日常工作流”)。當(dāng)某個(gè)節(jié)點(diǎn)滿足所有觸發(fā)條件后,會(huì)被下發(fā)到調(diào)度系統(tǒng)的執(zhí)行引擎Alisa中,完成資源分配和執(zhí)行的整個(gè)過程。
如果節(jié)點(diǎn)在開發(fā)環(huán)境中運(yùn)行無誤,用戶可以點(diǎn)擊發(fā)布,將該節(jié)點(diǎn)正式提交到生產(chǎn)環(huán)境中,成為線上生產(chǎn)鏈路的一個(gè)環(huán)節(jié)。
2.SQLSCAN
SQLSCAN將在任務(wù)開發(fā)中遇到的各種問題,如用戶編寫的SQL質(zhì)量差、性能低、不遵守規(guī)范等,總結(jié)后形成規(guī)則,并通過系統(tǒng)及研發(fā)流程保障,事前解決故障隱患,避免事后處理。
SQLSCAN與D2進(jìn)行結(jié)合,嵌入到開發(fā)流程中,用戶在提交代碼時(shí)會(huì)觸發(fā)SQLSCAN檢查。SQLSCAN工作流程如下圖所示。

圖:SQLSCAN工作流程圖
用戶在D2的IDE中編寫代碼。
- ——用戶提交代碼,D2將代碼、調(diào)度等信息傳到SQLSCAN。
- ——SQLSCAN根據(jù)所配置的規(guī)則執(zhí)行相應(yīng)的規(guī)則校驗(yàn)。
- ——SQLSCAN將檢查成功或者失敗的信息傳回D2。
- ——D2的IDE顯示OK(成功)、WARNNING(警告)、FAILED(失敗,禁止用戶提交)等消息。
SQLSCAN主要有如下三類規(guī)則校驗(yàn):
代碼規(guī)范類規(guī)則,如表命名規(guī)范、生命周期設(shè)置、表注釋等。
代碼質(zhì)量類規(guī)則,如調(diào)度參數(shù)使用檢查、分母為0提醒、NULL值參與計(jì)算影響結(jié)果提醒、插入字段順序錯(cuò)誤等。
代碼性能類規(guī)則,如分區(qū)裁剪失效、掃描大表提醒、重復(fù)計(jì)算檢測等。
SQLSCAN規(guī)則有強(qiáng)規(guī)則和弱規(guī)則兩類。觸發(fā)強(qiáng)規(guī)則后,任務(wù)的提交會(huì)被阻斷,必須修復(fù)代碼后才能再次提交;而觸發(fā)弱規(guī)則,則只會(huì)顯示違反規(guī)則的提示,用戶可以繼續(xù)提交任務(wù)。
3.DQC
DQC(Data Quality Center,數(shù)據(jù)質(zhì)量中心)主要關(guān)注數(shù)據(jù)質(zhì)量,通過配置數(shù)據(jù)質(zhì)量校驗(yàn)規(guī)則,自動(dòng)在數(shù)據(jù)處理任務(wù)過程中進(jìn)行數(shù)據(jù)質(zhì)量方面的監(jiān)控。
DQC主要有數(shù)據(jù)監(jiān)控和數(shù)據(jù)清洗兩大功能。數(shù)據(jù)監(jiān)控,顧名思義,能監(jiān)控?cái)?shù)據(jù)質(zhì)量并報(bào)警,其本身不對數(shù)據(jù)產(chǎn)出進(jìn)行處理,需要報(bào)警接收人判斷并決定如何處理;而數(shù)據(jù)清洗則是將不符合既定規(guī)則的數(shù)據(jù)清洗掉,以保證最終數(shù)據(jù)產(chǎn)出不含“臟數(shù)據(jù)”,數(shù)據(jù)清洗不會(huì)觸發(fā)報(bào)警。
DQC數(shù)據(jù)監(jiān)控規(guī)則有強(qiáng)規(guī)則和弱規(guī)則之分,強(qiáng)規(guī)則會(huì)阻斷任務(wù)的執(zhí)行(將任務(wù)置為失敗狀態(tài),其下游任務(wù)將不會(huì)被執(zhí)行);而弱規(guī)則只告警而不會(huì)阻斷任務(wù)的執(zhí)行。常見的DQC監(jiān)控規(guī)則有:主鍵監(jiān)控、表數(shù)據(jù)量及波動(dòng)監(jiān)控、重要字段的非空監(jiān)控、重要枚舉字段的離散值監(jiān)控、指標(biāo)值波動(dòng)監(jiān)控、業(yè)務(wù)規(guī)則監(jiān)控等。
阿里數(shù)據(jù)倉庫的數(shù)據(jù)清洗采用非侵入式的清洗策略,在數(shù)據(jù)同步過程中不進(jìn)行數(shù)據(jù)清洗,避免影響數(shù)據(jù)同步的效率,其過程在數(shù)據(jù)進(jìn)入ODS層之后執(zhí)行。對于需要清洗的表,首先在DQC配置清洗規(guī)則;對于離線任務(wù),每隔固定的時(shí)間間隔,數(shù)據(jù)入倉之后,啟動(dòng)清洗任務(wù),調(diào)用DQC配置的清洗規(guī)則,將符合清洗規(guī)則的數(shù)據(jù)清洗掉,并保存至DIRTY表歸檔。如果清洗掉的數(shù)據(jù)量大于預(yù)設(shè)的閾值,則阻斷任務(wù)的執(zhí)行;否則不會(huì)阻斷。
DQC工作流程如下圖所示。

圖:DQC工作流程圖
4.在彼岸
數(shù)據(jù)測試的典型測試方法是功能測試,主要驗(yàn)證目標(biāo)數(shù)據(jù)是否符合預(yù)期。其主要有如下場景:
。1)新增業(yè)務(wù)需求
新增產(chǎn)品經(jīng)理、運(yùn)營、BI等的報(bào)表、應(yīng)用或產(chǎn)品需求,需要開發(fā)新的ETL任務(wù),此時(shí)應(yīng)對上線前的ETL任務(wù)進(jìn)行測試,確保目標(biāo)數(shù)據(jù)符合業(yè)務(wù)預(yù)期,避免業(yè)務(wù)方根據(jù)錯(cuò)誤數(shù)據(jù)做出決策。其主要對目標(biāo)數(shù)據(jù)和源數(shù)據(jù)進(jìn)行對比,包括數(shù)據(jù)量、主鍵、字段空值、字段枚舉值、復(fù)雜邏輯(如UDF、多路分支)等的測試。
(2)數(shù)據(jù)遷移、重構(gòu)和修改
由于數(shù)據(jù)倉庫系統(tǒng)遷移、源系統(tǒng)業(yè)務(wù)變化、業(yè)務(wù)需求變更或重構(gòu)等,需要對現(xiàn)有的代碼邏輯進(jìn)行修改,為保證數(shù)據(jù)質(zhì)量需要對修改前后的數(shù)據(jù)進(jìn)行對比,包括數(shù)據(jù)量差異、字段值差異對比等,保證邏輯變更正確。為了嚴(yán)格保證數(shù)據(jù)質(zhì)量,對于優(yōu)先級(優(yōu)先級的定義見“數(shù)據(jù)質(zhì)量”章節(jié))大于某個(gè)閾值的任務(wù),強(qiáng)制要求必須使用在彼岸進(jìn)行回歸測試,在彼岸回歸測試通過之后,才允許進(jìn)入發(fā)布流程。
在彼岸則是用于解決上述測試問題而開發(fā)的大數(shù)據(jù)系統(tǒng)的自動(dòng)化測試平臺,將通用的、重復(fù)性的操作沉淀在測試平臺中,避免被“人肉”,提高測試效率。
在彼岸主要包含如下組件,除滿足數(shù)據(jù)測試的數(shù)據(jù)對比組件之外,還有數(shù)據(jù)分布和數(shù)據(jù)脫敏組件。
- 數(shù)據(jù)對比:支持不同集群、異構(gòu)數(shù)據(jù)庫的表做數(shù)據(jù)對比。表級對比規(guī)則主要包括數(shù)據(jù)量和全文對比;字段級對比規(guī)則主要包括字段的統(tǒng)計(jì)值(如SUM、AVG、MAX、MIN等)、枚舉值、空值、去重?cái)?shù)、長度值等。
- 數(shù)據(jù)分布:提取表和字段的一些特征值,并將這些特征值與預(yù)期值進(jìn)行比對。表級數(shù)據(jù)特征提取主要包括數(shù)據(jù)量、主鍵等;字段級數(shù)據(jù)特征提取主要包括字段枚舉值分布、空值分布、統(tǒng)計(jì)值(如SUM、AVG、MAX、MIN等)、去重?cái)?shù)、長度值等。
- 數(shù)據(jù)脫敏:將敏感數(shù)據(jù)模糊化。在數(shù)據(jù)安全的大前提下,實(shí)現(xiàn)線上數(shù)據(jù)脫敏,在保證數(shù)據(jù)安全的同時(shí)又保持?jǐn)?shù)據(jù)形態(tài)的分布,以便業(yè)務(wù)聯(lián)調(diào)、數(shù)據(jù)調(diào)研和數(shù)據(jù)交換。
使用在彼岸進(jìn)行回歸測試的流程如下圖所示。

圖:使用在彼岸進(jìn)行回歸測試流程圖
注:本書中出現(xiàn)的部分專有名詞、專業(yè)術(shù)語、產(chǎn)品名稱、軟件項(xiàng)目名稱、工具名稱等,是淘寶(中國)軟件有限公司內(nèi)部項(xiàng)目的慣用詞語,如與第三方名稱雷同,實(shí)屬巧合。來源:阿里云云棲號