1、Apache PredictionIO介紹
Apache PredictionIO 是一個孵化中的機器學習服務器,它可以為為開發人員和數據科學家創建任何機器學習任務的預測引擎。官方原文:
Apache PredictionIO (incubating) is an open source Machine Learning Server built on top of a state-of-the-art open source stack for developers and data scientists to create predictive engines for any machine learning task.
PredictionIO以Spark為計算引擎,mysql or HBase+Elasticsearch or PostgreSql 為數據存儲,並提供了常用的模板引擎:
1、Recommenders推薦引擎。集成了Spark MLlib的協同過濾算法,可以作為電子商務、新聞、視頻方面的個性化推薦。2、Classification分類引擎。集成了Spark MLlib的朴素貝葉斯算法,提供文本內容分類、預測用戶在當前會話中轉化概率、(用戶)流失預測等服務。3、NPL引擎。主要做情緒分析。4、還提供回歸、聚類等其他引擎。
2、Apache PredictionIO 服務搭建
2.1 前提條件
這是非常重要的,滿足下列軟件要求,PredictionIO®的最低版本。
- Apache Hadoop 2.6.5(可選,僅在需要YARN和HDFS時才需要)
- 適用於Hadoop 2.6的Apache Spark 1.6.3
- Java SE開發工具包8
以及下列其中一組:
- PostgreSQL 9.1
要么
- MySQL 5.1
要么
- Apache HBase 0.98.5
- Elasticsearch 1.7.6
如果您在一台計算機上運行,我們建議至少2GB內存。
2.2 PredictionIO的安裝
PredictionIO提供了兩種方式的安裝:
- 在本機搭建環境,安裝PredictionIO的依賴包,進而安裝使用PredictionIO,這種方法繁瑣。
- 使用Docker安裝PredictionIO,依賴包和配置全部打包好,這種方法易上手。
3、Apache PredictionIO 在Docker上搭建
這里先選擇在Docker上搭建作為上手,快速熟悉這個軟件。下圖是Docker的版本

