??補(bǔ)充一張實(shí)驗(yàn)服務(wù)器的架構(gòu)圖面哼,說明一下集成的各軟件平臺之間的關(guān)系與連接歌殃。
??一般情況下,在紅色的調(diào)用線路上辞嗡,Shiny APP與R函數(shù)調(diào)用集成已經(jīng)可以解決大部分的需求豁护。如果有些業(yè)務(wù)分析模塊是用Python寫的,又不需要作圖輸出或與用戶界面交互欲间,那么走藍(lán)色線路直接調(diào)用Python函數(shù),效率要高一點(diǎn)断部。還有就是使用習(xí)慣的問題猎贴,對于習(xí)慣了用Python的人,新技能都有學(xué)習(xí)曲線蝴光,為什么不能提供Python的完整集成呢她渴?Python的作圖能力也不錯(cuò),習(xí)慣Python的人也可以用它作圖蔑祟。所以作為一個(gè)解決方案趁耗,要提供各種可能的選項(xiàng),這樣才全面和完整疆虚。
一苛败、架構(gòu)圖說明
??這張圖上有4層軟件結(jié)構(gòu),藍(lán)色的是服務(wù)器平臺径簿,綠色的是運(yùn)行的程序罢屈,紅色的是開發(fā)工具。紅色連線是貫通各層的任脈篇亭,R語言的一支缠捌;藍(lán)色連線是督脈,Python語言的一支译蒂,紫紅色是它們共同的部分曼月。
??表示層是瀏覽器平臺,網(wǎng)頁中運(yùn)行的是HTML柔昼、CSS哑芹、JavaScript 3種語言,它們都操作網(wǎng)頁在瀏覽器內(nèi)部的表示形式岳锁,文檔對象模型DOM绩衷。這是人機(jī)交互的UI界面蹦魔。
??應(yīng)用層運(yùn)行的是Java EE服務(wù)器平臺,跑的是Java語言的WEB APP咳燕,它實(shí)現(xiàn)的是業(yè)務(wù)流程勿决。使用的開發(fā)工具是Eclipse/IntelliJ IDEA。
??中間層是R語言與Python語言深度數(shù)據(jù)分析平臺招盲,它實(shí)現(xiàn)的是業(yè)務(wù)數(shù)據(jù)分析功能模塊低缩,比如前面文章例子中生成業(yè)務(wù)分析報(bào)告等。
??R語言平臺使用的開發(fā)工具是Rstudio/Rstudio Linux Server曹货,它產(chǎn)生可運(yùn)行的Shiny APP或 R Script咆繁,它們都可以通過Reticulate包調(diào)用Python Script。然后通過Shiny Server對外提供APP調(diào)用顶籽,通過Rserve對外提供R語言函數(shù)調(diào)用玩般。
??Python語言平臺使用的開發(fā)工具是JupyterHub/Lab,它產(chǎn)生Jupyter Notebook運(yùn)行文件(.ipynb)礼饱,調(diào)試好后再拷貝成Python Script(.py)坏为,所以在它們之間畫了條綠色的連線。也可以用客戶端的Spyder在PC端開發(fā)調(diào)試一些比較復(fù)雜的Python程序镊绪,它的Debugger比JupyterLab要好用一點(diǎn)匀伏。然后用gRPC或Pyro5等對外提供遠(yuǎn)過程調(diào)用。Python平臺有多種支持分布式計(jì)算的遠(yuǎn)過程調(diào)用軟件包蝴韭,這兩個(gè)支持Java客戶端够颠,后面再探討一下,目前實(shí)驗(yàn)服務(wù)器上還沒有開發(fā)好這個(gè)分支的調(diào)用實(shí)例榄鉴,其它所有路徑都開發(fā)好了履磨。
??數(shù)據(jù)層這里為了畫圖清晰好看,把對各種數(shù)據(jù)源的訪問都?xì)w集到一個(gè)Data節(jié)點(diǎn)上牢硅,實(shí)際上是沒有的蹬耘,Java、R减余、Python程序要訪問什么數(shù)據(jù)源综苔,直接通過接口驅(qū)動程序連就是了。數(shù)據(jù)層提供初步整理好的數(shù)據(jù)供中間層分析位岔。單個(gè)R或Python進(jìn)程都沒有處理大數(shù)據(jù)的能力如筛,對大數(shù)據(jù)的初步處理還是依賴數(shù)據(jù)層,比如云數(shù)據(jù)庫抒抬,Oracle等大型關(guān)系數(shù)據(jù)庫杨刨,提煉成小一些的數(shù)據(jù)集(比如數(shù)千萬行),或通過SQL等選取一個(gè)較小的子集來分析擦剑。這一層增加了SQL與Cypher語言妖胀。
??這樣這個(gè)開源解決方案就集成了5種平臺8種語言了芥颈。當(dāng)然每種平臺都會有很多各有特色的產(chǎn)品,比如數(shù)據(jù)層的云平臺赚抡、關(guān)系數(shù)據(jù)庫爬坑、圖數(shù)據(jù)庫、GIS平臺涂臣,市場上都有多種主流的產(chǎn)品盾计,而它們的具體實(shí)現(xiàn),通常會包含C/C++赁遗、Fortran等更多語言實(shí)現(xiàn)的算法模塊或插件署辉,比如R語言里大部分的包都是C/C++寫的。
??在應(yīng)用層與中間層之間岩四,部署了一個(gè)Nginx HTTP服務(wù)器哭尝,反向代理Rstudio Linux Server與Shiny Server,因?yàn)樗鼈兊拈_源免費(fèi)版都不支持SSL加密連接剖煌,而開發(fā)刚夺、測試與生產(chǎn)環(huán)境如果部署到公網(wǎng)上,SSL是必須的末捣。
二、用Graphviz生成上述架構(gòu)圖
??使用Graphviz前创橄,要先安裝它的可執(zhí)行文件箩做,具體請參閱各操作系統(tǒng)平臺的安裝指南。
??可以在Rstudio上直接編輯文本文件mysolution.gv妥畏,Graphviz的 dot格式繪圖文件都以.gv為后綴邦邦。具體語法可參閱Graphviz的文檔。
graph ER {
label = "開源多層分布式B/S結(jié)構(gòu)數(shù)據(jù)分析系統(tǒng)解決方案";
labelloc = t; // t: Place the graph's title on top.
fontsize = 30; // Make title stand out by giving a large font size
fontcolor = black;
layout=dot;
subgraph cluster_browser {
label="表示層 瀏覽器";
fontsize = 24;
style=filled;
fillcolor=gray90;
subgraph cluster_page{
label="網(wǎng)頁";
style=filled;
fillcolor=aliceblue;
node [shape=parallelogram, style=filled, fillcolor=yellowgreen]; JavaScript; HTML; CSS;
node [shape=oval, style=filled, fillcolor=gold]; DOM模型;
}
}
JavaScript -- DOM模型;
HTML -- DOM模型;
CSS -- DOM模型;
subgraph cluster_Java {
label="應(yīng)用層 Java";
fontsize = 24;
style=filled;
fillcolor=gray90;
node [shape=rectangle, style=filled, fillcolor=lightpink]; "Eclipse/IntelliJ IDEA";
subgraph cluster_Java{
label="Java EE Server";
style=filled;
fillcolor=aliceblue;
node [shape=rectangle, style=filled, fillcolor=lightblue]; Tomcat;
node [shape=component, style=filled, fillcolor=yellowgreen]; "Java EE WEB APP";
}
}
DOM模型 -- Tomcat[label="HTTPS", color=purple, penwidth=5];
"Eclipse/IntelliJ IDEA" -- Tomcat;
Tomcat -- "Java EE WEB APP"[color=purple, penwidth=5];
node [shape=rectangle, style=filled, fillcolor=lightblue]; Nginx;
subgraph cluster_R {
label="中間層 R";
fontsize = 24;
style=filled;
fillcolor=gray90;
node [shape=rectangle, style=filled, fillcolor=lightblue]; "R Serve"; "Shiny Server";
node [shape=parallelogram, style=filled, fillcolor=yellowgreen]; "R Script"; "Shiny APP";
node [shape=rectangle, style=filled, fillcolor=lightpink]; "Rstudio Linux Server";
}
"Java EE WEB APP" -- Nginx[label="HTTPS",color=red, penwidth=5];
DOM模型 -- Nginx[label="HTTPS"];
Nginx -- "Rstudio Linux Server";
Nginx -- "Shiny Server"[color=red, penwidth=5];
"R Serve" -- "R Script"[color=red, penwidth=5];
"Shiny Server" -- "Shiny APP"[color=red, penwidth=5];
"Java EE WEB APP" -- "R Serve"[label="SSL", color=red, penwidth=5];
"Rstudio Linux Server" -- "R Script";
"Rstudio Linux Server" -- "Shiny APP";
subgraph cluster_Python {
label="中間層 Python";
fontsize = 24;
style=filled;
fillcolor=gray90;
node [shape=rectangle, style=filled, fillcolor=lightblue]; "gRPC/Pyro";
node [shape=rectangle, style=filled, fillcolor=lightpink]; Spyder; "JUpyter Hub & Lab";
node [shape=parallelogram, style=filled, fillcolor=yellowgreen]; "Python Script"; "Jupyter Notebook";
}
"Java EE WEB APP" -- "gRPC/Pyro"[label="SSL", color=blue, penwidth=5];
"gRPC/Pyro" -- "Python Script"[color=blue, penwidth=5];
Spyder -- "Python Script";
"Jupyter Notebook" -- "Python Script"[color=darkgreen, penwidth=5];
"JUpyter Hub & Lab" -- "Jupyter Notebook";
DOM模型 -- "JUpyter Hub & Lab"[label="HTTPS"];
subgraph cluster_Data {
label="數(shù)據(jù)層";
fontsize = 24;
style=filled;
fillcolor=gray90;
node [shape=rectangle]; "Data";
node [shape=box3d]; "Cloud Database"; "Data Warehouse"; "Relational Database"; "Graph Database";"GIS Data"; "Text Data"
}
"R Script" -- "Data"[color=red, penwidth=5];
"Shiny APP" -- "Data"[color=red, penwidth=5];
"Python Script" -- "Data"[color=purple, penwidth=5];
"Jupyter Notebook" -- "Data";
"Java EE WEB APP" -- "Data";
"R Script" -- "Python Script"[label="Reticulate", color=red, penwidth=5];
"Shiny APP" -- "Python Script"[label="Reticulate",color=red, penwidth=5];
"Data" -- "Cloud Database"[label="SQL"];
"Data" -- "Data Warehouse"[label="SQL"];
"Data" -- "Relational Database"[label="SQL"];
"Data" -- "Graph Database"[label="Cypher"];
"Data" -- "GIS Data";
"Data" -- "Text Data";
}
三醉蚁、Rstudio中渲染架構(gòu)圖
??需要先安裝DiagrammeR包燃辖,然后Rstudio菜單上直接就有Preview按鈕可以瀏覽Graphviz圖,它實(shí)際上執(zhí)行的是下面的命令:
>install.packages("DiagrammeR")
>DiagrammeR::grViz("images/mysolution.gv")
四网棍、Python中渲染架構(gòu)圖
??Python上同樣要先安裝graphviz包黔龟,然后執(zhí)行下面的程序輸出成SVG或在開發(fā)環(huán)境中顯示,輸出成SVG的話要在瀏覽器中另行打開滥玷,這里直接在開發(fā)環(huán)境中顯示氏身。
# pip install graphviz
from graphviz import Source
with open("/home/jean/images/mysolution.gv","r", encoding ='utf-8') as f:
dot_graph = f.read()
# 輸出成SVG格式, layout: engine="dot", 還有 neato, fdp, sfdp,twopi,circo
gv = Source(dot_graph, engine="dot")
# gv.render(filename="MySolution", directory="/home/jean/images", format="svg")
gv
五、關(guān)于分布式方案的探討
??分布式方案的最大優(yōu)點(diǎn)是便于與存量的WEB應(yīng)用系統(tǒng)集成惑畴,只要在新的服務(wù)器上部署中間層的Python與R部分即可蛋欣,這樣可以有效的盤活存量的軟硬件與數(shù)據(jù)資產(chǎn),性價(jià)比很高如贷。稅務(wù)系統(tǒng)大部分的業(yè)務(wù)應(yīng)用系統(tǒng)都是運(yùn)行在瀏覽器上的B/S結(jié)構(gòu)Java EE平臺WEB應(yīng)用系統(tǒng)陷虎,都有數(shù)據(jù)層與中間件層到踏,是否如本方案一樣區(qū)分應(yīng)用層與中間層,對于本方案新增加的R與Python深度數(shù)據(jù)分析中間層尚猿,并無影響窝稿。所以B/S與分層是與業(yè)務(wù)應(yīng)用系統(tǒng)高度同構(gòu)的,便于開發(fā)與集成谊路。
??新部署的R與Python部分運(yùn)行在自己的服務(wù)器中讹躯,自然與Java EE平臺的原業(yè)務(wù)系統(tǒng)分開計(jì)算,這就是分布式計(jì)算缠劝。本方案對R語言平臺的集成有兩種模式潮梯,Tomcat WEB APP嵌入Shiny APP方式的集成在瀏覽器端,由頁面窗口之間的JavaScript通訊實(shí)現(xiàn)業(yè)務(wù)流程與數(shù)據(jù)的連接惨恭,嚴(yán)格來說并不算分布式計(jì)算秉馏,只是調(diào)用不同服務(wù)器上的資源而已,關(guān)鍵是這些資源能夠協(xié)調(diào)配合完成既定的任務(wù)脱羡。由Tomcat WEB APP通過Rserve調(diào)用R語言函數(shù)萝究,則是一種松耦合的分布式計(jì)算,因?yàn)樗募稍诜?wù)器端锉罐。Java程序通過網(wǎng)絡(luò)協(xié)議直接調(diào)用R服務(wù)器上的程序帆竹,并等待它的返回。松耦合是因?yàn)樗且环NC/S模式脓规,而不是傳統(tǒng)分布式組件CORBA栽连、Java RMI、DCOM的本地代理模式侨舆。上面這些是二十年前秒紧,十年前還比較流行的分布式計(jì)算技術(shù),后來Web Service興起挨下,提供了XMLHTTP協(xié)議上的C/S式調(diào)用熔恢,即類似于調(diào)用Rserve那樣的松耦合分布式計(jì)算。近年則是Web Service在HTTP協(xié)議上的進(jìn)一步發(fā)展臭笆,衍生的REST API成為了主流叙淌,如各大云平臺的REST API,都是松耦合的分布式計(jì)算愁铺,通過方便的API來調(diào)用云端強(qiáng)大的大數(shù)據(jù)算力凿菩。用Rserve是有什么用什么,并且它的歷史很長帜讲,經(jīng)過了充分的驗(yàn)證衅谷,也很穩(wěn)定可靠,能完成任務(wù)就好似将。
??Python中間層的調(diào)用方案還沒有寫好實(shí)例获黔,只是初步了解一下可用的方案蚀苛。它并沒有Rserve那樣的松耦合軟件包可用,相反提供了類似Java RMI那樣緊耦合的幾種方案(軟件包)玷氏。gRPC是Google開源并在內(nèi)部廣泛使用的通用RPC(遠(yuǎn)過程調(diào)用)框架堵未,客戶端與服務(wù)端都支持多種語言,包括Pyhton與Java盏触。Thrift是Facebook開源的通用RPC 框架渗蟹,與gRPC一樣客戶端與服務(wù)端都支持Python與Java,Thriftpy是它另一個(gè)比較流行的Python封裝赞辩。Pyro5是一個(gè)歷史較長的開源項(xiàng)目雌芽,比較有名,已經(jīng)發(fā)展到版本5了辨嗽,它也是客戶端與服務(wù)端都支持Python與Java世落。RpyC是另一個(gè)比較流行的純Python RPC框架先馆,它只支持Python害幅。這篇文章比較了上面的幾種RPC框架度宦,這篇文章則介紹了Python平臺上可用于分布式計(jì)算的更多框架偶芍。
??Python平臺上大概也是有什么用什么,要求是客戶端Java服務(wù)端Python谅辣,看哪個(gè)更方便和更符合應(yīng)用場景的需求吧凄吏。有成熟的方案铸敏,實(shí)現(xiàn)的難度應(yīng)該不大杈帐。
??最后說明一下髓堪,這里說的分布式計(jì)算,還沒有涉及到并行計(jì)算娘荡,這已經(jīng)超出了本篇的范圍。