1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        手把手帶你玩轉(zhuǎn)Apache MADlib

        共 7748字,需瀏覽 16分鐘

         ·

        2022-06-27 21:21

        大數(shù)據(jù)文摘授權(quán)轉(zhuǎn)載自數(shù)據(jù)派THU

        作者:陳之炎


        隨著數(shù)據(jù)規(guī)模的不斷擴(kuò)大,目前,許多現(xiàn)有的分析解決方案都無(wú)法勝任大規(guī)模數(shù)據(jù)量的計(jì)算任務(wù)。利用MADlib項(xiàng)目來(lái)創(chuàng)建一個(gè)框架,以滿足大規(guī)模數(shù)據(jù)量的需求,該框架旨在利用現(xiàn)代計(jì)算能力,提供適應(yīng)業(yè)務(wù)需求的強(qiáng)大解決方案。


        概述


        MADlib實(shí)現(xiàn)方案來(lái)自商業(yè)實(shí)踐、學(xué)術(shù)研究和開(kāi)源開(kāi)發(fā)社區(qū)的多方面努力,它是一個(gè)基于SQL的數(shù)據(jù)庫(kù)內(nèi)置的可擴(kuò)展的開(kāi)源機(jī)器學(xué)習(xí)庫(kù),由Pivotal與UCBerkeley合作開(kāi)發(fā)。MADlib創(chuàng)始于2011年,當(dāng)時(shí)屬于EMC/Greenplum,后來(lái)Greenplum變成了pivotal的Greenplum。主要由伯克利的學(xué)者:Joe Hellerstein發(fā)起,Stanford, University of Wisconsin-MADISON和University of Florida也有參與。MAD一詞來(lái)源于:MagneticAgile、Deep三個(gè)詞的首字母,意為有吸引力的、快速的、精準(zhǔn)深入的,三個(gè)單詞連在一起,意思是“極好的”,旨在為數(shù)據(jù)科學(xué)家們提供一個(gè)極好的機(jī)器學(xué)習(xí)和數(shù)據(jù)分析平臺(tái)。


        MADlib提供了豐富的分析模型,包括回歸分析,決策樹(shù),隨機(jī)森林,貝葉斯分類(lèi),向量機(jī),風(fēng)險(xiǎn)模型,KMEAN聚集,文本挖掘,數(shù)據(jù)校驗(yàn)等。MADlib支持Greenplum,PostgreSQL 以及 Apache HAWQ, In-Database Analytics的特性使其大大擴(kuò)展了數(shù)據(jù)庫(kù)的分析功能,充分利用MPP架構(gòu)使其能夠快速處理海量數(shù)據(jù)集。


        本文將為大家介紹MADlib的基本架構(gòu),工作原理及特性,并為開(kāi)發(fā)人員提供快速入門(mén)指南。


        ADlib創(chuàng)始于2011年,2015年7月MADlib成為Apache軟件基金會(huì)的孵化器項(xiàng)目,經(jīng)過(guò)兩年的發(fā)展,于2017年8月成為Apache頂級(jí)項(xiàng)目。整個(gè)項(xiàng)目和代碼是在Apache上是開(kāi)源的,已經(jīng)正式發(fā)布了MADlib 1.14、MADlib 1.15、MADlib 1.15.1、MADlib 1.16 等多個(gè)正式版本。

         


        Apache MADlib 架構(gòu)


        MADlib有以下三個(gè)主要組件:


        • Python 驅(qū)動(dòng)函數(shù)
        • C++ 實(shí)現(xiàn)函數(shù)
        • C++ 數(shù)據(jù)庫(kù)抽象層



        • Python 驅(qū)動(dòng)函數(shù)


        Python 驅(qū)動(dòng)函數(shù)位于如下子目錄中:


        https://github.com/apache/incubator-madlib/tree/master/src/ports/postgres/modules


        這些功能是用戶輸入的主要入口點(diǎn),主要負(fù)責(zé)算法的流程控制。一般來(lái)說(shuō),實(shí)現(xiàn)包括驗(yàn)證輸入?yún)?shù)、執(zhí)行SQL語(yǔ)句、評(píng)估結(jié)果和潛在的循環(huán)來(lái)執(zhí)行更多的SQL語(yǔ)句,直到達(dá)到收斂標(biāo)準(zhǔn)為止。


        • C++實(shí)現(xiàn)函數(shù) 


        大多數(shù)位于如下子目錄中:

        https://github.com/apache/incubator-madlib/tree/master/src/modules


        這些函數(shù)是特定算法所需核心函數(shù)和集合的C++定義。由于性能原因,這些都是在C++而不是Python中實(shí)現(xiàn)的。


        • C++ 數(shù)據(jù)庫(kù)抽象層


        大多數(shù)位于如下子目錄中:

        https://github.com/apache/incubator-madlib/tree/master/src/dbal

        和:

        https://github.com/apache/incubator-madlib/tree/master/src/ports/postgres/dbconnector

         

        這些函數(shù)試圖提供一個(gè)編程接口,將所有Postgres內(nèi)部細(xì)節(jié)抽象掉,并提供一種機(jī)制,使MADlib能夠支持不同的后端平臺(tái),并專(zhuān)注于內(nèi)部功能而不是平臺(tái)集成邏輯。


        MADlib架構(gòu)的主要理念:


        • 在本地?cái)?shù)據(jù)庫(kù)中操作數(shù)據(jù)。無(wú)需在多個(gè)運(yùn)行時(shí)環(huán)境之間進(jìn)行不必要的數(shù)據(jù)移動(dòng)。
        • 利用最好的breed數(shù)據(jù)庫(kù)引擎,將機(jī)器學(xué)習(xí)邏輯與數(shù)據(jù)庫(kù)特定的實(shí)現(xiàn)細(xì)節(jié)相剝離
        • 利用MPP共享技術(shù),如Greenplum數(shù)據(jù)庫(kù),提供并行性和可伸縮性。
        • 開(kāi)放的實(shí)施維護(hù)措施,與Apache社區(qū)和正在進(jìn)行中的學(xué)術(shù)研究保持密切的聯(lián)系。


        開(kāi)發(fā)人員快速入門(mén)指南       


        準(zhǔn)備工作


        可以按照MADlib安裝指南中的步驟安裝MADlib,也可以使用下面的Docker映像指令來(lái)安裝。


        MADlib源代碼的組織方式如下:機(jī)器學(xué)習(xí)或統(tǒng)計(jì)模塊的核心邏輯位于一個(gè)公共位置,數(shù)據(jù)庫(kù)端口特定的代碼位于 ports文件夾中。由于當(dāng)前支持的所有數(shù)據(jù)庫(kù)都是基于Postgres的, 所以Postgres端口包含所有特殊端口的文件,并從中繼承 greenplum和 hawq文件。在繼續(xù)使用本指南之前,建議熟悉一下 MADlib module anatomy 這個(gè)文檔。


        Docker映像


        Docker映像提供了在PostgreSQL 9.6上編譯和測(cè)試MADlib所必需的依賴性,可以在 /tool/docker/base/docker file_postgres_9_6中查看到依賴項(xiàng)docker文件,映像位于docker hub上的 madlib/postgres U 9.6:latest,稍后將為Greenplum數(shù)據(jù)庫(kù)提供一個(gè)類(lèi)似的Docker映像。


        使用Docker文件的一些常用命令:


        ##1)從docker hub下拉“madlib/postgres”U 9.6:latestyin映像:docker Pull madlib/postgres”U 9.6:latest

        ##2)啟動(dòng)與MADlib映像對(duì)應(yīng)的容器,將源代碼文件夾裝入容器:docker run-d-it--name MADlib-v(incubator-madlib目錄的路徑):/incubator MADlib/MADlib/postgres U 9.6其中incubator-madlib是MADlib源代碼所在的目錄。

        ##############################################*警告*###################################################請(qǐng)注意,如上圖所示安裝時(shí),在“incubator-madlib” Docker容器中的文件夾中所做的任何變動(dòng)#將反映在本地磁盤(pán)上(反之亦然)。這意味著從Docker容器中刪除已裝入卷中的數(shù)據(jù)也會(huì)導(dǎo)致本地磁盤(pán)中數(shù)據(jù)丟失。###############################################################################################################3)容器啟動(dòng)后,連接到它,并構(gòu)建MADlib:docker exec-it MADlib bashmkdir/incubator madlib/build docker cd/incubator madlib/build docker cmake..make doc make install

        ##4)安裝MADlib:src/bin/madpack-p postgres-c postgres/postgres@localhost:5432/postgres install

        ##5)運(yùn)行其他幾個(gè)madpack命令:#對(duì)所有模塊進(jìn)行運(yùn)行安裝檢查:src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres install-check

        #在特定模塊(比如說(shuō)svm)上運(yùn)行install check:src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres install-check -t svm #在所有模塊上運(yùn)行dev check(比install check更全面):src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres dev-check#在特定模塊上(比如說(shuō)svm)運(yùn)行dev check:src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres dev-check -t svm #重新安裝MADlib:src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres reinstall##6)殺死并移除容器(退出容器后):docker Kill madlibdocker rm madlib



        添加新模塊


        添加一個(gè)名為 “hello_world” 新模塊。在這個(gè)模塊中,實(shí)現(xiàn)了一個(gè)名為 avg_var的用戶自定義的SQL聚合(UDA),它計(jì)算表的給定數(shù)值列的平均值和方差。在此,將實(shí)現(xiàn)一個(gè)分布式版本的Welford's online algorithm(Welford在線算法)來(lái)計(jì)算均值和方差。


        與PostgreSQL中的普通UDA不同, avg_ar也可以在分布式數(shù)據(jù)庫(kù)上運(yùn)作,并利用底層分布式網(wǎng)絡(luò)進(jìn)行并行計(jì)算。使用avg_var也十分簡(jiǎn)單,用戶僅需運(yùn)行如下psql命令:



        之后,將在屏幕上打印三個(gè)數(shù)值:均值、方差和名為bath的表格中的行數(shù)。


        通過(guò)以下幾步實(shí)現(xiàn):


        • 注冊(cè)模塊。
        • 定義SQL函數(shù)。
        • 在C++中實(shí)現(xiàn)函數(shù)。
        • 注冊(cè)C++頭文件。


        此練習(xí)的文件的源代碼可以在hello world文件夾 中找到。


        1.注冊(cè)模塊


        在 /src/config/目錄下的名為 Modules.yml的文件中添加以下行



        并創(chuàng)建兩個(gè)文件夾:/src/ports/postgres/modules/hello-world和 /src/modules/hello-world。這兩個(gè)文件夾的名稱應(yīng)和Modules.yml 中定義的模塊名稱相匹配。


        2.定義SQL函數(shù)


        在./src/ports/postgres/modules/hello_world文件夾下創(chuàng)建avg_var.sql_in文件,在這個(gè)文件中,定義了用于計(jì)算均值和方差的聚合函數(shù)和其他輔助函數(shù)。這些函數(shù)將在單獨(dú)的C++文件中實(shí)現(xiàn),將在下一節(jié)中對(duì)其進(jìn)行描述。


        在avg_var.sql_in文件的初始部分,必需利用命令行 m4_include('SQLCommon.m4') 運(yùn)行m4 宏處理器(m4 macro processor)。利用M4在SQL定義中添加平臺(tái)專(zhuān)屬的命令,并在將MADlib部署到數(shù)據(jù)庫(kù)時(shí)運(yùn)行。


        利用內(nèi)置的PostgreSQL 命令CREATE AGGREGATE 定義聚合函數(shù)avg_var。



        同時(shí)定義傳遞給CREATE AGGREGATE的參數(shù):


        • SFUNC


        為每個(gè)輸入行調(diào)用的狀態(tài)轉(zhuǎn)換函數(shù)命名。在這個(gè)例子中,狀態(tài)轉(zhuǎn)換函數(shù)avg_var_transition,與avg_var.sql_in在同一個(gè)文件定義,之后在C++中得以實(shí)現(xiàn)。


        • FINALFUNC


        在遍歷所有輸入行之后,調(diào)用最終函數(shù)的名稱來(lái)計(jì)算聚合結(jié)果。例如:最終函數(shù), avg_v ar_final, 與avg_var.sql_in在同一個(gè)文件定義,之后在C++中得以實(shí)現(xiàn)。


        • PREFUNC


        在遍歷每個(gè)數(shù)據(jù)段或分區(qū)之后,調(diào)用合并函數(shù)以合并聚合狀態(tài)值的名稱。Greenplum和HAWQ上的分布式數(shù)據(jù)集需要合并函數(shù)。對(duì)于PostgreSQL而言,數(shù)據(jù)不是分布式的,合并函數(shù)并非必需。為了完整起見(jiàn),我們?cè)诒局改现袑?shí)現(xiàn)了一個(gè)名為 avg_var_merge_states的合并函數(shù)。


        • INITCOND


        狀態(tài)值的初始條件。在本例中,利用一個(gè)全零雙數(shù)組,分別對(duì)應(yīng)于平均值、方差和行數(shù)。


        最終函數(shù)的遍歷和合并,在與avg_var.sql_in同一個(gè)文件中作為聚合函數(shù)定義。有關(guān)這些函數(shù)的更多詳細(xì)信息可以在 PostgreSQL文檔中找到。


        在C++中實(shí)現(xiàn)函數(shù)


        在文件夾 /src/modules/hello\u world下創(chuàng)建頭文件和源文件 avg_ar.hpp和 avg_ar.cpp。在頭文件中利用宏DECLARE_UDF(MODULE, NAME)申明最終函數(shù)的遍歷和合并。例如,轉(zhuǎn)換函數(shù) avg_var_transi tion聲明為 DECLARE_UDF(hello_world,avg_var_transition)。在./src/ports/postgres/dbconnector 文件夾下的dbconnector.hpp 文件里定義DECLARE_UDF宏。


        在hood下,三個(gè)UDF均申明為 dbconnector::postgres::UDF的子類(lèi)。這些UDF的行為完全由其成員函數(shù)決定。


        換句話說(shuō),只需要在 avg_ar.cpp文件中實(shí)現(xiàn)以下方法:



        這里, AnyType類(lèi)既用于從DBMS傳遞數(shù)據(jù)到C++函數(shù),又將返回C++的值。


        有關(guān)更多詳細(xì)信息,, 請(qǐng)參閱頭文件 TypeTraits _impl.hpp。


        轉(zhuǎn)移函數(shù):



        avg_var_transition, 有兩個(gè)參數(shù),在 avg_var.sql_in中進(jìn)行定義。第一個(gè)是SQL double類(lèi)型的數(shù)組,對(duì)應(yīng)于當(dāng)前遍歷的平均值、方差和行數(shù),第二個(gè)是表示當(dāng)前元組值的double類(lèi)型。


        稍后將描述 class AvgVarTransitionState?;旧?,它采用了args[0],SQL雙精度數(shù)組,將數(shù)據(jù)傳遞給適當(dāng)?shù)腃++類(lèi)型,并將它們存儲(chǔ)在state實(shí)例中。


        通過(guò)在AvgVarTransitionState類(lèi)中加載+= 操作符來(lái)在線計(jì)算均值和方差。


        合并函數(shù)



        此外: AnyType& args中包含的參數(shù),在avg_var.sql_in 中進(jìn)行定義。


        詳細(xì)信息隱含于AvgVarTransitionState 的方法中。 


        最終函數(shù)



        AvgVarTransitionState類(lèi)加載AnyType() 運(yùn)算符后可以直接返回狀態(tài),AvgVarTransition State 的示例返回AnyType.


        橋接類(lèi)


        Below are the methods that overload the operator +=for the bridging class AvgVarTransitionState:


        通過(guò)下述方法為橋接類(lèi)AvgVarTransitionState: 加載運(yùn)算符+=



        給定兩個(gè)數(shù)據(jù)集的均值、方差和大小,利用Welford方法計(jì)算兩個(gè)數(shù)據(jù)集組合的均值和方差。


        注冊(cè)C++頭文件


        在 avg_var.sql_in中定義的SQL函數(shù)需要能夠從C++文件中找到實(shí)際的實(shí)現(xiàn)。這只需在 /src/modules/目錄下的declarations.hpp文件中添加以下行即可完成



        運(yùn)行新模塊


        利用新模塊運(yùn)行一個(gè)示例。首先,根據(jù) 安裝指南中的說(shuō)明重建并重新安裝MADLib,并使用MADlib快速入門(mén)指南中的 pati ents數(shù)據(jù)集進(jìn)行測(cè)試。從 psql終端來(lái)看,20名患者中有一半在1年內(nèi)發(fā)生過(guò)第二次心臟病發(fā)作(yes=1):



        示例:添加一個(gè)迭代UDF


        在這里,將演示一個(gè)稍微復(fù)雜一點(diǎn)的示例,該示例要求迭代調(diào)用UDA。這種情況經(jīng)常出現(xiàn)在許多機(jī)器學(xué)習(xí)模塊中,在這些模塊中,底層優(yōu)化算法向目標(biāo)函數(shù)的優(yōu)化方向迭代。在這個(gè)例子中,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的對(duì)數(shù)回歸解算器作為迭代UDF。特別是,用戶可以在 psql中鍵入以下命令來(lái)訓(xùn)練邏輯回歸分類(lèi)器:



        結(jié)果如下:



        這里的數(shù)據(jù)存儲(chǔ)在一個(gè)名為 patients的SQL表中。logistic回歸的目標(biāo)是second_attack列,特征是treatment列和trait_anxiety列。數(shù)組中的 1項(xiàng)表示模型中的附加偏移項(xiàng)。


        將解算器添加到上面創(chuàng)建的 hello_world模塊中。主要步驟如下:



        與上一小節(jié)中介紹的步驟相比,這里無(wú)須修改 Modules.yml文件,因?yàn)槲覀儧](méi)有創(chuàng)建新模塊。另外一點(diǎn)與上一小節(jié)的區(qū)別是除.sql_in 文件之外,還創(chuàng)建了一個(gè)附加的python文件.py_in.,在此文件中實(shí)現(xiàn)絕大多數(shù)對(duì)數(shù)迭代。


        此練習(xí)的文件可以在源代碼存儲(chǔ)庫(kù)的 hello world文件夾中找到。注意:該文件夾中不包括__init__.py_in文件。


        1.概述


        整個(gè)邏輯分為三個(gè)部分。在simple_logistic.sql_in 中定義了全部的UDF 和UDA。轉(zhuǎn)換、 合并和 最終函數(shù)在C++中實(shí)現(xiàn)。這些函數(shù)共同構(gòu)成了一個(gè)稱為 logreg_simple_step的UDA,它從當(dāng)前狀態(tài)下進(jìn)一步來(lái)逼近對(duì)數(shù)回歸的目標(biāo)。最后,在 simple_logistic.py_in中,采用 plpy包在python中實(shí)現(xiàn)一個(gè)名為 logregr_simple_train的UDF,它迭代調(diào)用     logregr_simple_step直到收斂。


        注意:在simple_logistic.sql_in 文件中,定義了如下名為logregr_simple_train的SQL 函數(shù):



        其中, python function(hello_world,simple_logistic,logreg_simple_train)的實(shí)際實(shí)現(xiàn)由hello_world模塊中的simple_logistic文件的python函數(shù) logreg_simple_train提供,如下所示:



        2.plplply中的迭代過(guò)程


        迭代邏輯使用 PL/Python過(guò)程語(yǔ)言實(shí)現(xiàn)。在simple_logistic.py_in文件的開(kāi)始部分,導(dǎo)入一個(gè)名為 plpy的Python  模塊,利用它來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的命令。使用 plpy實(shí)現(xiàn)迭代邏輯很簡(jiǎn)單,如下所示:



        logregr_simple_step是在 simple_logistic.sql_in文件中定義的UDA,利用/src/modules/hello_world. 目錄下的C++文件實(shí)現(xiàn)實(shí)現(xiàn)轉(zhuǎn)換合并等功能。


        __logregr_simple_step  有三個(gè)參數(shù),分別為:目標(biāo),特征和先前狀態(tài)。


        .狀態(tài)初始化為 None,在SQL中通過(guò) plpy解釋為 null值。


        更為復(fù)雜的對(duì)數(shù)回歸迭代方案還將包括最優(yōu)性驗(yàn)證和收斂保證過(guò)程,為了簡(jiǎn)單起見(jiàn),這里特意忽略這些過(guò)程。


        有關(guān)對(duì)數(shù)回歸的生產(chǎn)級(jí)實(shí)現(xiàn),請(qǐng)參閱regress模塊。


        3.運(yùn)行新的迭代模塊


        下面的示例演示了在前面使用的名為patients表上使用 madlib.logreg_simple_train的方法。經(jīng)過(guò)訓(xùn)練的分類(lèi)模型存儲(chǔ)在名為 logreg_mdl的表中,可以使用標(biāo)準(zhǔn)SQL查詢查看。



        結(jié)語(yǔ)


        在本文中,介紹了的基本架構(gòu),工作原理及特性,并為開(kāi)發(fā)人員快速入門(mén)提供了指南,文中詳細(xì)描述了添加一個(gè)迭代UDF 的詳細(xì)步驟,希望對(duì)大家入門(mén)有所幫助。


        點(diǎn)「在看」的人都變好看了哦!
        瀏覽 53
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产激情的老师在线播放 | 国产原创麻豆 | 成人十八禁网站 | 操屄短片 | 夜夜骑夜夜操 | 成人性爱在线视频 | 欧美日韩精品 | 精品无码一区二区三区爱与 | 国产三区二区一区 | 黄色一级国产 |