Spark 提供了一個(gè)新的體系,spark.ml。 相對(duì)于spark.mllib,這是一個(gè)更高層的對(duì)機(jī)器學(xué)習(xí)流程的一個(gè)抽象。然而,你會(huì)神奇的發(fā)現(xiàn)這套抽象,竟然也適合服務(wù)平臺(tái)的設(shè)計(jì)與建模。更讓我印象深刻的是,一個(gè)合適的抽象,簡(jiǎn)直就像真理一樣。譬如RDD這種就是一個(gè)和神一般的抽象,它使得Spark成為了一個(gè)非常通用的平臺(tái),囊括了流式計(jì)算,離線計(jì)算,機(jī)器學(xué)習(xí),圖計(jì)算等多個(gè)領(lǐng)域。
spark.ml 在一開(kāi)始就提出了五個(gè)概念。這五個(gè)概念也完全可以對(duì)一個(gè)通用的service platform進(jìn)行建模和抽象。我們來(lái)看看。
五個(gè)主要概念
服務(wù)的本質(zhì)是數(shù)據(jù)的流轉(zhuǎn)。
Transformer。 我們的每一個(gè)服務(wù)節(jié)點(diǎn),都是一個(gè)數(shù)據(jù)轉(zhuǎn)換器。譬如你開(kāi)發(fā)的一個(gè)Spark Streaming程序,一個(gè)Storm程序,一個(gè)Tomcat Web服務(wù),都是一個(gè)Transformer。
Estimator 。支撐Tranformer運(yùn)行的框架平臺(tái)。他是解決一類(lèi)問(wèn)題的支撐平臺(tái)。通常我們會(huì)有很多不同類(lèi)型的Estimator,比如MR,比如Spark,比如Storm,比如Tomcat。他們分別解決各自領(lǐng)域的類(lèi)的問(wèn)題。比如Storm適合運(yùn)行你開(kāi)發(fā)的實(shí)時(shí)類(lèi)的Transformer,MR則適合運(yùn)行你開(kāi)發(fā)的批量數(shù)據(jù)處理的Transformer,Tomat則適合支撐Web類(lèi)的Transformer。
Parameter 。 每個(gè)Transformer都有自己的參數(shù),每個(gè)Estimator有自己的參數(shù)。Parameter就是所有參數(shù)的集合。
Pipeline。 Pipeline 其實(shí)是由互通的Transformer構(gòu)建起來(lái)的一段網(wǎng)狀結(jié)構(gòu)。每一個(gè)Transformer 以自己作為Root節(jié)點(diǎn),都會(huì)向下延伸出一個(gè)樹(shù)狀節(jié)點(diǎn)。
DataFrame。數(shù)據(jù)框。各個(gè)Transformer之間交換數(shù)據(jù)的規(guī)范。Transformer 將一種DataFrame transform 成另一種DataFrame。
通用的建模
最終你會(huì)發(fā)現(xiàn),我們的整個(gè)服務(wù)體系就是一個(gè)由Transformer,Pipeline構(gòu)建起來(lái)的網(wǎng)狀結(jié)構(gòu)。如果我們跳出公司的視野,你會(huì)發(fā)現(xiàn)整個(gè)公司的網(wǎng)狀服務(wù)體系只是全世界網(wǎng)絡(luò)體系的一小部分。整個(gè)互聯(lián)網(wǎng)是一張大網(wǎng)。這就說(shuō)明,整個(gè)互聯(lián)網(wǎng)其實(shí)也是可以通過(guò)上面五個(gè)概念進(jìn)行涵蓋。
我們部署服務(wù)到底是一件什么樣的事情
你可能覺(jué)得這個(gè)問(wèn)題會(huì)比較可笑。然而,如果之前我們提出的概念是正確或者合理的,讓我們離真理更近了一步的話,那么它應(yīng)該能夠清晰的解釋?zhuān)覀儾渴鸹蛘呦戮€一個(gè)服務(wù),或者一個(gè)服務(wù)故障,到底是什么?
先說(shuō)部署上線新服務(wù),其實(shí)就是新建了一個(gè)Transformer,無(wú)論這個(gè)Transformer是一個(gè)Web服務(wù),直接面向用戶,或者是一個(gè)類(lèi)似中轉(zhuǎn)的器的角色,譬如將Kafka里的數(shù)據(jù)消費(fèi)然后填充到搜索系統(tǒng)里,他都導(dǎo)致了一個(gè)(或者多個(gè))新的PipeLine的產(chǎn)生。Transformer的作用是將數(shù)據(jù)連接了起來(lái),并且將數(shù)據(jù)轉(zhuǎn)化成一個(gè)我們需要的形態(tài),如此而已。
下線或者服務(wù)故障則是類(lèi)似的。
這個(gè)理論對(duì)我們來(lái)說(shuō)有什么意義
答案是指導(dǎo)我們?nèi)绾稳ニ伎紗?wèn)題。
我們不希望每次遇到一個(gè)新的業(yè)務(wù)問(wèn)題,都需要根據(jù)自己的聰明才智,通過(guò)經(jīng)驗(yàn),得到一個(gè)解決方案。任何事情都是有跡可循的。正如吳文俊提出的機(jī)器證明,可以通過(guò)流程化的方式讓計(jì)算機(jī)來(lái)證明幾何問(wèn)題。當(dāng)面臨一個(gè)新的業(yè)務(wù)問(wèn)題的時(shí)候,我們應(yīng)該有標(biāo)準(zhǔn)的流程可以走。
以構(gòu)建一個(gè)搜索服務(wù)為例子。搜索本身是一個(gè)Transformer,他需要把數(shù)據(jù)transform成索引,當(dāng)用戶進(jìn)行查詢的時(shí)候,搜索會(huì)對(duì)索引的數(shù)據(jù)再次進(jìn)行transform,返回給客戶。也就是進(jìn)行了兩次大的transform。
下面是進(jìn)行平臺(tái)設(shè)計(jì)時(shí)我覺(jué)得比較合適的一個(gè)想法:
當(dāng)設(shè)計(jì)一個(gè)平臺(tái)的時(shí)候,我們只要關(guān)注Estimator就好,我們必須已經(jīng)有大量的以及隨時(shí)具備上線新的Estimator的能力。 之后面對(duì)實(shí)際的各種業(yè)務(wù)需求,應(yīng)該由基于這些Estimator的Transformer去應(yīng)對(duì),構(gòu)建Transformer主要考慮兩點(diǎn):
- 需要將哪些原來(lái)沒(méi)有Pipeline的的Tranformer連接起來(lái)
- 如何對(duì)數(shù)據(jù)進(jìn)行Transform
對(duì)于一個(gè)新的業(yè)務(wù)需求,如何進(jìn)行考慮呢?
- 和哪些已有的Transformer 建立 Pipeline?
- DataFrame是否需要經(jīng)過(guò)新的Transformer 轉(zhuǎn)換,這個(gè)Pipeline才能正常工作?
- 如果有新的Transformer,如何選擇合適的Estimator?
羅列已有的Transformer
搜索要獲取數(shù)據(jù),那么就是要新建一個(gè)Pipeline,也就是要和已經(jīng)存在的一個(gè)Transformer(數(shù)據(jù)源)建立連接。所以現(xiàn)有的數(shù)據(jù)源(假設(shè)是Kafka)是我們已知的,并且要建立Pipeline的Transformer。
DataFrame是否需要經(jīng)過(guò)新的Transformer 轉(zhuǎn)換,這個(gè)Pipeline才能正常工作
經(jīng)過(guò)調(diào)研我們發(fā)現(xiàn),數(shù)據(jù)源的信息并不能直接被搜索給接受,所以一個(gè)新的Transformer IndexDataCollector就誕生了。通過(guò)IndexDataCollector我們可以把Kafka和搜索給關(guān)聯(lián)起來(lái)。
如何選擇合適的Estimator?
Estimator的概念的提出,就是希望我們的應(yīng)用應(yīng)該是不關(guān)心服務(wù)環(huán)境的,應(yīng)該是往Estimator提交,就能讓Transformer運(yùn)行并且產(chǎn)生作用。所以我們優(yōu)先推薦采用可以跑在Yarn/Mesos這種將服務(wù)器屏蔽的資源調(diào)度平臺(tái)上的Estimator。
這里,IndexDataCollector 需要的Estimator 應(yīng)該是Storm或者Spark Streaming。
采用這種類(lèi)型Estimator的好處是,我們僅僅按規(guī)則(Estimator的接口規(guī)范)開(kāi)發(fā)一個(gè)應(yīng)用,提交給集群就能方便的將Kafka和搜索這兩個(gè)原來(lái)不存在的Pipeline的Transformer連接起來(lái),從而滿足新的需求。
結(jié)束語(yǔ)
個(gè)人認(rèn)為大部分業(yè)務(wù)需求都可以按如上的步驟去考慮。萬(wàn)物互通,一個(gè)好的抽象應(yīng)該具有普適的價(jià)值。雖然原先這套理論是針對(duì)機(jī)器學(xué)習(xí)流程抽象出來(lái)的,但是你會(huì)發(fā)現(xiàn)它也適用于其他的問(wèn)題。事實(shí)上,你會(huì)發(fā)現(xiàn)機(jī)器學(xué)習(xí)中處理的環(huán)節(jié)和要素和我們?cè)谧銎脚_(tái)架構(gòu)或者處理新的業(yè)務(wù)需求的過(guò)程是如此的相似。