<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          原創(chuàng) | 手把手帶你玩轉Apache MADlib

          共 8363字,需瀏覽 17分鐘

           ·

          2022-06-26 23:46

          作者:陳之炎

          本文約5500字,建議閱讀15分鐘

          本文對利用MADlib項目來創(chuàng)建一個框架,以滿足大規(guī)模數(shù)據(jù)量的需求。


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

          概述

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

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

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

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


          Apache MADlib 架構

          MADlib有以下三個主要組件:

          • Python 驅動函數(shù)
          • C++ 實現(xiàn)函數(shù)
          • C++ 數(shù)據(jù)庫抽象層


          • Python 驅動函數(shù)

          Python 驅動函數(shù)位于如下子目錄中:

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


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

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

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

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


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

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

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

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

          和:

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

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

          MADlib架構的主要理念:

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

          開發(fā)人員快速入門指南       

          準備工作

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

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

          Docker映像

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

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

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

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

          ##############################################*警告*###################################################請注意,如上圖所示安裝時,在“incubator-madlib” Docker容器中的文件夾中所做的任何變動#將反映在本地磁盤上(反之亦然)。這意味著從Docker容器中刪除已裝入卷中的數(shù)據(jù)也會導致本地磁盤中數(shù)據(jù)丟失。###############################################################################################################3)容器啟動后,連接到它,并構建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)運行其他幾個madpack命令:#對所有模塊進行運行安裝檢查:src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres install-check

          #在特定模塊(比如說svm)上運行install check:src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres install-check -t svm #在所有模塊上運行dev check(比install check更全面):src/bin/madpack -p postgres -c postgres/postgres@localhost:5432/postgres dev-check#在特定模塊上(比如說svm)運行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


          添加新模塊

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


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


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

          通過以下幾步實現(xiàn):

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

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

          1.注冊模塊

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


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

          2.定義SQL函數(shù)

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

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

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


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

          • SFUNC


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

          • FINALFUNC

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

          • PREFUNC

          在遍歷每個數(shù)據(jù)段或分區(qū)之后,調用合并函數(shù)以合并聚合狀態(tài)值的名稱。Greenplum和HAWQ上的分布式數(shù)據(jù)集需要合并函數(shù)。對于PostgreSQL而言,數(shù)據(jù)不是分布式的,合并函數(shù)并非必需。為了完整起見,我們在本指南中實現(xiàn)了一個名為 avg_var_merge_states的合并函數(shù)。

          • INITCOND

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

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

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

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

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


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



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

          有關更多詳細信息,, 請參閱頭文件 TypeTraits _impl.hpp。

          轉移函數(shù):


          avg_var_transition, 有兩個參數(shù),在 avg_var.sql_in中進行定義。第一個是SQL double類型的數(shù)組,對應于當前遍歷的平均值、方差和行數(shù),第二個是表示當前元組值的double類型。

          稍后將描述 class AvgVarTransitionState?;旧希捎昧薬rgs[0],SQL雙精度數(shù)組,將數(shù)據(jù)傳遞給適當?shù)腃++類型,并將它們存儲在state實例中。

          通過在AvgVarTransitionState類中加載+= 操作符來在線計算均值和方差。

          合并函數(shù)


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


          詳細信息隱含于AvgVarTransitionState 的方法中。 


          最終函數(shù)



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

          橋接類

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

          通過下述方法為橋接類AvgVarTransitionState: 加載運算符+=


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

          注冊C++頭文件


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



          運行新模塊

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



          示例:添加一個迭代UDF

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


          結果如下:


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

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



          與上一小節(jié)中介紹的步驟相比,這里無須修改 Modules.yml文件,因為我們沒有創(chuàng)建新模塊。另外一點與上一小節(jié)的區(qū)別是除.sql_in 文件之外,還創(chuàng)建了一個附加的python文件.py_in.,在此文件中實現(xiàn)絕大多數(shù)對數(shù)迭代。

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


          1.概述

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

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



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



          2.plplply中的迭代過程

          迭代邏輯使用 PL/Python過程語言實現(xiàn)。在simple_logistic.py_in文件的開始部分,導入一個名為 plpy的Python  模塊,利用它來實現(xiàn)數(shù)據(jù)庫的命令。使用 plpy實現(xiàn)迭代邏輯很簡單,如下所示:



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


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

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

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

          有關對數(shù)回歸的生產級實現(xiàn),請參閱regress模塊。

          3.運行新的迭代模塊

          下面的示例演示了在前面使用的名為patients表上使用 madlib.logreg_simple_train的方法。經過訓練的分類模型存儲在名為 logreg_mdl的表中,可以使用標準SQL查詢查看。



          結語

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


          作者簡介

          陳之炎,北京交通大學通信與控制工程專業(yè)畢業(yè),獲得工學碩士學位,歷任長城計算機軟件與系統(tǒng)公司工程師,大唐微電子公司工程師。目前從事智能化翻譯教學系統(tǒng)的運營和維護,在人工智能深度學習和自然語言處理(NLP)方面積累有一定的經驗。


          編輯:王菁

          校對:林亦霖


          數(shù)據(jù)派研究部介紹




          數(shù)據(jù)派研究部成立于2017年初,以興趣為核心劃分多個組別,各組既遵循研究部整體的知識分享實踐項目規(guī)劃,又各具特色:


          算法模型組:積極組隊參加kaggle等比賽,原創(chuàng)手把手教系列文章;

          調研分析組:通過專訪等方式調研大數(shù)據(jù)的應用,探索數(shù)據(jù)產品之美;

          系統(tǒng)平臺組:追蹤大數(shù)據(jù)&人工智能系統(tǒng)平臺技術前沿,對話專家;

          自然語言處理組:重于實踐,積極參加比賽及策劃各類文本分析項目;

          制造業(yè)大數(shù)據(jù)組:秉工業(yè)強國之夢,產學研政結合,挖掘數(shù)據(jù)價值;

          數(shù)據(jù)可視化組:將信息與藝術融合,探索數(shù)據(jù)之美,學用可視化講故事;

          網(wǎng)絡爬蟲組:爬取網(wǎng)絡信息,配合其他各組開發(fā)創(chuàng)意項目。


          點擊文末“閱讀原文”,報名數(shù)據(jù)派研究部志愿者,總有一組適合你~



          轉載須知


          如需轉載,請在開篇顯著位置注明作者和出處(轉自:數(shù)據(jù)派THUID:DatapiTHU),并在文章結尾放置數(shù)據(jù)派醒目二維碼。有原創(chuàng)標識文章,請發(fā)送【文章名稱-待授權公眾號名稱及ID】至聯(lián)系郵箱,申請白名單授權并按要求編輯。

          未經許可的轉載以及改編者,我們將依法追究其法律責任。





          點擊“閱讀原文”加入組織~




          瀏覽 38
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆视频观看免费 | 波多野吉无码 | 蘑菇视频logo红色 | 国一级黄片 | 天堂在线网 |