3.1 Docker的安裝
配置開發環境是目前我們開發團隊在進行開發工作之前的重要工作,對於需要使用我們自己封裝的開發框架的java web程序員來說更是如此,一般來說需要配置jdk、mysql、tomcat、maven等一系列基礎環境,如果需要使用我們現有的開發框架,還需要配置開發工程的模板、基礎服務的訪問地址、統一的環境參數等等。這些工作做起來比較繁瑣,即使按照開發文檔一步一步進行也容易出現差錯,而且較為耗費時間。
Docker容器技術的出現使得這一工作得以改進,通過一段時間的研究,我們的底層框架開發人員將以上環境全部使用Docker容器技術制作成為完整的鏡像,使得業務開發人員不必再關心這些瑣碎工作,只需通過git下載我們的工程模板,通過執行Docker命令自動在本地完成開發環境的構建。
然而由於docker是一個較新的技術,仍有很多開發人員沒有接觸過,上這次專門針對windows下的開發者如何配置docker環境做一次講解。
首先,我們需要安裝Docker作為容器來運行PredictionIO,Docker的安裝也是較為麻煩,你需要確定你是在什么環境下安裝docker,由於本人旨在windows下實踐過,所以這篇文章主要講述在windows下的安裝,如果有人在Linux和MacOS環境下實踐過,請補充在此小節。
3.1.1 CentOS Docker
3.1.2 MacOS Docker
3.1.3 Ubuntu Docker
3.1.4 windows10 64 pro 下安裝Docker
如果是在Linux系統下干活,則比較簡單,因為Linux已經實現對Docker技術的內核級支持,CentOS的軟件倉庫自帶了Docker最新版,可以直接通過命令安裝使用。
對於Windows來說,稍有些困難,但是目前也不是問題了。首先需要看一下你的Windows環境,分兩種情況,一種是Windows 10 64位專業版,一種是其他版本(比如很多人仍然推崇的Win 7)。前者可以直接支持安裝Docker原生版,性能最好,體驗最佳,后者只能使用Docker官方提供的一種過度技術(Docker ToolBox),這種技術不得不依賴Oracle的Virtualbox以在你的系統里創建一個虛擬機用以模擬Linux運行環境,好在封裝的比較好,基本可以忽略這個虛擬機的存在,只需專心使用Docker即可。
(1)windows10 64 pro 下安裝Docker 比較簡單,需要確定基礎環境:
- Docker Toolbox和Docker Machine用戶的README FIRST:Docker for Windows需要運行Microsoft Hyper-V。Docker for Windows安裝程序會根據需要為您啟用Hyper-V,然后重新啟動計算機。啟用Hyper-V后,VirtualBox不再起作用,但仍保留任何VirtualBox VM映像。使用
docker-machine(包括default通常在Toolbox安裝期間創建的VM)創建的VirtualBox VM 不再啟動。這些VM不能與Docker for Windows並排使用。但是,您仍可以使用它docker-machine來管理遠程VM。 - 必須在BIOS和支持CPU SLAT的情況下啟用虛擬化。通常,默認情況下啟用虛擬化。這與啟用Hyper-V不同。有關詳細信息,請參閱故障排除中必須啟用虛擬化。
- 當前版本的Docker for Windows在64位Windows 10 Pro,Enterprise和Education(1607周年更新,Build 14393或更高版本)上運行。
- 使用Docker for Windows創建的容器和映像在安裝它的計算機上的所有用戶帳戶之間共享。這是因為所有Windows帳戶都使用相同的VM來構建和運行容器。
- 嵌套的虛擬化方案(例如在VMWare或Parallels實例上運行Docker for Windows)可能會起作用,但無法保證。有關更多信息,請參閱 嵌套虛擬化方案中的運行Docker for Windows
- Docker for Windows安裝包括:安裝提供Docker Engine,Docker CLI客戶端,Docker Compose,Docker Machine和Kitematic。
(2)安裝Docker for Windows桌面應用程序
- Docker for Windows是 Docker for Microsoft Windows 的 Community Edition(CE)。要下載Docker for Windows,請前往Docker Store。
- 雙擊Docker for Windows Installer.exe以運行安裝程序。
如果您尚未下載安裝程序(Docker for Windows Installer.exe),則可以從download.docker.com獲取 。它通常會下載到您的Downloads folder,或者您可以從Web瀏覽器底部的最新下載欄運行它。
- 按照安裝向導接受許可,授權安裝程序,然后繼續安裝。
Docker.app系統會要求您在安裝過程中使用系統密碼進行授權。需要特權訪問才能安裝網絡組件,指向Docker應用程序的鏈接以及管理Hyper-V VM。
- 在安裝完成對話框中單擊完成以啟動Docker。
(3)啟動Docker for Windows
安裝后Docker不會自動啟動。要啟動它,請搜索Docker,在搜索結果中選擇Docker for Windows,然后單擊它(或按Enter鍵)。

當狀態欄中的鯨魚保持穩定時,Docker正在運行,並且可以從任何終端窗口訪問。

如果鯨魚隱藏在通知區域中,請單擊任務欄上的向上箭頭以顯示它。有關詳細信息,請參閱Docker設置。
如果您剛剛安裝了該應用程序,您還會收到一條彈出式成功消息,其中包含建議的后續步驟以及此文檔的鏈接。

初始化完成后,從通知區域圖標中選擇關於Docker以驗證您是否具有最新版本。
恭喜!您已啟動並運行Docker for Windows。
3.1.5 windows10 64 home 下安裝Docker
(1)安裝前准備
這個稍微麻煩,也需要確定兩個基礎環境:
- 你的CPU支持虛擬化
- 你的操作系統需要關閉(注意是關閉!)Hyper-V
然后到官方網站下載安裝包,如果網站被牆,可以訪問這個地址,也可以到我上傳的網盤里下載,鏈接在此https://yunpan.cn/cMSaWneaYPE5K 訪問密碼 c8fa
原生的Docker配置比較簡單,官方還提供了可視化的配置界面,操作步驟如下:
- 右鍵點擊系統托盤的Dcoker圖標,選擇Settings
- 進入Docker Daemon選項,在右側窗口填入鏡像倉庫的地址(可以自行去阿里雲申請,我這里有一個示例)
-
示例如圖

