什么是Apache Spark?數(shù)據(jù)分析平臺如是說
自從 Apache Spark 2009 年在 U.C. Berkeley 的 AMPLab 默默誕生以來,它已經(jīng)成為這個世界上最重要的分布式大數(shù)據(jù)框架之一。Spark 可以用多種方式部署,它為 Java、Scala、Python,和 R 編程語言提供了本地綁定,并且支持 SQL、流數(shù)據(jù)、機(jī)器學(xué)習(xí),和圖處理。你將會發(fā)現(xiàn)它被銀行、電信公司、游戲公司、政府,和所有如 Apple、Facebook、IBM,和 Microsoft 等主要的科技巨頭公司使用。
非常好,Spark 可以運(yùn)行在一個只需要在你集群中的每臺機(jī)器上安裝 Apache Spark 框架和 JVM 的獨立集群模式。然而,你將更有可能做的是,希望利用資源或集群管理系統(tǒng)來幫你按需分配工作。 在企業(yè)中,這通常意味著在 Hadoop YARN (這是 Cloudera 和 Hortonworks 分配運(yùn)行 Spark 任務(wù)的方式 )上運(yùn)行。盡管 work 是在增加了本地支持的 Kubernetes 上執(zhí)行,但是 Apache Spark 也可以在 Apache Mesos 上運(yùn)行。
如果你追求一個有管理的解決方案,那么可以發(fā)現(xiàn) Apache Spark 已作為 Amazon EMR、Google Cloud Dataproc, 和 Microsoft Azure HDInsight 的一部分。雇傭了 Apache Spark 創(chuàng)始人的公司 Databricks 也提供了 Databricks 統(tǒng)一分析平臺,這個平臺是一個提供了 Apache Spark 集群,流式支持,集成了基于 Web 的筆記本開發(fā),和在標(biāo)準(zhǔn)的 Apache Spark 分布上優(yōu)化了云的 I/O 性能的綜合管理服務(wù)。
值得一提的是,拿 Apache Spark 和 Apache Hadoop 比是有點不恰當(dāng)?shù)?。目前,在大多?shù) Hadoop 發(fā)行版中都包含 Spark 。但是由于以下兩大優(yōu)勢,Spark 在處理大數(shù)據(jù)時已經(jīng)成為***框架,超越了使 Hadoop 騰飛的舊 MapReduce 范式。
***個優(yōu)勢是速度。Spark 的內(nèi)存內(nèi)數(shù)據(jù)引擎意味著在某些情況下,它執(zhí)行任務(wù)的速度比 MapReduce 快一百倍,特別是與需要將狀態(tài)寫回到磁盤之間的多級作業(yè)相比時更是如此。即使 Apache Spark 的作業(yè)數(shù)據(jù)不能完全包含在內(nèi)存中,它往往比 MapReduce 的速度快10倍左右。
第二個優(yōu)勢是對開發(fā)人員友好的 Spark API 。與 Spark 的加速一樣重要的是,人們可能會認(rèn)為 Spark API 的友好性更為重要。
Spark Core
與 MapReduce 和其他 Apache Hadoop 組件相比,Apache Spark API 對開發(fā)人員非常友好,在簡單的方法調(diào)用后面隱藏了分布式處理引擎的大部分復(fù)雜性。其中一個典型的例子是幾乎要 50 行的 MapReduce 代碼來統(tǒng)計文檔中的單詞可以縮減到幾行 Apache Spark 實現(xiàn)(下面代碼是 Scala 中展示的):
- val textFile = sparkSession.sparkContext.textFile(“hdfs:///tmp/words”)
- val counts = textFile.flatMap(line => line.split(“ “))
- .map(word => (word, 1))
- .reduceByKey(_ + _)
- counts.saveAsTextFile(“hdfs:///tmp/words_agg”)
通過提供類似于 Python、R 等數(shù)據(jù)分析流行語言的綁定,以及更加對企業(yè)友好的 Java 和 Scala ,Apache Spark 允許應(yīng)用程序開發(fā)人員和數(shù)據(jù)科學(xué)家以可訪問的方式利用其可擴(kuò)展性和速度。
Spark RDD
Apache Spark 的核心是彈性分布式數(shù)據(jù)集(Resilient Distributed Dataset,RDD)的概念,這是一種編程抽象,表示一個可以在計算集群中分離的不可變對象集合。 RDD 上的操作也可以跨群集分割,并以批處理并行方式執(zhí)行,從而實現(xiàn)快速和可擴(kuò)展的并行處理。
RDD 可以通過簡單的文本文件、SQL 數(shù)據(jù)庫、NoSQL 存儲(如 Cassandra 和 MongoDB )、Amazon S3 存儲桶等等創(chuàng)建。Spark Core API 的大部分是構(gòu)建于 RDD 概念之上,支持傳統(tǒng)的映射和縮減功能,還為連接數(shù)據(jù)集、過濾、采樣和聚合提供了內(nèi)置的支持。
Spark 是通過結(jié)合驅(qū)動程序核心進(jìn)程以分布式方式運(yùn)行的,該進(jìn)程將 Spark 應(yīng)用程序分解成任務(wù),并將其分發(fā)到完成任務(wù)的許多執(zhí)行程序的進(jìn)程中。這些執(zhí)行程序可以根據(jù)應(yīng)用程序的需要進(jìn)行擴(kuò)展和縮減。
Spark SQL
Spark SQL 最初被稱為 Shark,Spark SQL 對于 Apache Spark 項目開始變得越來越重要。它就像現(xiàn)在的開發(fā)人員在開發(fā)應(yīng)用程序時常用的接口。Spark SQL 專注于結(jié)構(gòu)化數(shù)據(jù)的處理,借用了 R 和 Python 的數(shù)據(jù)框架(在 Pandas 中)。不過顧名思義,Spark SQL 在查詢數(shù)據(jù)時還兼容了 SQL2003 的接口,將 Apache Spark 的強(qiáng)大功能帶給分析師和開發(fā)人員。
除了支持標(biāo)準(zhǔn)的 SQL 外,Spark SQL 還提供了一個標(biāo)準(zhǔn)接口來讀寫其他數(shù)據(jù)存儲,包括 JSON,HDFS,Apache Hive,JDBC,Apache Parquet,所有這些都是可以直接使用的。像其他流行的存儲工具 —— Apache Cassandra、MongoDB、Apache HBase 和一些其他的能夠從 Spark Packages 生態(tài)系統(tǒng)中提取出來單獨使用的連接器。
下邊這行簡單的代碼是從數(shù)據(jù)框架中選擇一些字段:
- citiesDF.select(“name”, “pop”)
要使用 SQL 接口,首先要將數(shù)據(jù)框架注冊成一個臨時表,之后我們就可以使用 SQL 語句進(jìn)行查詢:
- citiesDF.createOrReplaceTempView(“cities”)
- spark.sql(“SELECT name, pop FROM cities”)
在后臺, Apache Spark 使用名為 Catalyst 的查詢優(yōu)化器來檢查數(shù)據(jù)和查詢,以便為數(shù)據(jù)局部性和計算生成有效的查詢計劃,以便在集群中執(zhí)行所需的計算。在 Apache Spark 2.x 版本中,Spark SQL 的數(shù)據(jù)框架和數(shù)據(jù)集的接口(本質(zhì)上是一個可以在編譯時檢查正確性的數(shù)據(jù)框架類型,并在運(yùn)行時利用內(nèi)存并和計算優(yōu)化)是推薦的開發(fā)方式。RDD 接口仍然可用,但只有無法在 Spark SQL 范例中封裝的情況下才推薦使用。
Spark MLib
Apache Spark 還有一個捆綁許多在大數(shù)據(jù)集上做數(shù)據(jù)分析和機(jī)器學(xué)習(xí)的算法的庫 (Spark MLib) 。Spark MLlib 包含一個框架用來創(chuàng)建機(jī)器學(xué)習(xí)管道和在任何結(jié)構(gòu)化數(shù)據(jù)集上進(jìn)行特征提取、選擇、變換。MLLib 提供了聚類和分類算法的分布式實現(xiàn),如 k 均值聚類和隨機(jī)森林等可以在自定義管道間自由轉(zhuǎn)換的算法。數(shù)據(jù)科學(xué)家可以在 Apache Spark 中使用 R 或 Python 訓(xùn)練模型,然后使用 MLLib 存儲模型,***在生產(chǎn)中將模型導(dǎo)入到基于 Java 或者 Scala 語言的管道中。
需要注意的是 Spark MLLib 只包含了基本的分類、回歸、聚類和過濾機(jī)器學(xué)習(xí)算法,并不包含深度學(xué)建模和訓(xùn)練的工具(更多內(nèi)容 InfoWorld’s Spark MLlib review )。提供深度學(xué)習(xí)管道的工作正在進(jìn)行中。
Spark GraphX
Spark GraphX 提供了一系列用于處理圖形結(jié)構(gòu)的分布式算法,包括 Google 的 PageRank 實現(xiàn)。這些算法使用 Spark Core 的 RDD 方法來建模數(shù)據(jù);GraphFrames 包允許您對數(shù)據(jù)框執(zhí)行圖形操作,包括利用 Catalyst 優(yōu)化器進(jìn)行圖形查詢。
Spark Streaming
Spark Streaming 是 Apache Spark 的一個新增功能,它幫助在需要實時或接近實時處理的環(huán)境中獲得牽引力。以前,Apache Hadoop 世界中的批處理和流處理是不同的東西。您可以為您的批處理需求編寫 MapReduce 代碼,并使用 Apache Storm 等實時流媒體要求。這顯然導(dǎo)致不同的代碼庫需要保持同步的應(yīng)用程序域,盡管是基于完全不同的框架,需要不同的資源,并涉及不同的操作問題,以及運(yùn)行它們。
Spark Streaming 將 Apache Spark 的批處理概念擴(kuò)展為流,將流分解為連續(xù)的一系列微格式,然后使用 Apache Spark API 進(jìn)行操作。通過這種方式,批處理和流操作中的代碼可以共享(大部分)相同的代碼,運(yùn)行在同一個框架上,從而減少開發(fā)人員和操作員的開銷。每個人都能獲益。
對 Spark Streaming 方法的一個批評是,在需要對傳入數(shù)據(jù)進(jìn)行低延遲響應(yīng)的情況下,批量微操作可能無法與 Apache Storm,Apache Flink 和 Apache Apex 等其他支持流的框架的性能相匹配,所有這些都使用純粹的流媒體方法而不是批量微操作。
Structured Streaming
Structured Streaming(在 Spark 2.x 中新增的特性)是針對 Spark Streaming 的,就跟 Spark SQL 之于 Spark 核心 API 一樣:這是一個更高級別的 API,更易于編寫應(yīng)用程序。在使用 Structure Streaming 的情況下,更高級別的 API 本質(zhì)上允許開發(fā)人員創(chuàng)建***流式數(shù)據(jù)幀和數(shù)據(jù)集。它還解決了用戶在早期的框架中遇到的一些非常真實的痛點,尤其是在處理事件時間聚合和延遲傳遞消息方面。對 Structured Streaming 的所有查詢都通過 Catalyst 查詢優(yōu)化器,甚至可以以交互方式運(yùn)行,允許用戶對實時流數(shù)據(jù)執(zhí)行 SQL 查詢。
Structured Streaming 在 Apache Spark 中仍然是一個相當(dāng)新的部分,已經(jīng)在 Spark 2.2 發(fā)行版中被標(biāo)記為產(chǎn)品就緒狀態(tài)。但是,Structure Streaming 是平臺上流式傳輸應(yīng)用程序的未來,因此如果你要構(gòu)建新的流式傳輸應(yīng)用程序,則應(yīng)該使用 Structure Streaming。傳統(tǒng)的 Spark Streaming API 將繼續(xù)得到支持,但項目組建議將其移植到 Structure Streaming 上,因為新方法使得編寫和維護(hù)流式代碼更加容易。
Apache Spark 的下一步是什么?
盡管結(jié)構(gòu)化數(shù)據(jù)流為 Spark Streaming 提供了高級改進(jìn),但它目前依賴于處理數(shù)據(jù)流的相同微量批處理方案。然而, Apache Spark 團(tuán)隊正在努力為平臺帶來連續(xù)的流媒體處理,這應(yīng)該能夠解決許多處理低延遲響應(yīng)的問題(聲稱大約1ms,這將會非常令人印象深刻)。 更好的是,因為結(jié)構(gòu)化流媒體是建立在 Spark SQL 引擎之上的,所以利用這種新的流媒體技術(shù)將不需要更改代碼。
除此之外,Apache Spark 還將通過 Deep Learning Pipelines 增加對深度學(xué)習(xí)的支持。 使用 MLlib 的現(xiàn)有管線結(jié)構(gòu),您將能夠在幾行代碼中構(gòu)建分類器,并將自定義 Tensorflow 圖形或 Keras 模型應(yīng)用于傳入數(shù)據(jù)。 這些圖表和模型甚至可以注冊為自定義的 Spark SQL UDF(用戶定義的函數(shù)),以便深度學(xué)習(xí)模型可以作為 SQL 語句的一部分應(yīng)用于數(shù)據(jù)。
這些功能目前都無法滿足生產(chǎn)的需求,但鑒于我們之前在 Apache Spark 中看到的快速發(fā)展,他們應(yīng)該會在2018年的黃金時段做好準(zhǔn)備。