據估計,到2017年底,90%的CPU cycles 將會致力于移動硬件,移動計算正在迅速上升到主導地位。Spark為此重新設計了Spark體系結構,允許Spark在移動設備上運行Spark。
Spark為現代化數據中心和大數據應用進行設計和優化,但是它目前不適合移動計算。在過去的幾個月中,Spark社區正在調研個可以在移動設備上運行架構的可行性,這篇文章將會和大家分享Spark社區的研究結果。
如果想及時了解Spark、Hadoop或者Hbase相關的文章,歡迎關注微信公共帳號:iteblog_hadoop
這個結構設計需要滿足以下條件:
該系統必須支持
(1)、支持在Android和iOS上運行Spark;
(2)、便利SoLoMo (social, local, mobile) 應用程序的發展;
(3)、保持源代碼的向后兼容性
(4)、在一個Spark集群上兼容不同的手機設備。
好支持
(1)、支持在Windows phones上運行Spark;
(2)、通過J2ME支持其他功能手機。
編譯和運行
目前Android Runtime (ART) 目前支持用Scala編寫的應用程序,可以看這篇文章Scala IDE article on Android development。
然而,iOS內置并不支持JVM,但是幸運的是,經過多個社區的共同努力,支持運行Java程序:
(1)、使用RoboVM,一個預先編譯器(ahead-of-time (AOT) compiler)和庫,使得我們可以使用Java編寫iOS應用程序l;
(2)、使用Scala和LLVM來編譯Spark 的Scala代碼,終會變成LLVM字節碼。鑒于Apple公司對LLVM項目的強烈支持,我們相信這個可以達到很高的性能;
(3)、而且Swift語言和Scala語言很類似,所以我們絕對可以將Scala語言編寫的項目轉換成Swift語言,然后使用XCode來編譯項目;
(4)、使用 Scala.js將Spark代碼編譯成JavaScript(可以參照這里http://www.scala-js.org/),然后使得我們可以在支持JavaScript引擎的軟件(比如Safari)上運行Spark。
以上四個選項,應該首選第四個,因為他不僅支持iOS系統,而且還會支持其他的系統。所以我們可以在iOS和Android系統上使用JavaScript引擎來運行Spark程序,在服務器上,Spark可以在Node.js上運行。
性能優化
JavaScript引擎是具有創造性的領域之一,所以我們完全有理由相信,JavaScript引擎可以迅速地提高自己的表現性能。然而,移動設備上的JavaScript引擎看起來比臺式機上的要落后,比如,移動設備上的JavaScript引擎不支持SIMD。我們可以將Spark對SIMD依賴的部分,我們可以進行選擇性的重寫,然后產生LLVM字節碼。
網絡和線協議
Spark的網絡傳輸是基于Netty的,而這個又依賴于 java.nio或者Linux epoll。雖然Android ART 內置就支持java.nio,但是我們需要重寫Netty,使得我們可以在iOS上使用kqueue。除此之外,目前社區還不清楚是否低級別的網絡原語(比如zero-copy)是否可以在JavaScript中使用,我們需要更密切地與蘋果和谷歌合作,以改善JavaScript對移動網絡的更好支持。
一個可行的選擇是使用grpc(它是Google開發的開源高性能RPC庫),grpc內置就支持在所有通用平臺上(Java, Objective C等等)使用HTTP/2。
在調試方面,JSON應該是超過任何現有的二進制格式的首選線串行協議。
真正的本地調度和DAGScheduler
為了更好地支持Spark的 local,social和mobile特性,社區將RDD本地性域用GPS坐標代替。本地調度可重構來真正的支持本地性,這是在服務器上永遠與不可能實現的。
為了保證源碼的兼容性,社區保留了舊的接口,并引入了新的本地性接口:
01
class RDD {
02
@deprecate(“2.0”, “use getPreferredTrueLocations”)
03
def getPreferredLocations(p: Partition): Seq[String]
04
05
/**
06
* Returns the preferred locations for executing task on partition
07
* `p`. Concrete implementations of RDD can use this to enable
08
* locality scheduling.
09
*/
10
def getPreferredTrueLocations(p: Partition): Seq[LatLong]
11
}
為移動平臺擴展TaskContext
TaskContext為Spark tasks提供了上下文信息(比如 job IDs, attempt IDs),這些在服務器上運行的Job就已經足夠了。但是在移動設備上,還有其他的信息,比如GPS位置,ongoing calls等,這些上下文信息對優化taks的處理很有用,而且不會影響到 smartphone/tablet用戶的用戶體驗。比如來了一個電話,一個新的task可能會被暫停,直到這個電話結束,這樣用戶的通話質量就不會受到影響。
iPhone和Android的基本引擎
社區已經使用iPhone創建了幾個proof-of-concepts,來更好地了解手機平臺的復雜性。下面就是原型的截圖。
本文開頭的截圖顯示了在iPhone上運行 Spark Streaming NetworkWordCount 實例。它使用sockets來從運行在Amazon EC2上的服務器上接收數據。同樣地,我們也在Android上運行這個實例,下面就是在Android模擬器上運行的截圖:
本文翻譯自:https://databricks.com/blog/2015/04/01/spark-2-rearchitecting-spark-for-mobile.html.后一節(Prototyping Machine Learning Application)本文未翻譯,感興趣的同學可以到里面去看看。
轉載自過往記憶(http://www.iteblog.com/)
本文鏈接地址: 《Spark 2.0:將支持在手機設備上運行Spark》(http://www.iteblog.com/archives/1316)
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。