Spark生態(tài)系統(tǒng)中的圖數(shù)據(jù)分析知識
圖結(jié)構(gòu)可有效表示稀疏矩陣,因而圖數(shù)據(jù)分析可用于實現(xiàn)大數(shù)據(jù)分析。對于Spark生態(tài)系統(tǒng)中的圖處理系統(tǒng)GraphX,《Spark GraphX in Action》一書給出了詳細(xì)的教程和典型用例,將教會讀者如何使用GraphX和GraphFrames進(jìn)行圖分析。本文是Info對該書作者的訪談,內(nèi)容包括圖數(shù)據(jù)及分析技術(shù)、GraphX高效程序開發(fā)、圖數(shù)據(jù)分析的趨勢等。
如何定義圖數(shù)據(jù)?
Michael Malak:就事論事,圖結(jié)構(gòu)看上去并非像股價圖那樣,而是邊和點的集合。但這只是一種模糊的數(shù)學(xué)抽象。更具體地說,在書的第一章中我們將真實世界中的圖劃分為五類:網(wǎng)絡(luò)、樹、類RDBMS結(jié)構(gòu)、稀疏矩陣以及其它雜七雜八的結(jié)構(gòu)。
Robin East:傳統(tǒng)的數(shù)據(jù)分析方法側(cè)重于事物本身,即實體,例如銀行交易、資產(chǎn)注冊等等。而圖數(shù)據(jù)不僅關(guān)注事務(wù),還關(guān)注事物之間的聯(lián)系。例如,如果有一個呼叫記錄告訴我張三曾打電話給李四,這樣就可以將張三和李四關(guān)聯(lián)起來。這種關(guān)聯(lián)關(guān)系提供了與兩者相關(guān)的有價值信息,而這樣的信息是不可能僅從兩者單純的個體數(shù)據(jù)中獲取的。
圖數(shù)據(jù)分析與傳統(tǒng)數(shù)據(jù)的處理的不同之處
Malak:正如我們在書的第一章中所描述的,RDBMS不足以有效地處理圖路徑遍歷運算,因為該運算需要進(jìn)行大量的自連接運算。用于稀疏矩陣處理是另一個圖分析展示出良好性能的領(lǐng)域,在書中機器學(xué)習(xí)相關(guān)的第七章中對此有所描述。
East:圖分析事實上是一系列的實踐,這些實踐側(cè)重于對數(shù)據(jù)條目間關(guān)聯(lián)信息內(nèi)容的描繪。在不同實體間連接模式可見的情況下,對不同數(shù)據(jù)間關(guān)聯(lián)建模提供了十分強大的能力。再次使用電話呼叫記錄作為例子,當(dāng)我們對由不同人所做的不同呼叫而組成的“網(wǎng)絡(luò)”進(jìn)行分析時,就可以去構(gòu)建具有不同交互類型的圖形。在一些情況下,我們可以使用數(shù)據(jù)的結(jié)構(gòu)信息對不同的行為進(jìn)行分隔(例如區(qū)分犯罪與否)。
圖數(shù)據(jù)分析是如何促進(jìn)大數(shù)據(jù)和預(yù)測分析?
Malak:對于已有的大數(shù)據(jù),首先你需要從數(shù)據(jù)中抽取出結(jié)構(gòu)化數(shù)據(jù),通常是關(guān)系模型或者圖模型。一些問題可自然地表示為圖問題,例如地圖中的路由查找、社會網(wǎng)絡(luò)分析(尤其是在一個社會網(wǎng)絡(luò)圖中發(fā)現(xiàn)意見領(lǐng)袖)。所有的機器學(xué)習(xí)都是關(guān)于做預(yù)測的,而在書中關(guān)于機器學(xué)習(xí)的一章也是內(nèi)容最長的。這一章中展示了一些使用圖數(shù)據(jù)上機器學(xué)習(xí)的方法。
East:基于大數(shù)據(jù)的預(yù)測分析的效能,事實上取決于抽取許多不同類型的特征作為預(yù)測算法輸入的能力。書中我最喜歡的例子就是對原有垃圾郵件檢測的全新實現(xiàn)。原問題是使用邏輯回歸檢測垃圾頁面,但是我們采用了一種有趣的新思想,即Truncated Page Rank算法,該算法使用基于圖的輸入特性擴展了傳統(tǒng)的輸入特性。書中展示了如何在GraphX中實現(xiàn)這個模型。
GraphFrames的工作機制
Malak:作為Apache Spark生態(tài)系統(tǒng)的一部分,GraphX是Spark的官方圖處理系統(tǒng)。即使在Spark 2.0中也是如此。GraphX基于RDD技術(shù),每條邊和每個節(jié)點均由一個RDD表示。GraphFrames作為spark-packages.org所提供的附加軟件,依然是基于DataFrames的。
將GraphX與GrapeFrames進(jìn)行對比,這很大程度上就是RDD與DataFrames的對比。使用DataFrames(對于GraphFrames也一樣),Catalyst查詢計劃器、Tungsten sun.misc.unsafe原始內(nèi)存布局、即時字節(jié)碼生成會得到潛在的巨大性能提升。就即時字節(jié)碼生成而言,Spark 2.0對整個處理流水線而非keyhole代碼生成進(jìn)行了改進(jìn),這取得了相比于Spark 1.6 Dataframes十倍的性能提升。GraphX具有內(nèi)部路由表,這便利了三元組(triplet)的構(gòu)建;GraphFrames雖然缺少內(nèi)部路由表的設(shè)計,但從DataFrames所免費獲取的性能改進(jìn)彌補這一不足,并給出了更大的性能優(yōu)勢。
GraphFrames還具有使用Neo4j Cypher語言的子集和DataFrames對SQL語言的支持進(jìn)行組合查詢的功能。最后一點,GraphFrames提供了對Python和Java語言的綁定,這對于喜歡Python語言和更適應(yīng)Java開發(fā)的程序員是一個喜訊。但是GraphX的痛點在于僅官方支持Scala語言(雖然在書中我們也展示了如何跨域數(shù)以百計的關(guān)卡實現(xiàn)在開發(fā)中對Java的支持)。我們在第十章中涵蓋了GraphFrames相關(guān)內(nèi)容,并給出了一個有趣的例子,就是去查找本應(yīng)存在于Wikipedia中的缺失鏈接。
East:彈性分布式數(shù)據(jù)集(Resilient Distributed Datasets,RDD)是Spark提供的核心底層數(shù)據(jù)結(jié)構(gòu)。在GraphX中,RDD用于表示圖中的邊和節(jié)點。另一方面,DataFrames是高層數(shù)據(jù)接口,提供了一些面向開發(fā)人員的有用特性,例如SQL接口。DataFrames還提供了若干性能優(yōu)化。GraphFrames使用DataFrames表示圖,而非RDD。
GraphFrames中添加了若干GraphX所不具有的關(guān)鍵特性,例如查詢結(jié)構(gòu)、Python屬性函數(shù)(Property)和Java API。無論如何,從一種表示方式轉(zhuǎn)化為另一種都是可能的,事實上這也是PageRank、連通分量等標(biāo)準(zhǔn)算法的實現(xiàn)方法。
四種不同的圖數(shù)據(jù)相關(guān)的概念
記者:你們能介紹一下NoSQL圖數(shù)據(jù)庫、圖數(shù)據(jù)查詢、圖數(shù)據(jù)分析和圖數(shù)據(jù)可視化這四種圖數(shù)據(jù)相關(guān)的概念嗎?
Malak:我在2016年6月的Spark峰會上做過一個報告,報告中對圖技術(shù)給出了一個很好的“頻譜”展示。頻譜圖的一端是真正OLTP風(fēng)格的NoSQL圖數(shù)據(jù)庫,包括Neo4j、Titan、OrientDB等。另一端是OLAP風(fēng)格的圖處理和數(shù)據(jù)分析系統(tǒng),包括GraphX、GraphLab等。圖查詢涉及的范圍處于該頻譜圖的中央。NoSQL圖數(shù)據(jù)庫和GraphFrames也都可以進(jìn)行查詢,但是GraphX在查詢方面非常有局限性。
無論OLTP風(fēng)格圖數(shù)據(jù)庫或是OLAP風(fēng)格的圖處理和分析系統(tǒng),都可以應(yīng)用圖數(shù)據(jù)庫可視化技術(shù),所以圖數(shù)據(jù)可視化的領(lǐng)域范圍與該頻譜圖是相互正交的。在本書中我們論及兩種特定的技術(shù):Gephi和組合使用Zpeppelin與d3.js。需要指出的是,圖可視化的用例與關(guān)系數(shù)據(jù)可視化的用例之間有很大的差異。關(guān)系數(shù)據(jù)可視化的目標(biāo)是對數(shù)據(jù)取得直觀的了解,而圖數(shù)據(jù)可視化的目標(biāo)在于對數(shù)據(jù)或算法進(jìn)行調(diào)試。
East:正如Michael已提到的,現(xiàn)在已有一些不同的圖數(shù)據(jù)庫,它們滿足了一系列不同用例的需求。值得強調(diào)的是GraphX提供了內(nèi)存中的圖處理功能,而非數(shù)據(jù)庫功能??梢允褂肎raphX從一系列數(shù)據(jù)源中構(gòu)建基于內(nèi)存的圖,這樣的數(shù)據(jù)源中可能包括對NoSQL圖數(shù)據(jù)庫的查詢。實際上后一種組合的潛在應(yīng)用前景巨大。
圖可視化是一個需要整整一本書去闡述的話題,很高興看到Manning出版社已經(jīng)于前期初版了這樣的一本書,那就是Corey Lanum所著的《Visualizing Graph Data》。
最佳解決方案用例
記者:在哪些受歡迎的用例數(shù)據(jù)處理中,圖數(shù)據(jù)處理是更好解決的方案?
Malak:應(yīng)用GraphX的典型代表性算法是PageRank。一些用例使用或者拓展了RageRank算法,這樣的用例超越了Google將PageRank用于搜索排序的應(yīng)用,可用于在論文引用網(wǎng)絡(luò)(書中給出了一個實例)和社會網(wǎng)絡(luò)這樣類型的圖中查找意見領(lǐng)袖。在書中我們還展示了如何將PageRank轉(zhuǎn)化為另一種稱為Truncated Page Rank的算法,這種算法可用于發(fā)現(xiàn)垃圾網(wǎng)頁鏈接農(nóng)場。
除了PageRank之外,我們在書中還給出了一些經(jīng)典圖算法的實現(xiàn),這些經(jīng)典圖算法提出于半個世紀(jì)之前,其中包括了最短路徑(例如地理空間映射)、旅行推銷員問題和最小生成樹等算法。最小生成樹問題聽上去很學(xué)術(shù),但是在書中我們展示了它的一個有意思的應(yīng)用,就是輔以MLlib提供的word2vec算法,從語料庫中自動建立層次化概念分類結(jié)構(gòu)。一些Spark中的機器學(xué)習(xí)算法實際上是GraphX實現(xiàn)的,其中包括:一種類似于ALS可用于推薦系統(tǒng)的算法SVD++、冪迭代聚類(Power Iteration Clustering,PIC)等。在書中給出了使用PIC算法實現(xiàn)計算機視覺中圖像分割的例子。
East:在數(shù)據(jù)間關(guān)聯(lián)與數(shù)據(jù)項本身同等重要的情況下,就應(yīng)該考慮使用圖方法進(jìn)行數(shù)據(jù)處理。雖然有時使用傳統(tǒng)方法也能實現(xiàn)這種圖處理,但是這樣的實現(xiàn)方法很快會變成一種繁重工作,因為即使對于十分簡單的結(jié)構(gòu),這樣的方法也需要付出很大的努力才能實現(xiàn)。與之相對比的是,對于互連的數(shù)據(jù),GraphX等圖處理系統(tǒng)提供了非常自然的數(shù)據(jù)表示和交互方式。
Spark機器學(xué)習(xí)程序庫的用例
記者:通過提供面向批處理、流數(shù)據(jù)和圖數(shù)據(jù)處理的程序庫,Spark給出了一種統(tǒng)一的大數(shù)據(jù)處理架構(gòu)。Spark還提供了機器學(xué)習(xí)程序庫。你們能介紹一些同時使用所有這些程序庫的用例嗎?
Malak:在書里關(guān)于機器學(xué)習(xí)的一章中,我們描述了在MLlib中使用GraphX的方法,但是其中所提及的方法都是批處理應(yīng)用。類似于Spark中的任何其它對象,在GraphX和GraphFrames中圖也是不可變的對象,不可以在圖中增量地添加邊或節(jié)點。雖然Spark Streaming也是基于不可變數(shù)據(jù),但是它通過實現(xiàn)對關(guān)系數(shù)據(jù)的小型批處理方法使得流數(shù)據(jù)處理成為可能,小型批處理實現(xiàn)了類似于微型關(guān)系表的功能,這種微型表比微型圖更加有用。在《Spark GraphX in Action》一書出版后,GraphX的創(chuàng)立者Ankur Dave在Spark峰會上展示了一個稱為Tegra的研究項目,該項目為實現(xiàn)對增量流數(shù)據(jù)的更新,重寫了GraphX的代碼(該項目與Spark Streaming無關(guān))。但是我并不相信當(dāng)前Tegra的代碼已經(jīng)公開可用。
East:在線欺詐檢測就是這樣的一個領(lǐng)域??紤]到欺詐攻擊的快速演變特性,預(yù)測分析需要使用最近五分鐘或者更短時間內(nèi)所生成的特性。此外將圖模型加入到特征混合中的方法,具有實現(xiàn)更加有效的預(yù)測算法的潛力。
比GraphX更加高效的技術(shù)
Malak:一個原則就是審慎地掌控緩存和RDD血統(tǒng)(lineage)。鑒于GraphX程序多為實現(xiàn)迭代運算,該原則對于性能問題是尤其重要的。其它一些典型的Spark技術(shù)對性能優(yōu)化也有效,例如選取適當(dāng)?shù)男蛄谢绦颉?/p>
East:當(dāng)然首要的是了解Spark的工作機制,以及如何對進(jìn)程進(jìn)行監(jiān)控以了解系統(tǒng)運行狀態(tài)。Spark提供的基于Web的GUI可以實時展示系統(tǒng)運行狀態(tài),為此必須了解如何最大化地去使用這些工具。程序有很多不同的優(yōu)化方向,例如緩存、序列化、監(jiān)測點等,但是理想情況下只有在你理解你的應(yīng)用是如何執(zhí)行的,才可以應(yīng)用這些優(yōu)化方向。
Spark GraphX程序庫實現(xiàn)中還有哪些缺失特性?
Malak:書中第八章專用于闡述“缺失的算法”,其中包括:PDF文件的讀取、圖的合并、孤立節(jié)點的濾除、全局聚類參數(shù)的計算等。此外,為加速GraphX程序運行,GraphX的創(chuàng)建者Ankur Dave建立了一個稱為IndexedRDD的程序包。該程序包尚未集成到Apache Spark的發(fā)布版本中,因而在某種程度上也可以說是GraphX所“缺失”的。在第八章中我們展示了如何將IndexedRDD集成到GraphX程序中,以實現(xiàn)程序性能的提高。
East:可能協(xié)同使用Spark Streaming時需要對圖的增量更新的支持,所以大家時常會提出需要此特性。鑒于當(dāng)前GraphX的數(shù)據(jù)結(jié)構(gòu)是不可變的,因而增量更新意味著重新創(chuàng)建整個圖,這是一個十分耗時的過程。
圖數(shù)據(jù)處理領(lǐng)域中未來趨勢
Malak:一個發(fā)展趨勢將會是同時可處理OLAP和OLTP類型應(yīng)用的圖系統(tǒng)。在上面提到過我在2016年6月Spark峰會上給出的頻譜圖,其中很明顯可以看出NoSQL圖數(shù)據(jù)庫在對整個頻譜的覆蓋上遙遙領(lǐng)先。但是對于哪一種特定的NoSQL圖數(shù)據(jù)庫將會成為最終勝出者的問題,Neo4j、Turi(或Dato、GraphLab)、OrientDB、Titan、Oracle PGX等都是潛在的勝出者。其中GraphX的一個顯著優(yōu)勢是,對于已經(jīng)部署了Spark集群的系統(tǒng),無需再付出額外的安裝和管理代價。而當(dāng)前Spark集群已在很多公司中得以部署。因而與Spark的集成將會成為影響任何未來可能處于統(tǒng)治地位的圖技術(shù)的關(guān)鍵因素。
East:我認(rèn)為有兩個領(lǐng)域值得密切關(guān)注。第一個領(lǐng)域是在圖數(shù)據(jù)庫與圖處理架構(gòu)間的緊密集成。這可通過Neo4j這樣的圖數(shù)據(jù)庫與Spark這樣的圖處理系統(tǒng)間的無縫互操作實現(xiàn),或許這些功能也可出現(xiàn)在同一產(chǎn)品中。
另一個領(lǐng)域是圖算法與主流機器學(xué)習(xí)算法兩者間更加緊密地集成。當(dāng)前一些程序庫只是側(cè)重于其中的一方(GraphX也僅是與Spark機器學(xué)習(xí)程序庫松散地集成)。事實上,可經(jīng)??吹接脠D來替代表示稀疏數(shù)據(jù)矩陣。
Robin還談及了圖數(shù)據(jù)處理的方法。
East: 如果你習(xí)慣于使用關(guān)系數(shù)據(jù)庫進(jìn)行傳統(tǒng)數(shù)據(jù)處理,那么可能需要一段時間去理解使用基于圖的方法進(jìn)行數(shù)據(jù)建模。如果你固步自封,那么很快就會看到圖結(jié)構(gòu)的應(yīng)用將無所不在。
關(guān)于采訪嘉賓:
Michael Malak是《Spark GraphX In Action》一書的主要作者,他自2013年初以來,已在兩家《財富》世界200強企業(yè)中開展了Spark解決方案實施。在企業(yè)能采購到具有適合功能的商業(yè)產(chǎn)品之間,他可以做編程實現(xiàn)。
Robin East曾作為大型企業(yè)顧問工作超過15年,現(xiàn)在是Worldpay公司的數(shù)據(jù)科學(xué)家。























