Apache Spark 2.0正式版發(fā)布下載
以下為Databricks官網(wǎng)的發(fā)布新聞稿翻譯:
我們很榮幸地宣布,自7月26日起Databricks開始提供Apache Spark 2.0的下載,這個(gè)版本是基于社區(qū)在過去兩年的經(jīng)驗(yàn)總結(jié)而成,不但加入了用戶喜愛的功能,也修復(fù)了之前的痛點(diǎn)。
本文總結(jié)了Spark 2.0的三大主題:更簡(jiǎn)單、更快速、更智能,另有Spark 2.0內(nèi)容的文章匯總介紹了更多細(xì)節(jié)。
兩個(gè)月前,Databricks發(fā)布了Apache Spark 2.0的技術(shù)預(yù)覽版,如下表所見,目前我們有10%的集群都在使用這個(gè)版本,根據(jù)客戶使用新版的經(jīng)驗(yàn)及反饋意見,新版得以發(fā)布,Databricks很開心能成為Spark 2.0的首個(gè)商業(yè)供應(yīng)商。
隨著時(shí)間推移,各版本Apache Spark的使用率
現(xiàn)在,我們來深入了解一下Apache Spark 2.0的新特性。
更簡(jiǎn)單:ANSI SQL與更合理的API
Spark讓我們引以為豪的一點(diǎn)就是所創(chuàng)建的API簡(jiǎn)單、直觀、便于使用,Spark 2.0延續(xù)了這一傳統(tǒng),并在兩個(gè)方面凸顯了優(yōu)勢(shì):
標(biāo)準(zhǔn)的SQL支持;
數(shù)據(jù)框(DataFrame)/Dataset (數(shù)據(jù)集)API的統(tǒng)一。
在SQL方面,我們已經(jīng)對(duì)Spark的SQL功能做了重大拓展,引入了新的ANSI SQL解析器,并支持子查詢功能。Spark 2.0可以運(yùn)行所有99個(gè)TPC-DS查詢(需求SQL:2003中的很多功能支持)。由于SQL是Spark應(yīng)用所使用的主要接口之一,對(duì)SQL功能的拓展大幅削減了將遺留應(yīng)用移植到Spark時(shí)所需的工作。
在編程API方面,我們合理化了API:
1、在Scala/Java中統(tǒng)一了DataFrames與Dataset:從Spark 2.0開始,DataFrames只是行(row)數(shù)據(jù)集的typealias了。無論是映射、篩選、groupByKey之類的類型方法,還是select、groupBy之類的無類型方法都可用于Dataset的類。此外,這個(gè)新加入的Dataset接口是用作Structured Streaming的抽象,由于Python和R語言中編譯時(shí)類型安全(compile-time type-safety)不屬于語言特性,數(shù)據(jù)集的概念無法應(yīng)用于這些語言API中。而DataFrame仍是主要的編程抽象,在這些語言中類似于單節(jié)點(diǎn)DataFrames的概念,想要了解這些API的相關(guān)信息,請(qǐng)參見相關(guān)筆記和文章。
2、SparkSession:這是一個(gè)新入口,取代了原本的SQLContext與HiveContext。對(duì)于DataFrame API的用戶來說,Spark常見的混亂源頭來自于使用哪個(gè)“context”?,F(xiàn)在你可以使用SparkSession了,它作為單個(gè)入口可以兼容兩者,點(diǎn)擊這里來查看演示。注意原本的SQLContext與HiveContext仍然保留,以支持向下兼容。
3、更簡(jiǎn)單、性能更佳的Accumulator API:我們?cè)O(shè)計(jì)了一個(gè)新的Accumulator API,不但在類型層次上更簡(jiǎn)潔,同時(shí)還專門支持基本類型。原本的Accumulator API已不再使用,但為了向下兼容仍然保留。
4、基于DataFrame的機(jī)器學(xué)習(xí)API將作為主ML API出現(xiàn):在Spark 2.0中,spark.ml包及其“管道”API會(huì)作為機(jī)器學(xué)習(xí)的主要API出現(xiàn),盡管原本的spark.mllib包仍然保留,但以后的開發(fā)重點(diǎn)會(huì)集中在基于DataFrame的API上。
5、機(jī)器學(xué)習(xí)管道持久化:現(xiàn)在用戶可以保留與載入機(jī)器學(xué)習(xí)的管道與模型了,Spark對(duì)所有語言提供支持。查看這篇博文以了解更多細(xì)節(jié),這篇筆記中也有相關(guān)樣例。
6、R語言的分布式算法:增加對(duì)廣義線性模型(GLM)、樸素貝葉斯算法(NB算法)、存活回歸分析(Survival Regression)與聚類算法(K-Means)的支持。
速度更快:用Spark作為編譯器
根據(jù)我們2015年對(duì)Spark的調(diào)查,91%的用戶認(rèn)為對(duì)Spark來說,性能是最為重要的。因此,性能優(yōu)化一直是我們?cè)陂_發(fā)Spark時(shí)所考慮的重點(diǎn)。在開始Spark 2.0的規(guī)劃前,我們思考過這個(gè)問題:Spark的速度已經(jīng)很快了,但能否突破極限,讓Spark達(dá)到原本速度的10倍呢?
帶著這個(gè)問題,我們切實(shí)考慮了在構(gòu)建Spark物理執(zhí)行層面時(shí)的方式。如果深入調(diào)查現(xiàn)代的數(shù)據(jù)引擎,比如Spark或者其他MPP數(shù)據(jù)庫,我們會(huì)發(fā)現(xiàn):CPU循環(huán)大多都做了無用功,比如執(zhí)行虛擬函數(shù)調(diào)用,或者向CPU緩存或內(nèi)存讀取/寫入中間數(shù)據(jù);通過減少CPU循環(huán)中的浪費(fèi)來優(yōu)化性能,一直是我們?cè)诂F(xiàn)代編譯器上長(zhǎng)時(shí)間以來的工作重點(diǎn)。
Spark 2.0搭載了第二代Tungsten引擎,該引擎是根據(jù)現(xiàn)代編譯器與MPP數(shù)據(jù)庫的理念來構(gòu)建的,它將這些理念用于數(shù)據(jù)處理中,其主要思想就是在運(yùn)行時(shí)使用優(yōu)化后的字節(jié)碼,將整體查詢合成為單個(gè)函數(shù),不再使用虛擬函數(shù)調(diào)用,而是利用CPU來注冊(cè)中間數(shù)據(jù)。我們將這一技術(shù)稱為“whole-stage code generation”。
在測(cè)試、對(duì)比Spark 1.6與Spark 2.0時(shí),我們列出了在單核中處理單行數(shù)據(jù)所花費(fèi)的時(shí)間(以十億分之一秒為單位),下面的表格列出了Spark 2.0的優(yōu)化內(nèi)容。Spark 1.6包含代碼生成技術(shù)(code generation)的使用,這一技術(shù)如今在一些頂尖的商業(yè)數(shù)據(jù)庫中也有運(yùn)用,正如我們看到的那樣,使用了新whole-stage code generation技術(shù)后,速度比之前快了一個(gè)數(shù)量級(jí)。
在這篇筆記中可以查看其運(yùn)用:我們?cè)趩闻_(tái)機(jī)器上對(duì)10億記錄執(zhí)行了aggregations和joins操作。
每行耗費(fèi)(單線程)
這個(gè)新的引擎在執(zhí)行端對(duì)端查詢時(shí)是如何運(yùn)作的?我們使用TPC-DS查詢做了些初步分析,以對(duì)比Spark 1.6與Spark 2.0:
除此之外,為了改進(jìn)Catalyst optimizer優(yōu)化器對(duì)諸如nullability propagation之類常見查詢的效果,我們還做了許多工作;另外還改進(jìn)了矢量化Parquet解碼器,新解碼器的吞吐量增加了三倍。點(diǎn)擊這里查看Spark 2.0優(yōu)化的更多細(xì)節(jié)。
更智能:Structured Streaming
作為首個(gè)嘗試統(tǒng)一批處理與流處理計(jì)算的工具,Spark Streaming一直是大數(shù)據(jù)處理的領(lǐng)導(dǎo)者。首個(gè)流處理API叫做DStream,在Spark 0.7中初次引入,它為開發(fā)者提供了一些強(qiáng)大的特性,包括:只有一次語義,大規(guī)模容錯(cuò),以及高吞吐。
然而,在處理了數(shù)百個(gè)真實(shí)世界的Spark Streaming部署之后,我們發(fā)現(xiàn)需要在真實(shí)世界做決策的應(yīng)用經(jīng)常需要不止一個(gè)流處理引擎。他們需要深度整合批處理堆棧與流處理堆棧,整合內(nèi)部存儲(chǔ)系統(tǒng),并且要有處理業(yè)務(wù)邏輯變更的能力。因此,各大公司需要不止一個(gè)流處理引擎,并且需要能讓他們開發(fā)端對(duì)端“持續(xù)化應(yīng)用”的全棧系統(tǒng)。
Spark 2.0使用一個(gè)新的API:Structured Streaming模塊來處理這些用例,與現(xiàn)有流系統(tǒng)相比,Structured Streaming有三個(gè)主要的改進(jìn):
與批處理作業(yè)集成的API:想要運(yùn)行流數(shù)據(jù)計(jì)算,開發(fā)者可針對(duì)DataFrame/Dataset API編寫批處理計(jì)算,過程非常簡(jiǎn)單,而Spark會(huì)自動(dòng)在流數(shù)據(jù)模式中執(zhí)行計(jì)算,也就是說在數(shù)據(jù)輸入時(shí)實(shí)時(shí)更新結(jié)果。強(qiáng)大的設(shè)計(jì)令開發(fā)者無需費(fèi)心管理狀態(tài)與故障,也無需確保應(yīng)用與批處理作業(yè)的同步,這些都由系統(tǒng)自動(dòng)解決。此外,針對(duì)相同的數(shù)據(jù),批處理任務(wù)總能給出相同的結(jié)果。
與存儲(chǔ)系統(tǒng)的事務(wù)交互: Structured Streaming會(huì)在整個(gè)引擎及存儲(chǔ)系統(tǒng)中處理容錯(cuò)與持久化的問題,使得程序員得以很容易地編寫應(yīng)用,令實(shí)時(shí)更新的數(shù)據(jù)庫可靠地提供、加入靜態(tài)數(shù)據(jù)或者移動(dòng)數(shù)據(jù)。
與Spark的其它組件的深入集成: Structured Streaming支持通過Spark SQL進(jìn)行流數(shù)據(jù)的互動(dòng)查詢,可以添加靜態(tài)數(shù)據(jù)以及很多已經(jīng)使用DataFrames的庫,還能讓開發(fā)者得以構(gòu)建完整的應(yīng)用,而不只是數(shù)據(jù)流管道。未來,我們希望能有更多與MLlib及其它libraries的集成出現(xiàn)。
Spark 2.0搭載了初始alpha版的Strutured Streaming API,這是一個(gè)附在DataFrame/Dataset API上的(超小)擴(kuò)展包。統(tǒng)一之后,對(duì)現(xiàn)有的Spark用戶來說使用起來非常簡(jiǎn)單,他們能夠利用在Spark 批處理API方面的知識(shí)來回答實(shí)時(shí)的新問題。這里關(guān)鍵的功能包括:支持基于事件時(shí)間的處理,無序/延遲數(shù)據(jù),sessionization以及非流式數(shù)據(jù)源與Sink的緊密集成。
我們還更新了Databricks workspace以支持Structured Streaming。例如,在啟動(dòng)streaming查詢時(shí),notebook UI會(huì)自動(dòng)顯示其狀態(tài)。
Streaming很明顯是一個(gè)非常廣泛的話題,因此想要了解Spark 2.0中Structured Streaming的更多信息,請(qǐng)關(guān)注本網(wǎng)站。
結(jié)論
Spark的用戶最初使用Spark是因?yàn)樗囊子眯耘c高性能。Spark 2.0在這些方面達(dá)到了之前的兩倍,并增加了對(duì)多種工作負(fù)載的支持,請(qǐng)嘗試一下新版本吧。
更多大數(shù)據(jù)與分析相關(guān)行業(yè)資訊、解決方案、案例、教程等請(qǐng)點(diǎn)擊查看>>>
詳情請(qǐng)咨詢在線客服!
客服熱線:023-66090381