什么是Apache Spark?这篇文章带你从零基础学起
導(dǎo)讀:Apache Spark是一個強大的開源處理引擎,最初由Matei Zaharia開發(fā),是他在加州大學(xué)伯克利分校的博士論文的一部分。Spark的第一個版本于2012年發(fā)布。
Apache Spark是快速、易于使用的框架,允許你解決各種復(fù)雜的數(shù)據(jù)問題,無論是半結(jié)構(gòu)化、結(jié)構(gòu)化、流式,或機器學(xué)習(xí)、數(shù)據(jù)科學(xué)。它也已經(jīng)成為大數(shù)據(jù)方面最大的開源社區(qū)之一,擁有來自250多個組織的超過1000個貢獻者,以及遍布全球570多個地方的超過30萬個Spark Meetup社區(qū)成員。
在本文中,我們將提供一個了解Apache Spark的切入點。我們將解釋Spark Job和API背后的概念。
作者:托馬茲·卓巴斯(Tomasz Drabas),丹尼·李(Denny Lee)
如需轉(zhuǎn)載請聯(lián)系大數(shù)據(jù)(ID:hzdashuju)
01 什么是Apache Spark
Apache Spark是一個開源的、強大的分布式查詢和處理引擎。它提供MapReduce的靈活性和可擴展性,但速度明顯更高:當(dāng)數(shù)據(jù)存儲在內(nèi)存中時,它比Apache Hadoop快100倍,訪問磁盤時高達10倍。
Apache Spark允許用戶讀取、轉(zhuǎn)換、聚合數(shù)據(jù),還可以輕松地訓(xùn)練和部署復(fù)雜的統(tǒng)計模型。Java、Scala、Python、R和SQL都可以訪問 Spark API。
Apache Spark可用于構(gòu)建應(yīng)用程序,或?qū)⑵浯虬蔀橐渴鹪诩荷系膸?#xff0c;或通過筆記本(notebook)(例如Jupyter、Spark-Notebook、Databricks notebooks和Apache Zeppelin)交互式執(zhí)行快速的分析。
Apache Spark提供的很多庫會讓那些使用過Python的pandas或R語言的data.frame 或者data.tables的數(shù)據(jù)分析師、數(shù)據(jù)科學(xué)家或研究人員覺得熟悉。非常重要的一點是,雖然Spark DataFrame會讓pandas或data.frame、data.tables用戶感到熟悉,但是仍有一些差異,所以不要期望過高。具有更多SQL使用背景的用戶也可以用該語言來塑造其數(shù)據(jù)。
此外,Apache Spark還提供了幾個已經(jīng)實現(xiàn)并調(diào)優(yōu)過的算法、統(tǒng)計模型和框架:為機器學(xué)習(xí)提供的MLlib和ML,為圖形處理提供的GraphX和GraphFrames,以及Spark Streaming(DStream和Structured)。Spark允許用戶在同一個應(yīng)用程序中隨意地組合使用這些庫。
Apache Spark可以方便地在本地筆記本電腦上運行,而且還可以輕松地在獨立模式下通過YARN或Apache Mesos于本地集群或云中進行部署。它可以從不同的數(shù)據(jù)源讀取和寫入,包括(但不限于)HDFS、Apache Cassandra、Apache HBase和S3:
▲資料來源:Apache Spark is the smartphone of Big Data
http://bit.ly/1QsgaNj
02 Spark作業(yè)和API
在本節(jié)中,我們將簡要介紹Apache Spark作業(yè)(job)和API。
1. 執(zhí)行過程
任何Spark應(yīng)用程序都會分離主節(jié)點上的單個驅(qū)動進程(可以包含多個作業(yè)),然后將執(zhí)行進程(包含多個任務(wù))分配給多個工作節(jié)點,如下圖所示:
驅(qū)動進程會確定任務(wù)進程的數(shù)量和組成,這些任務(wù)進程是根據(jù)為指定作業(yè)生成的圖形分配給執(zhí)行節(jié)點的。注意,任何工作節(jié)點都可以執(zhí)行來自多個不同作業(yè)的多個任務(wù)。
Spark作業(yè)與一系列對象依賴相關(guān)聯(lián),這些依賴關(guān)系是以有向無環(huán)圖(DAG)的方式組織的,例如從Spark UI生成的以下示例?;谶@些,Spark可以優(yōu)化調(diào)度(例如確定所需的任務(wù)和工作節(jié)點的數(shù)量)并執(zhí)行這些任務(wù)。
▲有關(guān)DAG調(diào)度器的更多信息,請參考:
http://bit.ly/29WTiK8
2. 彈性分布式數(shù)據(jù)集
彈性分布式數(shù)據(jù)集(簡稱RDD)是不可變Java虛擬機(JVM)對象的分布式集合,Apache Spark就是圍繞著RDD而構(gòu)建的。我們使用Python時,尤為重要的是要注意Python數(shù)據(jù)是存儲在這些JVM對象中的。
這些對象允許作業(yè)非常快速地執(zhí)行計算。對RDD的計算依據(jù)緩存和存儲在內(nèi)存中的模式進行:與其他傳統(tǒng)分布式框架(如Apache Hadoop)相比,該模式使得計算速度快了一個數(shù)量級。
同時,RDD會給出一些粗粒度的數(shù)據(jù)轉(zhuǎn)換(例如map(...)、reduce(...)和filter(...)),保持Hadoop平臺的靈活性和可擴展性,以執(zhí)行各種各樣的計算。RDD以并行方式應(yīng)用和記錄數(shù)據(jù)轉(zhuǎn)換,從而提高了速度和容錯能力。
通過注冊這些轉(zhuǎn)換,RDD提供數(shù)據(jù)沿襲——以圖形形式給出的每個中間步驟的祖先樹。這實際上保護RDD免于數(shù)據(jù)丟失——如果一個RDD的分區(qū)丟失,它仍然具有足夠的信息來重新創(chuàng)建該分區(qū),而不是簡單地依賴復(fù)制。
更多數(shù)據(jù)沿襲信息參見:
http://ibm.co/2ao9B1t
RDD有兩組并行操作:轉(zhuǎn)換(返回指向新RDD的指針)和動作(在運行計算后向驅(qū)動程序返回值)。
請參閱Spark編程指南,獲取最新的轉(zhuǎn)換和動作列表:
?http://spark.apache.org/docs/latest/programming-guide.html#rdd-operations
某種意義上來說,RDD轉(zhuǎn)換操作是惰性的,因為它們不立即計算其結(jié)果。只有動作執(zhí)行了并且需要將結(jié)果返回給驅(qū)動程序時,才會計算轉(zhuǎn)換。該延遲執(zhí)行會產(chǎn)生更多精細(xì)查詢:針對性能進行優(yōu)化的查詢。
這種優(yōu)化始于Apache Spark的DAGScheduler——面向階段的調(diào)度器,使用如上面截圖中所示的階段進行轉(zhuǎn)換。由于具有單獨的RDD轉(zhuǎn)換和動作,DAGScheduler可以在查詢中執(zhí)行優(yōu)化,包括能夠避免shuffle數(shù)據(jù)(最耗費資源的任務(wù))。
有關(guān)DAGScheduler和優(yōu)化(特別是窄或?qū)捯蕾囮P(guān)系)的更多信息,有一個很好的參考是《Effective Transformations》第5章:
https://smile.amazon.com/High-Performance-Spark-Practices-Optimizing/dp/1491943203
3. DataFrame
DataFrame像RDD一樣,是分布在集群的節(jié)點中的不可變的數(shù)據(jù)集合。然而,與RDD不同的是,在DataFrame中,數(shù)據(jù)是以命名列的方式組織的。
如果你熟悉Python的pandas或者R的data.frames,這是一個類似的概念。
DataFrame旨在使大型數(shù)據(jù)集的處理更加容易。它們允許開發(fā)人員對數(shù)據(jù)結(jié)構(gòu)進行形式化,允許更高級的抽象。在這個意義上來說,DataFrame與關(guān)系數(shù)據(jù)庫中的表類似。DataFrame提供了一個特定領(lǐng)域的語言API來操作分布式數(shù)據(jù),使Spark可以被更廣泛的受眾使用,而不只是專門的數(shù)據(jù)工程師。
DataFrame的一個主要優(yōu)點是,Spark引擎一開始就構(gòu)建了一個邏輯執(zhí)行計劃,而且執(zhí)行生成的代碼是基于成本優(yōu)化程序確定的物理計劃。與Java或者Scala相比,Python中的RDD是非常慢的,而DataFrame的引入則使性能在各種語言中都保持穩(wěn)定。
4. Catalyst優(yōu)化器
Spark SQL是Apache Spark最具技術(shù)性的組件之一,因為它支持SQL查詢和DataFrame API。Spark SQL的核心是Catalyst優(yōu)化器。優(yōu)化器基于函數(shù)式編程結(jié)構(gòu),并且旨在實現(xiàn)兩個目的:簡化向Spark SQL添加新的優(yōu)化技術(shù)和特性的條件,并允許外部開發(fā)人員擴展優(yōu)化器(例如,添加數(shù)據(jù)源特定規(guī)則,支持新的數(shù)據(jù)類型等等):
詳細(xì)信息,請查看Deep Dive into Spark SQL’s Catalyst Optimizer :
http://bit.ly/271I7Dk
和Apache Spark DataFrames:?
Simple and Fast Analysis of Structured Data?
http://bit.ly/29QbcOV
6. 鎢絲計劃
Tungsten(鎢絲)是Apache Spark執(zhí)行引擎項目的代號。該項目的重點是改進Spark算法,使它們更有效地使用內(nèi)存和CPU,使現(xiàn)代硬件的性能發(fā)揮到極致。
該項目的工作重點包括:
顯式管理內(nèi)存,以消除JVM對象模型和垃圾回收的開銷。
設(shè)計利用內(nèi)存層次結(jié)構(gòu)的算法和數(shù)據(jù)結(jié)構(gòu)。
在運行時生成代碼,以便應(yīng)用程序可以利用現(xiàn)代編譯器并優(yōu)化CPU。
消除虛擬函數(shù)調(diào)度,以減少多個CPU調(diào)用。
利用初級編程(例如,將即時數(shù)據(jù)加載到CPU寄存器),以加速內(nèi)存訪問并優(yōu)化Spark的引擎,以有效地編譯和執(zhí)行簡單循環(huán)。
更多詳細(xì)信息,請參考Project Tungsten:?
Bringing Apache Spark Closer to Bare Metal?
https://databricks.com/blog/2015/04/28/project-tungstenbringing-spark-closer-to-bare-metal.html
Deep Dive into Project Tungsten: Bringing Spark Closer to Bare Metal [SSE 2015 Video and Slides
https://spark-summit.org/2015/events/deep-dive-into-project-tungsten-bringing-spark-closerto-bare-metal/
Apache Spark as a Compiler: Joining a Billion Rows per Second on a Laptop?
https://databricks.com/blog/2016/05/23/apache-sparkas-a-compiler-joining-a-billion-rows-per-second-on-alaptop.html
本文摘編自《PySpark實戰(zhàn)指南:利用Python和Spark構(gòu)建數(shù)據(jù)密集型應(yīng)用并規(guī)?;渴?span style="letter-spacing:.544px;">》,經(jīng)出版方授權(quán)發(fā)布。
延伸閱讀《PySpark實戰(zhàn)指南》
點擊上圖了解及購買
轉(zhuǎn)載請聯(lián)系微信:DoctorData
推薦語:Pyspark的實用參考指南,深度挖掘Python+Spark的強大功能。?
長按識別下方小程序碼
發(fā)現(xiàn)更多好書
據(jù)統(tǒng)計,99%的大咖都完成了這個神操作
▼
更多精彩
在公眾號后臺對話框輸入以下關(guān)鍵詞
查看更多優(yōu)質(zhì)內(nèi)容!
PPT?|?報告?|?讀書?|?書單?|?干貨?
大數(shù)據(jù)?|?揭秘?|?Python?|?可視化
人工智能?|?機器學(xué)習(xí)?|?深度學(xué)習(xí)?|?神經(jīng)網(wǎng)絡(luò)
AI?|?1024?|?段子?|?區(qū)塊鏈?|?數(shù)學(xué)
猜你想看
如果數(shù)據(jù)有質(zhì)量,地球?qū)⒊珊诙?#xff1f;
干貨:一文看懂網(wǎng)絡(luò)爬蟲實現(xiàn)原理與技術(shù)(值得收藏)
一文了解人臉識別:從實現(xiàn)方法到應(yīng)用場景都講明白了
8本前沿技術(shù)書,助力這屆「青年人」將科幻變成現(xiàn)實
Q:?關(guān)于Spark,你還想了解哪方面內(nèi)容?
歡迎留言與大家分享
覺得不錯,請把這篇文章分享給你的朋友
轉(zhuǎn)載 / 投稿請聯(lián)系:baiyu@hzbook.com
更多精彩,請在后臺點擊“歷史文章”查看
點擊閱讀原文,了解更多
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的什么是Apache Spark?这篇文章带你从零基础学起的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 盘点 Greenplum 数据库的十大特
- 下一篇: NLP将迎来黄金十年,7个案例带你入门(