- 配置完成后,在命令行窗口執行一個拉取鏡像的命令(
docker pull tomcat)試試看,會發現速度杠杠的。
(4)DockerToolbox鏡像倉庫的配置
這個略微麻煩一些,不過還可以接受,需要在命令行進行操作:
- 先執行這個命令(鏡像地址可以自行替換)
docker-machine ssh default "echo 'EXTRA_ARGS=\"--registry-mirror=https://xks740zc.mirror.aliyuncs.com\"' | sudo tee -a /var/lib/boot2docker/profile"
- 再執行這個命令
docker-machine restart default會重啟Docker虛擬機 - 然后執行命令
docker-machine ssh default即可進入docker命令行環境了
- 在容器中暴露的應用端口,需要注意,他的訪問地址不是你的主機localhost,而是一個虛擬機的ip地址,一般為192.168.99.100,如果你在容器中跑起來一個web程序並且暴露了8080端口,那么想在外面訪問的話,地址為http://192.168.99.100:8080 ,如果是win10下的原生docker就會沒有這個迷惑,直接localhost了。
-
共享宿主機的文件給容器,需要注意,我們在使用容器時,一般會通過掛載卷的形式將系統的文件共享給容器使用,對於DockerToolbox來說,它默認給你設置了系統盤的User文件夾具有可以掛載共享文件的能力,也就是說,你需要使用掛載卷的時候,必須確保文件在這個根目錄之下(比如放在C:/Users/xxx/Dcouments/xxxx)。具體的解決參照:Docker Toolbox在window 10 home 下掛載宿主機目錄到容器的正確操作 - 知-青 - 博客園
如果是window10系統的原生docker技術則可通過圖形設置界面完成,如圖

