- SQL機器學習庫MADlib技術解析
- 王雪迎
- 2637字
- 2020-06-29 18:08:03
1.1 基本概念
1.1.1 MADlib是什么
無論是經(jīng)典的SAS、SPSS還是時下流行的MATLAB、R、Python,所有這些機器學習或數(shù)據(jù)挖掘軟件都是自成系統(tǒng)的,具體來說就是具有一套完整的程序語言及其集成開發(fā)環(huán)境,提供了豐富的數(shù)學和統(tǒng)計分析函數(shù),具備良好的人機交互界面,支持從數(shù)據(jù)準備、數(shù)據(jù)探索、數(shù)據(jù)預處理到開發(fā)和實現(xiàn)模型算法、數(shù)據(jù)可視化,再到最終結(jié)果的驗證與模型部署及應用的全過程。它們都是面向程序員的系統(tǒng)或語言,重點在于由程序員自己利用系統(tǒng)提供的基本計算方法或函數(shù),通過編程的方式實現(xiàn)應用需求。
MADlib具有與上述工具完全不同的設計理念,不是面向程序員,而是面向數(shù)據(jù)庫開發(fā)人員或DBA。如果要用一句話說明什么是MADlib,那就是“SQL中的大數(shù)據(jù)機器學習庫”。通常SQL查詢能發(fā)現(xiàn)數(shù)據(jù)最明顯的模式和趨勢,但要想獲取數(shù)據(jù)中最為有用的信息,需要的其實是完全不同的一套技術,一套牢固扎根于數(shù)學和應用數(shù)學的技能(機器學習),而具備這種技術的人才似乎只存在于學術界中。如果能將SQL的簡單易用與數(shù)據(jù)挖掘的復雜算法結(jié)合起來,充分利用兩者的優(yōu)勢和特點,對于廣大傳統(tǒng)數(shù)據(jù)庫應用技術人員來說,就可將他們長期積累的數(shù)據(jù)庫操作技能復用到機器學習領域,使轉(zhuǎn)型更加輕松。現(xiàn)在,魚和熊掌兼得的機會來了,DBA只要使用MADlib,就能用SQL查詢實現(xiàn)簡單的機器學習。
對用戶而言,MADlib提供了可在SQL查詢語句中調(diào)用的函數(shù),即可以用select+function name的方式來調(diào)用這個庫。這就意味著,所有的數(shù)據(jù)調(diào)用和計算都在數(shù)據(jù)庫內(nèi)完成而不需要數(shù)據(jù)的導入導出。MADlib不僅包括基本的線性代數(shù)運算和統(tǒng)計函數(shù),還提供了常用的、現(xiàn)成的機器學習模型函數(shù)。用戶不需要深入了解算法的程序?qū)崿F(xiàn)細節(jié),只要搞清楚各函數(shù)中相關參數(shù)的含義、提供正確的入?yún)⒉⒛軌蚶斫夂徒忉尯瘮?shù)的輸出結(jié)果即可。這種使用方式無疑會極大地提高開發(fā)效率,節(jié)約開發(fā)成本。在MADlib的世界里,一切皆函數(shù),就是這么簡單。
然而,任何事物都具有兩面性,雖然MADlib提供了使用方便性、降低了學習和使用門檻,但是相對于其他機器學習系統(tǒng)而言,其靈活性與功能完備性顯然是短板。首先,模型已經(jīng)被封裝在SQL函數(shù)中,性能優(yōu)劣完全依賴于函數(shù)本身,基本沒有留給用戶進行性能調(diào)整的空間。其次,函數(shù)只能在SQL中調(diào)用,而SQL依賴于數(shù)據(jù)庫系統(tǒng)。也就是說單獨的MADlib函數(shù)庫是毫無意義的,必須與PostgreSQL、Greenplum和HAWQ等數(shù)據(jù)庫系統(tǒng)結(jié)合使用。最后,既然MADlib是SQL中的機器學習庫,就注定它不關心數(shù)據(jù)可視化,本身不帶數(shù)據(jù)的圖形化表示功能。由此可見,MADlib作為工具,并不是傳統(tǒng)意義上的機器學習系統(tǒng)軟件,而只是一套可在SQL中調(diào)用的函數(shù)庫,其出發(fā)點是讓數(shù)據(jù)庫技術人員用SQL快速完成簡單的機器學習工作,比較適合做一些簡單的、特征相對明顯的機器學習。
即便如此,MADlib的易用性已經(jīng)足以引起我們的興趣。在了解了MADlib是什么及其優(yōu)缺點后,用戶就能根據(jù)自己的實際情況和需求有針對性地選擇和使用MADlib來實現(xiàn)特定業(yè)務目標。
1.1.2 MADlib的設計思想
驅(qū)動MADlib架構(gòu)的關鍵設計思想體現(xiàn)在以下方面:
?操作數(shù)據(jù)庫內(nèi)的本地數(shù)據(jù),避免在多個運行時環(huán)境之間不必要地移動數(shù)據(jù)。
?充分利用數(shù)據(jù)庫引擎功能,但將機器學習邏輯從數(shù)據(jù)庫特定的實現(xiàn)細節(jié)中分離出來。
?利用MPP無共享技術提供的并行性和可擴展性,如Greenplum或HAWQ數(shù)據(jù)庫系統(tǒng)。
?開放實施,保持與Apache社區(qū)的積極聯(lián)系和持續(xù)的學術研究。
操作本地數(shù)據(jù)的思想與Hadoop是一致的。為了使全局的帶寬消耗和I/O延遲降到盡可能小,在選擇數(shù)據(jù)時,MADlib總是選擇距離讀請求最近的存儲節(jié)點。如果在讀請求所在節(jié)點的同一個主機上有需要的數(shù)據(jù)副本,那么MADlib會盡量選擇它來滿足讀請求。如果數(shù)據(jù)庫集群跨越多個數(shù)據(jù)中心,那么存儲在本地數(shù)據(jù)中心的副本會優(yōu)先于遠程副本被選擇。
MADlib庫表現(xiàn)為數(shù)據(jù)庫內(nèi)置的函數(shù)。當函數(shù)在SQL語句中執(zhí)行時,可以充分利用數(shù)據(jù)庫引擎提供的功能。例如,在HAWQ中執(zhí)行MADlib函數(shù)時,每個物理Segment在執(zhí)行查詢的時候會啟動多個查詢執(zhí)行器(Query Executor, QE),使得單一物理Segment看起來就像多個虛擬Segment,從而使HAWQ能夠更好地利用所有可用資源。虛擬Segment是內(nèi)存、CPU等資源的容器,每個虛擬Segment都含有為查詢啟動的一個QE。查詢就是在虛擬Segment中被QE所執(zhí)行的。
MADlib利用Greenplum或HAWQ數(shù)據(jù)庫系統(tǒng)使用的MPP(Massively Parallel Processing,大規(guī)模并行處理)架構(gòu),使用戶能夠獲益于經(jīng)過錘煉的基于MPP的分析功能及其查詢性能,兼顧了低延時與高擴展。
MADlib現(xiàn)已成為Apache頂級項目,其整個項目和代碼是在Apache上開源的,開發(fā)是在Pivotal的支持下基于Apache社區(qū)的,與社區(qū)有很好的互動。
1.1.3 MADlib的工作原理
現(xiàn)以HAWQ上的MADlib為例解釋它的工作原理。圖1-1是HAWQ的架構(gòu)。當一個客戶端查詢向HAWQ發(fā)出請求時,Master節(jié)點會對查詢進行處理,根據(jù)查詢成本、資源隊列定義、數(shù)據(jù)局部化和當前系統(tǒng)中的資源使用情況,為查詢規(guī)劃資源分配。之后查詢被分發(fā)到Segment節(jié)點所在的物理主機并行處理,可能是節(jié)點子集或整個集群。每個Segment節(jié)點上的資源實施器監(jiān)控著查詢對資源的實時使用情況,避免異常資源占用。查詢處理完成后,最后的結(jié)果再通過Master返回客戶端。

