機器學習(ML)庫正變得愈來愈流行,如今有各類各樣的這類庫 - 維基百科中說起了49個[1]。 這些機器學習庫須要龐大的數據,一般此類數據是存儲在關係型數據庫中的業務數據,好比存放在EsgynDB或以其餘形式存儲在Hadoop數據湖中。html
備註:EsgynDB爲易鯨捷公司基於Trafodion提供的企業版。java
簡單的集成 - JDBC和HDFS算法
有多種方法鏈接機器學習庫和EsgynDB。 其中一種方法是使用JDBC,這是大多數軟件包支持的方法。 用戶在他們選擇的系統上運行機器學習代碼並經過JDBC讀取數據。 若是要傳輸大量數據,能夠經過多個並行鏈接讀取。 某些系統能夠經過將SQL查詢拆分爲多個實例來解決此問題。 例如,Spark jdbcRDD [2]容許查詢的參數化,再結合salted EsgynDB表能更高效的工做:sql
select * from sales s join customer c on s.cust_id = c.cust_id where s.」_SALT_」 between ? and ?.
Apache Spark將使用non-overlapping值範圍啓動此查詢的多個實例。數據庫
相反地從機器學習庫到EsgynDB的結果集數據,一般可將數據導出到HDFS的Hive表來完成,而後由EsgynDB讀取此Hive表。apache
在EsgynDB集羣上的並行機器學習實例api
在這篇博客中,咱們重點關注另外一種集成方法,即在EsgynDB集羣上並行運行機器學習庫程序,將EsgynDB中數據做爲輸入並同時在EsgynDB中處理結果。 對於不一樣的機器學習庫,該方法是通用的,它相似於MapReduce,機器學習程序被構形成多個相似於mapper或reducer的模塊。網絡
三大處理模塊app
爲了建立這樣的設置,咱們結合了三大處理模塊:機器學習
首先,機器學習程序將data frame做爲輸入併產生data frame做爲輸出。 該程序編寫相似MapReduce中的mapper或reducer,因此以上程序的多個實例能夠並行運行,而無需在實例之間交換狀態信息。 例如,程序能夠對邏輯上獨立的數據運行聚類算法。
Data frame[3] [4]是幾個ML包中涉及的概念,它大體至關於SQL中的一個表。 Data frame由指定數據類型的命名列組成。 由於每列具備相同數量的元素,它們能夠組成多個行。
第二個模塊是由Esgyn爲Apache Trafodion [5] [6]提供的用戶定義的表值函數(TMUDF),它把機器學習程序與EsgynDB集成到一塊兒。 以文本形式將所需數據提供給機器學習程序的標準輸入,並以文本形式接收該程序的輸出結果。 許多機器學習庫都內置支持以逗號分隔(或以其餘方式分隔)格式讀取和寫入data frame。
最後,咱們添加一個驅動查詢(driving query)來完整機器學習場景。 該驅動查詢產生機器學習程序所需的數據,調用用戶定義函數(UDF),並以用戶指望的方式處理UDF的結果。 當機器學習程序像reducer同樣工做時,驅動查詢還定義瞭如何進行數據分區。 若是機器學習庫不支持可橫向擴展集羣(例如R),這可讓您在更大的數據集上並行地運行算法。
例子:TensorFlow神經網絡
以Google TensorFlow [7]中識別手寫數字做爲神經網絡示例,咱們在一臺單獨的機器上訓練這個神經網絡,而後將它部署到EsgynDB,咱們用EsgynDB來並行讀取數字。 此示例的驅動SQL查詢以下:
集成的UDF稱之爲「filterprog」,它的調用用紅色標註。藍色部分爲輸入數據,向量化圖像。查詢返回圖像編號並讀取數字做爲結果。
TensorFlow程序從標準輸入讀取圖像編號和圖像數據,執行圖像識別,而後將讀取的數字和圖像編號打印到標準輸出,由EsgynDB讀取它們。 EsgynDB優化器根據須要可並行化查詢。
請注意該操做能夠集成更復雜的SQL查詢,好比在機器學習代碼以前和以後執行join,union,聚合等操做,而且 多個機器學習步驟能夠合併成單個的驅動查詢。
參考文獻:
[1] Wikipedia Machine Learning:
https://en.wikipedia.org/wiki...
[2] Spark JDBC RDD: https://spark.apache.org/docs...
[3] Data Frames in R:
http://www.r-tutor.com/r-intr...
[4] Data Frames in Spark:
https://spark.apache.org/docs...
[5] Trafodion Table-valued UDFs: https://cwiki.apache.org/conf...
[6] Integrating UDF (FilterProg): https://cwiki.apache.org/conf...
[7] Google TensorFlow MNIST example: https://www.tensorflow.org/ve...