3.2 使用Docker安裝Apache PredictionIO
Docker(已經安裝好了,下面正式開始搭建Apache PredictionIO(0.12.0),注意版本號哦,可以及時更新。
(1)拉取及安裝PredictionIO鏡像,以及安裝所有依賴包
# 對於PredictionIO 0.12.0 # 1、Windows10 64 pro $ docker run -it -p 8000:8000 steveny/predictionio:0.12.0 /bin/bash # 2、Windows10 64 home # 不映射文件夾 $ docker run -it -p 8000:8000 steveny/predictionio:0.12.0 /bin/bash # 映射文件夾 docker run -it -v /c/Users/T480S/work/Engine:/Engine -p 8000:8000 steveny/predictionio:0.12.0 /bin/bash
# 參考:https://www.cnblogs.com/Yuanjing-Liu/p/9447314.html
(2)Docker命令熟悉
$ docker images————展示當前鏡像
$ docker ps————查找當前容器
$ docker ps -a ——展現所有容器
$ docker start 5f62————開始一個容器/鏡像
$ docker rm aaad ————刪除容器
$ docker attach 5f62 ————鏈接鏡像
$ docker rmi hello-world ————刪除鏡像(報錯,先刪除容器
$ docker rmi -f hello-world ————強制刪除鏡像,鏡像+容器一起刪除
(3)首先查看當前的鏡像,經過第一步之后,已經安裝了一個PredictionIO鏡像,可以通過如下命令查看:

(4)再查看容器,經過第一步,同時新建了一個容器

由於沒有開始容器,運行$docker ps$沒有任何返回;運行$docker ps -a$查看所有的容器,就可以看見剛剛新建的容器,ID為514b,還可以看見端口等其他信息
(5)開始運行容器

再Docker ps

發現容器已經開始運行
(6)進入容器里面

已經進入predictionIO容器里面
3.3 實例 —— 使用PredictionIO搭建分類引擎
此實例的官方文檔:快速入門 - 分類引擎模板
這一小節包含了整個流程,PredictionIO的分類引擎模板默認集成了Apache Spark MLlib的朴素貝葉斯算法。分類引擎模板的默認用例是預測用戶將根據其3個屬性訂閱的服務計划:attr0,attr1和attr2。這里將向您展示如何基於此模板創建自己的分類引擎以供生產使用。
(1)安裝並運行PredictionIO
首先,您需要安裝PredictionIO 0.12.1(如果您還沒有安裝)。我們經過上一小節,都已經安裝了。
假設您已安裝PredictionIO /home/yourname/PredictionIO/。為方便起見,將PredictionIO的二進制命令路徑添加到您的PATH,即/home/yourname/PredictionIO/bin:
$ PATH=$PATH:/home/yourname/PredictionIO/bin; export PATH
啟動所有PredictionIO事件服務器,HBase和Elasticsearch:
$ pio-start-all
您可以通過運行下面命令來檢查狀態
$ pio status
如果一切正常,您應該看到以下輸出:

(2)從引擎模板創建新引擎
現在讓我們通過下載分類引擎模板來創建一個名為MyClassification的新引擎。轉到要放置引擎的目錄並運行以下命令:
$ git clone https://github.com/apache/predictionio-template-attribute-based-classifier.git MyClassification $ cd MyClassification
創建一個新目錄MyClassification,您可以在其中找到下載的引擎模板。
(3)生成應用程序ID和訪問密鑰
您需要在PredictionIO中創建一個新應用程序來存儲應用程序的所有數據。收集的數據將用於機器學習建模。假設您要在名為“MyApp1”的應用程序中使用此引擎。運行以下命令以創建新應用程序“MyApp1”:
$ pio app new MyApp1
您應該在控制台輸出中找到以下內容:

請注意,為此應用程序“MyApp1”創建了App ID ,** Access Key *。使用此應用程序的EventServer收集數據時,您將需要訪問密鑰。
您可以通過運行以下命令列出創建其相應ID和訪問密鑰的所有應用程序:
$ pio app list
你應該會看到你創建的應用列表,例如:

這里我的應用是MyApp_classify。
(4)收集數據
接下來,讓我們收集一些培訓數據。默認情況下,分類引擎模板讀取用戶記錄的4個屬性:attr0,attr1,attr2和plan。此模板需要“$ set”用戶事件。官方文檔提供了更具體的說明,這一段建議返回官方文檔的$4. Collecting Data$查看。
我們往下走,為方便起見,將訪問密鑰設置為shell變量,運行:
$ ACCESS_KEY=<ACCESS_KEY>
查詢事件服務器
現在讓我們查詢EventServer,看看是否成功導入了這些事件。
使用瀏覽器轉到以下URL:
http://localhost:7070/events.json?accessKey=<YOUR_ACCESS_KEY>
或者在終端中運行以下命令:
$ curl -i -X GET "http://localhost:7070/events.json?accessKey=$ACCESS_KEY"
請注意,在運行curl命令時,應使用單引號或雙引號引用整個URL 。
導入數據
該引擎需要更多數據才能訓練有用的模型。為了快速啟動演示,我們不是一個接一個地實時發送更多事件,而是使用腳本批量導入更多事件。
提供了一個Python導入腳本import_eventserver.py,用於使用Python SDK將數據導入Event Server。請先升級到最新的Python SDK。
首先,您需要安裝Python SDK才能運行示例數據導入腳本。要安裝Python SDK,請運行:
$ pip install predictionio
或者
$ easy_install predictionio
注意:如果您有權限問題,則可能需要訪問權限。使用sudo pip install predictionio
導入數據時,先確保您在MyClassification目錄下,執行以下操作:
$ cd MyClassification $ python data/import_eventserver.py --access_key $ACCESS_KEY
您應該看到以下輸出:

現在,訓練數據存儲在事件存儲中。
如果你看到提示錯誤“TypeError: init() got an unexpected keyword argument 'access_key' ”請把Python SDK升級到最新版本
您可以如前所述再次查詢事件服務器以檢查導入的事件。
(5)部署引擎即服務
現在,您可以構建,訓練和部署引擎。首先,確保您在MyClassification目錄下。
$ cd MyClassification
- Engine.json
在目錄下,您應該找到一個engine.json文件; 這是您為引擎指定參數的位置。
修改此文件以確保appName參數與您之前創建的App Name相匹配(例如,如果您按照本文,則為“MyApp1”)。

您可能會在engine.json中看到appId,這意味着您正在使用舊模板。在這種情況下,請確保appId文件中定義的內容與您的App ID相匹配。或者,您可以下載最新版本的模板或按照我們的升級說明修改模板以appName用作參數。
這個命令第一次需要幾分鍾; 所有后續構建應該不到一分鍾。--verbose如果您不想查看所有日志消息,也可以在不運行的情況下運行它。
成功構建后,您應該看到以下內容的控制台消息。

- 訓練預測模型
要訓練引擎,請運行以下命令:
$ pio train
成功訓練引擎后,您應該看到類似於以下內容的控制台消息。

- 部署引擎
現在您的引擎已准備好部署。運行:
$ pio deploy
成功部署並運行引擎后,您應該看到類似於以下內容的控制台消息:

不要殺死已部署的引擎進程。
默認情況下,已部署的引擎綁定到http://localhost:8000。您可以在Web瀏覽器中訪問該頁面以檢查其狀態。

(6)使用引擎
現在,您可以嘗試檢索預測結果。例如,要預測attr0 = 2,attr1 = 0和attr2 = 0的用戶的標簽,您將此JSON發送{ "attr0":2, "attr1":0, "attr2":0 }到已部署的引擎,它將返回預測計划的JSON。只需通過發出HTTP請求或通過EngineClient SDK 發送查詢。部署的引擎運行后,打開另一個終端並運行以下curl命令或使用SDK發送查詢:
Docker 終端執行:
$ curl -H "Content-Type: application/json" \ -d '{ "attr0":2, "attr1":0, "attr2":0 }' http://localhost:8000/queries.json
或者,使用python
import predictionio engine_client = predictionio.EngineClient(url="http://localhost:8000") print engine_client.send_query({"attr0":2, "attr1":0, "attr2":0})
返回結果

在輸入三個特征之后,返回類別label為1,服務可以正常使用。
(7)注意問題(歡迎完善)
- 導入數據
$ cd MyClassification $ python data/import_eventserver.py --access_key $ACCESS_KEY
就是上面兩行,在Docker終端運行時候,需要在docker容器安裝好所需插件,比如pip和easy_install任選一個,然后是python的版本不能太高,最好的是python 2.7
第一,先檢查你是不是不是windows10 pro版本,如果不是,請看3.4小節
第二,你是否開了VPN,如果開了你要注意,把系統代理模式調成PAC模式,如還有問題,也可嘗試把VPN關掉,調回國內正常網絡。
3.4 windows10 64 home版的獨特之處
Windows10 64 home版與pro有些許不一樣,這一類都可以統稱為非Windows10 pro版
(1)啟動容器需要提前映射文件夾
由於在home版本下,不是docker原生環境,並且不提供可視化界面,所以當我們從引擎庫下載引擎時,需要在容器和宿主機共享文件夾,也稱為映射。所以一開始啟動容器的時候,就需要映射好文件夾,這一點官網也沒有指出,命令行與官網和上文種的不一樣,具體原理參考:Docker Toolbox在window 10 home 下掛載宿主機目錄到容器的正確操作 - 知-青 - 博客園,下面直接給出正確啟動容器命令行。
docker run -it -v /c/Users/T480S/work/Engine:/Engine -p 8000:8000 steveny/predictionio:0.12.0 /bin/bash
不可照搬,參照原理,改變自己的路徑。
(2)不能鏈接http://localhost:8000
在容器中暴露的應用端口,需要注意,他的訪問地址不是你的主機localhost,而是一個虛擬機的ip地址,一般為192.168.99.100,如果你在容器中跑起來一個web程序並且暴露了8000端口,那么想在外面訪問的話,地址為http://192.168.99.100:8000 ,如果是win10下的原生docker就會沒有這個迷惑,直接localhost了。
(3)發出請求
既然返回url不一樣,同樣的發出請求里面的url,也是官網的或pro版不一樣。請參照下面的命令行,進行能動性的使用。
$ curl -H "Content-Type: application/json" -d '{ "attr0":2, "attr1":0, "attr2":0 }' http://192.168.99.100:8000/queries.json