圖1-1 HAWQ架構(gòu)
MADlib就是構(gòu)建在HAWQ架構(gòu)之上的,通過定義HAWQ上的UDA和UDF建立In-Database Functions。當我們使用SQL調(diào)用MADlib時,MADlib會首先進行輸入的有效性判斷和數(shù)據(jù)的預處理,將處理后的查詢傳給HAWQ,之后所有的計算即等同于普通的查詢處理請求在HAWQ內(nèi)執(zhí)行。圖1-2顯示了MADlib在HAWQ上的工作原理。

圖1-2 MADlib在HAWQ上的工作原理
1.1.4 MADlib的執(zhí)行流程
圖1-3中是整個MADlib函數(shù)調(diào)用過程的執(zhí)行流程。在客戶端,我們可以使用Jupyter、Zeppelin、psql等工具連接數(shù)據(jù)庫并調(diào)用MADlib Function。MADlib預處理后根據(jù)具體算法生成多個查詢傳入數(shù)據(jù)庫服務器,之后數(shù)據(jù)庫服務器執(zhí)行查詢并返回String(一般是一個或多個存放結(jié)果的表)。

圖1-3 MADlib執(zhí)行流程
1.1.5 MADlib架構(gòu)
MADlib架構(gòu)如圖1-4所示。

圖1-4 MADlib架構(gòu)
處于架構(gòu)最上面一層的是用戶接口。如前所述,用戶只需通過在SQL查詢語句中調(diào)用MADlib提供的函數(shù)來完成機器學習工作。當然這里的SQL語法要與特定數(shù)據(jù)庫管理系統(tǒng)相匹配。最底層則是Greenplum、PostgreSQL、HAWQ等數(shù)據(jù)庫管理系統(tǒng),最終由它們處理查詢請求。中間四層是構(gòu)成MADlib的組件。從圖1-4中可以看到,MADlib系統(tǒng)架構(gòu)自上而下由四個主要組件構(gòu)成:
(1)Python調(diào)用SQL模板實現(xiàn)的驅(qū)動函數(shù)
驅(qū)動函數(shù)是用戶輸入的主入口點,調(diào)用優(yōu)化器執(zhí)行迭代算法的外層循環(huán)。
(2)Python實現(xiàn)的高級抽象層
高級抽象層負責算法的流程控制。與驅(qū)動函數(shù)一起實現(xiàn)輸入?yún)?shù)驗證、SQL語句執(zhí)行、結(jié)果評估,并可能在循環(huán)中自動執(zhí)行更多的SQL語句直至達到某些收斂標準。
(3)C++實現(xiàn)的核心函數(shù)
這部分函數(shù)是由C++編寫的核心函數(shù),在內(nèi)層循環(huán)中實現(xiàn)特定機器學習算法。出于性能考慮,這些函數(shù)使用C++而不是Python編寫。
(4)C++實現(xiàn)的低級數(shù)據(jù)庫抽象層
這些函數(shù)提供一個編程接口,對所有的PostgreSQL數(shù)據(jù)庫內(nèi)核實現(xiàn)細節(jié)進行抽象。它們提供了一種機制,使得MADlib能夠支持不同的后端平臺,從而使用戶將關注點集中在內(nèi)部功能而不是平臺集成上。