Apache Spark是一款快速、靈活且對開發者友好的工具,也是大型SQL、批處理、流處理和機器學習的領先平臺。
2009年,Apache Spark從美國U.C. Berkeley的 AMPLab為起步,現在已經成為世界上主要的大數據分布式處理框架之一。Spark可以以各種方式進行部署,為Java、Scala、Python和R編程語言提供本地綁定,并支持SQL、流數據、機器學習和圖形處理。已經被銀行、電信公司、游戲公司、政府以及蘋果、Facebook、IBM和微軟等領域的企業和科技巨頭所使用。
Spark開箱即用,可以在獨立的集群模式中運行,只需要在集群中的每臺計算機上使用Apache Spark框架和JVM即可。然而,用戶更希望利用資源或集群管理系統負責分配需求到員工手中。在企業中,這通常都是在Hadoop YARN上運行(這是Cloudera和Hortonworks發行版運行Spark作業的方式),但Apache Spark也可以在Apache Mesos上運行。同時,其在為Kubernetes添加本地支持方面也取得了進展。
如果正在處理一個托管解決方案,那么可以在Amazon EMR,Google Cloud Dataproc和Microsoft Azure HDInsight中找到Apache Spark。擁有Apache Spark創始人的Databricks公司,也提供Databricks統一分析平臺。這是一個全面的托管服務,提供Apache Spark集群、流支持、集成的基于Web的notebook開發,以及在標準Apache Spark發行版中優化的云I / O性能.
Spark VS Hadoop
目前,大多數Hadoop發行版中都包含了Spark。但是由于Spark本身的兩大優勢,使Spark在處理大數據時已經成為首選框架,超越了Hadoop 引入MapReduce范例。
第一個優勢是速度。Spark的內存數據引擎在某些情況下,可以執行比MapReduce快一百倍的任務,特別是與需要在stage之間將狀態寫回到磁盤的多級作業相比。即使Apache Spark的作業數據不能完全包含在內存中,但也比MapReduce快10倍左右。
第二個優勢是交互友好的Spark API。與Spark加速一樣重要的是,用戶認為Spark API的友好性更為重要。
Spark核心
與MapReduce和其他Apache Hadoop組件相比,Apache Spark API對開發人員非常友好,在簡單的方法調用后,隱藏了分布式處理引擎的許多復雜性。典型的例子是,幾乎50行MapReduce代碼在文檔中計算單詞的數量在可以減少到只有幾行代碼(這里顯示在Scala中):
通過提供與Python和R等數據分析流行語言的綁定,以及對企業更友好的Java和Scala的綁定,Apache Spark使應用程序開發人員和數據科學家以可訪問的方式利用其可擴展性和速度。
Spark RDD
Apache Spark的核心是彈性分布式數據集(Resilient Distributed Dataset,RDD),是一中抽象編程,它是跨計算集群拆分的不可變對象的集合。在RDD上的操作也可以跨集群進行,并在并行處理過程中執行,從而實現快速可擴展的并行處理。
RDD可以通過簡單的文本文件、SQL數據庫、NoSQL存儲(如Cassandra和MongoDB)以及Amazon S3存儲等來創建。Spark Core API的大部分構建在RDD概念之上,支持傳統的映射,還為連接數據集、過濾、采樣和聚合提供了內置支持。
Spark通過結合驅動程序核心進程,以分布式方式運行,該進程將Spark應用程序分解成任務,并將其分發到工作的執行程序進程中,這些執行程序可以根據應用程序的需要進行擴展和縮減。
Spark SQL
Spark SQL最初被稱為“Shark”,現在對Apache Spark項目變得越來越重要。它可能是當今開發人員在創建應用程序時最常用的界面,Spark SQL專注于結構化數據處理,使用從R和Python(在Pandas中)借用的數據框架方法。正如它的名字,Spark SQL還提供了一個SQL2003兼容接口來查詢數據,將Apache Spark的強大功能帶給分析師和開發人員。
除了標準的SQL支持,Spark SQL還提供了一個標準接口,用于讀取和寫入其他數據存儲,包括JSON、HDFS、Apache Hive、JDBC、Apache ORC和Apache Parquet,所有這些都支持開箱即用。例如Apache Cassandra、MongoDB、Apache HBase以及其他許多受歡迎的數據庫,可以通過從Spark Packages生態系統中提取單獨的連接器來使用。
從dataframe中選擇列:
使用SQL接口,將dataframe注冊為臨時表,之后對它發出SQL查詢:
在后臺,Apache Spark使用名為Catalyst的查詢優化器來檢查數據和查詢,以便為數據局部性和計算提供高效的查詢計劃,在整個集群中執行所需的計算。在Apache Spark 2.x中,dataframes和datasets的Spark SQL接口(實質上是一個類型化的數據框,可以在編譯時檢查正確性,并在運行時利用進一步的內存和計算優化)是推薦的開發方法。RDD接口仍然可用,但只有在無法在Spark SQL范例中封裝的情況下才推薦使用。
Spark MLlib
Apache Spark還捆綁了一些用于將機器學習和圖形分析技術應用于數據的庫。Spark MLlib包含一個用于創建機器學習管道的框架,允許在任何結構化數據集上輕松實現特征提取、選擇和轉換。MLLib采用分布式實現的集群和分類算法,如k均值聚類和隨機森林,可輕松地在自定義管道中交換。模型可以由Apache Spark的數據科學家使用R或Python進行培訓,MLLib保存,然后導入到基于Java或Scala的管道中供生產使用。
雖然Spark MLlib涵蓋了基本的機器學習,包括分類、回歸、聚類和過濾,但它不包含建模和訓練深度神經網絡的功能。
Spark GraphX
Spark GraphX提供了一系列用于處理圖形結構的分布式算法,包括Google的PageRank的實現。這些算法使用Spark Core的RDD方法來建模數據; GraphFrames包允許在dataframe上做圖形操作,包括利用Catalyst優化器進行圖查詢。
Spark Streaming
Spark Streaming是Apache Spark的早期添加物,它幫助在需要實時或接近實時處理的環境中獲得牽引力。以前,Apache Hadoop領域的批處理和流處理是分開的。可以為批處理需求編寫MapReduce代碼,并使用像Apache Storm這樣的實時流媒體。這顯然導致不同的代碼庫需要保持同步的應用程序域,盡管是基于完全不同的框架,需要不同的資源。
Spark Streaming將Apache Spark的批處理概念擴展到流,通過將流分解為連續的一系列微格式,然后使用Apache Spark API進行操作。通過這種方式,批處理和流操作中的代碼可以共享(大部分)相同的代碼,運行在同一個框架上,從而減少開發人員和操作員的開銷。
對Spark Streaming方法的一個批評是:在需要對傳入數據進行低延遲響應的情況下,microbatching可能無法與Apache Storm、Apache Flink和Apache Apex等其他支持流的框架的性能相匹配,所有這些都使用純粹的流媒體方法而不是微型媒體。
結構化流媒體
結構化流式處理(在Spark 2.x中添加)將影響Spark SQL對Spark API進行Spark流式處理,結果將是更高級別的API,更易于編寫應用程序。在結構化流的情況下,高級API本質上允許開發人員創建無限流式數據框和數據集。它還解決了用戶在早期框架中遇到的一些非常真實的痛點,尤其是在處理事件時間聚合和延遲傳遞消息方面。結構化流的所有查詢都通過Catalyst查詢優化器,甚至可以交互方式運行,允許用戶對實時流數據執行SQL查詢。
結構化數據流在Apache Spark中仍然是一個新部分,在Spark 2.2發行版中已經被標記為生產就緒。但是,結構化流是面向平臺的流媒體應用程序的未來,因此如果要構建新的流式傳輸應用程序,應該使用結構化流式處理。傳統的Spark Streaming API將繼續得到支持,但是該項目建議移植到結構化流式處理,因為新方法使得編寫和維護流代碼更容易。
Apache Spark的下一步是什么?
盡管結構化流式傳輸為Spark Streaming提供了高級改進,但它目前依賴于處理流式數據的相同的微處理方案。Apache Spark團隊正在努力為平臺帶來連續的流媒體處理,這應該能夠解決許多處理低延遲響應的問題(聲稱大約1ms,這將會非常令人印象深刻)。
除此之外,Apache Spark還將通過深度學習管道增加對深度學習的支持。使用MLlib的現有管道結構,將能夠在幾行代碼中構建分類器,并自定義Tensorflow圖形或Keras模型應用于傳入數據。這些圖表和模型甚至可以注冊為自定義的Spark SQL UDF(用戶定義的函數),以便深度學習模型可以作為SQL語句的一部分應用于數據。