Spark 的發展
對于一個具有相當技術門檻與復雜度的平臺,Spark 從誕生到正式版本的成熟,經歷的時間如此之短,讓人感到驚詫。2009 年,Spark 誕生于伯克利大學 AMPLab,最開初屬于伯克利大學的研究性項目。它于 2010 年正式開源,并于 2013 年成為了 Apache 基金項目,并于 2014 年成為 Apache 基金的頂級項目,整個過程不到五年時間。
由于 Spark 出自伯克利大學,使其在整個發展過程中都烙上了學術研究的標記,對于一個在數據科學領域的平臺而言,這也是題中應有之義,它甚至決定了 Spark 的發展動力。Spark 的核心 RDD(resilient distributed datasets),以及流處理,SQL 智能分析,機器學習等功能,都脫胎于學術研究論文,如下所示:
Discretized Streams: Fault-Tolerant Streaming Computation at Scale. Matei Zaharia, Tathagata Das, Haoyuan Li, Timothy Hunter, Scott Shenker, Ion Stoica. SOSP 2013. November 2013.
Shark: SQL and Rich Analytics at Scale. Reynold Xin, Joshua Rosen, Matei Zaharia, Michael J. Franklin, Scott Shenker, Ion Stoica. SIGMOD 2013. June 2013.
Discretized Streams: An Efficient and Fault-Tolerant Model for Stream Processing on Large Clusters. Matei Zaharia, Tathagata Das, Haoyuan Li, Scott Shenker, Ion Stoica. HotCloud 2012. June 2012.
Shark: Fast Data Analysis Using Coarse-grained Distributed Memory (demo). Cliff Engle, Antonio Lupher, Reynold Xin, Matei Zaharia, Haoyuan Li, Scott Shenker, Ion Stoica. SIGMOD 2012. May 2012. Best Demo Award.
Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing. Matei Zaharia, Mosharaf Chowdhury, Tathagata Das, Ankur Dave, Justin Ma, Murphy McCauley, Michael J. Franklin, Scott Shenker, Ion Stoica. NSDI 2012. April 2012. Best Paper Award and Honorable Mention for Community Award.
Spark: Cluster Computing with Working Sets. Matei Zaharia, Mosharaf Chowdhury, Michael J. Franklin, Scott Shenker, Ion Stoica. HotCloud 2010. June 2010.
在大數據領域,只有深挖數據科學領域,走在學術前沿,才能在底層算法和模型方面走在前面,從而占據領先地位。Spark 的這種學術基因,使得它從一開始就在大數據領域建立了一定優勢。無論是性能,還是方案的統一性,對比傳統的 Hadoop,優勢都非常明顯。Spark 提供的基于 RDD 的一體化解決方案,將 MapReduce、Streaming、SQL、Machine Learning、Graph Processing 等模型統一到一個平臺下,并以一致的 API 公開,并提供相同的部署方案,使得 Spark 的工程應用領域變得更加廣泛。
Spark 的代碼活躍度
從 Spark 的版本演化看,足以說明這個平臺旺盛的生命力以及社區的活躍度。尤其在 2013 年來,Spark 進入了一個高速發展期,代碼庫提交與社區活躍度都有顯著增長。以活躍度論,Spark 在所有 Apache 基金會開源項目中,位列前三。相較于其他大數據平臺或框架而言,Spark 的代碼庫最為活躍,如下圖所示:
從 2013 年 6 月到 2014 年 6 月,參與貢獻的開發人員從原來的 68 位增長到 255 位,參與貢獻的公司也從 17 家上升到 50 家。在這 50 家公司中,有來自中國的阿里、百度、網易、騰訊、搜狐等公司。當然,代碼庫的代碼行也從原來的 63,000 行增加到 175,000 行。下圖為截止 2014 年 Spark 代碼貢獻者每個月的增長曲線:
下圖則顯示了自從 Spark 將其代碼部署到 Github 之后的提交數據,一共有 8471 次提交,11 個分支,25 次發布,326 位代碼貢獻者。
目前的 Spark 版本為 1.1.0。在該版本的代碼貢獻者列表中,出現了數十位國內程序員的身影。這些貢獻者的多數工作主要集中在 Bug Fix 上,甚至包括 Example 的 Bug Fix。由于 1.1.0 版本極大地增強了 Spark SQL 和 MLib 的功能,因此有部分貢獻都集中在 SQL 和 MLib 的特性實現上。下圖是 Spark Master 分支上最近發生的仍然處于 Open 狀態的 Pull Request:
可以看出,由于 Spark 仍然比較年輕,當運用到生產上時,可能發現一些小缺陷。而在代碼整潔度方面,也隨時在對代碼進行著重構。例如,淘寶技術部在 2013 年就開始嘗試將 Spark on Yarn 應用到生產環境上。他們在執行數據分析作業過程中,先后發現了 DAGSchedular 的內存泄露,不匹配的作業結束狀態等缺陷,從而為 Spark 庫貢獻了幾個比較重要的 Pull Request。具體內容可以查看淘寶技術部的博客文章:《Spark on Yarn:幾個關鍵 Pull Request》。
Spark 的社區活動
Spark 非常重視社區活動,組織也極為規范,定期或不定期地舉行與 Spark 相關的會議。會議分為兩種,一種為 Spark Summit,影響力巨大,可謂全球 Spark 頂尖技術人員的峰會。目前,已經于 2013 年和 2014 年在 San Francisco 連續召開了兩屆 Summit 大會。2015 年,Spark Summit 將分別在 New York 與 San Francisco 召開,其官方網站為:http://spark-summit.org/。
在 2014 年的 Spark Summit 大會上,我們看到除了伯克利大學以及 Databricks 公司自身外,演講者都來自最早開始運用和嘗試 Spark 進行大數據分析的公司,包括最近非常火的音樂網站 Spotify,全球最大專注金融交易的 Sharethrough,專業大數據平臺 MapR、Cloudera,云計算的領先者 Amazon,以及全球超大型企業 IBM、Intel、SAP 等。
除了影響力巨大的 Spark Summit 之外,Spark 社區還不定期地在全球各地召開小型的 Meetup 活動。Spark Meetup Group 已經遍布北美、歐洲、亞洲和大洋洲。在中國,北京 Spark Meetup 已經召開了兩次,并將于今年 10 月 26 日召開第三次 Meetup。屆時將有來自 Intel 中國研究院、淘寶、TalkingData、微軟亞洲研究院、Databricks 的工程師進行分享。下圖為 Spark Meetup Groups 在全球的分布圖:
Spark 的現在和未來
Spark 的特色在于它首先為大數據應用提供了一個統一的平臺。從數據處理層面看,模型可以分為批處理、交互式、流處理等多種方式;而從大數據平臺而言,已有成熟的 Hadoop、Cassandra、Mesos 以及其他云的供應商。Spark 整合了主要的數據處理模型,并能夠很好地與現在主流的大數據平臺集成。下圖展現了 Spark 的這一特色:
這樣的一種統一平臺帶來的優勢非常明顯。對于開發者而言,只需要學習一個平臺,降低了學習曲線。對于用戶而言,可以很方便地將 Spark 應用運行在 Hadoop、Mesos 等平臺上面,滿足了良好的可遷移性。統一的數據處理方式,也可以簡化開發模型,降低平臺的維護難度。
Spark 為大數據提供了通用算法的標準庫,這些算法包括 MapReduce、SQL、Streaming、Machine Learning 與 Graph Processing。同時,它還提供了對 Scala、Python、Java(支持 Java 8)和R語言的支持:
在最新發布的 1.1.0 版本中,對 Spark SQL 和 Machine Learning 庫提供了增強。Spark SQL 能夠更加有效地在 Spark 中加載和查詢結構型數據,同時還支持對 JSON 數據的操作,并提供了更加友好的 Spark API。在 Machine Learning 方面,已經包含了超過 15 種算法,包括決策樹、SVD、PCA,L-BFGS 等。下圖展現了 Spark 當前的技術棧:
在 2014 年的 Spark Summit 上,來自 Databricks 公司的 Patrick Wendell 展望了 Spark 的未來。他在演講中提到了 Spark 的目標,包括:
Empower data scientists and engineers
Expressive, clean APIs
Unified runtime across many environments
Powerful standard libraries
在演講中,他提到在 Spark 最近的版本中,最重要的核心組件為 Spark SQL。接下來的幾次發布,除了在性能上更加優化(包括代碼生成和快速的 Join 操作)外,還要提供對 SQL 語句的擴展和更好的集成(利用 SchemaRDD 與 Hadoop、NoSQL 以及 RDBMS 的集成)。在將來的版本中,要為 MLLib 增加更多的算法,這些算法除了傳統的統計算法外,還包括學習算法,并提供與R語言更好的集成,從而能夠為數據科學家提供更好的選擇,根據場景來選擇 Spark 和R。
Spark 的發展會結合硬件的發展趨勢。首先,內存會變得越來越便宜,256GB 內存以上的機器會變得越來越常見,而對于硬盤,則 SSD 硬盤也將慢慢成為服務器的標配。由于 Spark 是基于內存的大數據處理平臺,因而在處理過程中,會因為數據存儲在硬盤中,而導致性能瓶頸。隨著機器內存容量的逐步增加,類似 HDFS 這種存儲在磁盤中的分布式文件系統將慢慢被共享內存的分布式存儲系統所替代,諸如同樣來自伯克利大學的 AMPLab 實驗室的 Tachyon 就提供了遠超 HDFS 的性能表現。因此,未來的 Spark 會在內部的存儲接口上發生較大的變化,能夠更好地支持 SSD、以及諸如 Tachyon 之類的共享內存系統。事實上,在 Spark 的最近版本里,已經開始支持 Tachyon 了。
根據 Spark 的路線圖,Databricks 會在近三個月陸續發布 1.2.0 和 1.3.0 版本。其中,1.2.0 版本會對存儲方面的 API 進行重構,在 1.3.0 之上的版本,則會推出結合 Spark 和R的 SparkR。除了前面提到的 SQL 與 MLLib 之外,未來的 Spark 對于 Streaming、GraphX 都有不同程度的增強,并能夠更好地支持 YARN。
Spark 的應用
目前,Spark 的正式版本得到了部分 Hadoop 主流廠商的支持,如下企業或平臺發布的 Hadoop 版本中,都包含了 Spark:
這說明業界已經認可了 Spark,Spark 也被許多企業尤其是互聯網企業廣泛應用到商業項目中。根據 Spark 的官方統計,目前參與 Spark 的貢獻以及將 Spark 運用在商業項目的公司大約有 80 余家(https://cwiki.apache.org/confluence/display/SPARK/Powered+By+Spark)。在國內,投身 Spark 陣營的公司包括阿里、百度、騰訊、網易、搜狐等。在 San Francisco 召開的 Spark Summit 2014 大會上,參會的演講嘉賓分享了在音樂推薦(Spotify)、實時審計的數據分析(Sharethrough)、流在高速率分析中的運用(Cassandra)、文本分析(IBM)、客戶智能實時推薦(Graphflow)等諸多在應用層面的話題,這足以說明 Spark 的應用程度。
但是,整體而言,目前開始應用 Spark 的企業主要集中在互聯網領域。制約傳統企業采用 Spark 的因素主要包括三個方面。首先,取決于平臺的成熟度。傳統企業在技術選型上相對穩健,當然也可以說是保守。如果一門技術尤其是牽涉到主要平臺的選擇,會變得格外慎重。如果沒有經過多方面的驗證,并從業界獲得成功經驗,不會輕易選定。其次是對 SQL 的支持。傳統企業的數據處理主要集中在關系型數據庫,而且有大量的遺留系統存在。在這些遺留系統中,多數數據處理都是通過 SQL 甚至存儲過程來完成。如果一個大數據平臺不能很好地支持關系型數據庫的 SQL,就會導致遷移數據分析業務邏輯的成本太大。其三則是團隊與技術的學習曲線。如果沒有熟悉該平臺以及該平臺相關技術的團隊成員,企業就會擔心開發進度、成本以及可能的風險。
Spark 在努力解決這三個問題。隨著 1.0.2 版本的發布,Spark 得到了更多商用案例的驗證。Spark 雖然依舊保持年輕的活力,但已經具備堪稱成熟的平臺功能。至于 SQL 支持,Spark 非常。在 1.0.2 版本發布之前,就認識到基于 HIVE 的 Shark 存在的不足,從而痛下決心,決定在新版本中拋棄 Shark,而決定引入新的 SQL 模塊。如今,在 Spark 1.1.0 版本中,Spark SQL 的支持已經相對完善,足以支持企業應用中對 SQL 遷移的需求。關于 Spark 的學習曲線,主要的學習內容還是在于對 RDD 的理解。由于 Spark 為多種算法提供了統一的編程模型、部署模式,搭建了一個大數據的一體化方案,倘若企業的大數據分析需要應對多種場景,那么,Spark 這樣的架構反而使得它的學習曲線更低,同時還能降低部署成本。Spark 可以很好地與 Hadoop、Cassandra 等平臺集成,同時也能部署到 YARN 上。如果企業已經具備大數據分析的能力,原有掌握的經驗仍舊可以用到 Spark 上。雖然 Spark 是用 Scala 編寫,官方也更建議用戶調用 Scala 的 API,但它同時也提供了 Java 和 Python 的接口,非常體貼地滿足了 Java 企業用戶或非 JVM 用戶。如果抱怨 Java 的冗贅,則 Spark 新版本對 Java 8 的支持讓 Java API 變得與 Scala API 同樣的簡潔(因為缺少類型推斷略顯冗余)而強大。
顯然,隨著 Spark 的逐漸成熟,并在活躍社區的推動下,它所提供的強大功能一定能得到更多技術團隊和企業的青睞。相信在不遠的將來會有更多傳統企業開始嘗試使用 Spark。