spark2.0的10個特性介紹


1. Spark 2.0 !

 

還記得我們的第七篇 Spark 博文里嗎?里面我用三點來總結 spark dataframe 的好處:

 

當時是主要介紹 spark 里的 dataframe,今天是想總結一下 spark 2.0 的一些重大更新,准備過段時間[等到 2.0.1 或者 2.1 出來了就]切換到 spark 2.x 來。當我看官方的一些介紹和一些相關文章的時候,我發現 spark 2.0 的特點,也可以用第七篇里總結的 dataframe 的特點來說明,那就是:

 

write less : 寫更少的代碼

do more : 做更多的事情

faster : 以更快的速度

真心覺得 spark 做得很不錯,databricks 做得太贊了,現在 databricks 的社區版 [DCE : Databricks Community Edition] 也開放注冊了,大家還沒有注冊的趕緊去體驗這個產品吧,so amazing,注冊鏈接:community.cloud.databricks.com。

 

言歸正傳,下面從幾個亮點來總結一下 spark 2.0 的更新,基本上都是看官方文檔,相關的 video,slide 和一些技術博文來的,參考的文章都會在后文列出來的。

 

2. Spark 版本號說明

 

如圖是 spark 版本號的三個不同數字的介紹,以 1.6.0 版本舉例:

 

1 : major version : 代表大版本更新,一般都會有一些 api 的變化,以及大的優化或是一些結構的改變;

6 : minor version : 代表小版本更新,一般會新加 api,或者是對當前的 api 就行優化,或者是其他內容的更新,比如說 WEB UI 的更新等等;

0 : patch version : 代表修復當前小版本存在的一些 bug,基本不會有任何 api 的改變和功能更新;記得有一個大神曾經說過,如果要切換 spark 版本的話,最好選 patch version 非 0 的版本,因為一般類似於 1.2.0, … 1.6.0 這樣的版本是屬於大更新的,有可能會有一些隱藏的 bug 或是不穩定性存在,所以最好選擇 1.2.1, … 1.6.1 這樣的版本。

 

3. 特性 1 - 官方文檔

 

spark 2.0 似乎對官方文檔做了比較大的改變,贊,這里是 2.0 預覽版的文檔鏈接,等不及的小伙伴們可以先看了:

 

2.0.0-preview

master-docs 

2.0.0 docs

 

4. 特性 2 - 支持標准 SQL 語句

 

On the SQL side, we have significantly expanded the SQL capabilities of Spark, with the introduction of a new ANSI SQL parser and support for subqueries. Spark 2.0 can run all the 99 TPC-DS queries, which require many of the SQL:2003 features.

 

上面提到的 TPC-DS 這個概念沒有必要去了解了,我是 google 了之后才知道的,如果感興趣的話可以看這個鏈接:TPC-DS。

 

總結下來:

 

  • Spark 2.0 中, SQL:2003 語法全部支持了,下面是 sql 語法的發展歷程,可以說,雖然 sql 2003 之后又更新了兩個版本的語法,但在實際使用情況中,sql 2003 已經完全能 handle 99% 的場景了。

    • 1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86 

    • 1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89 

    • 1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2) 

    • 1999年,ISO/IEC 9075:1999,SQL:1999(SQL3) 

    • 2003年,ISO/IEC 9075:2003,SQL:2003 

    • 2008年,ISO/IEC 9075:2008,SQL:2008 

    • 2011年,ISO/IEC 9075:2011,SQL:2011

  • Spark 2.0 中,更新了新的 SQL 解析器,可以支持子查詢了,特地重復一下,因為基本上所有復雜的 sql 語句都會用到子查詢,官方有例子: Subqueries in Apache Spark 2.0

 

5. 特性 3 - 統一 DataFrames and Datasets API

 

在 spark 2.0 中,把 dataframes 當作是一種特殊的 datasets,dataframes = datasets[row],把兩者統一為 datasets。但是需要注意的是,目前只更新了 scala 和 java 的api,python中尚未更新。而且 spark 2.0 中引入了 structured streaming 的概念,需要 dataframe 的支持,其中的 dataframe 也已經用 datasets[row] 來實現了。

 

官方的關於 DataSets API 的使用說明:Dataset API

 

6. 特性 4 - SparkSession

 

在 spark 2.0 之前,sparkContext 是 Spark應用的入口。除了 sparkContext,還有 sqlContext,StreamingContext,HiveContext 等其他入口。然而到了 spark 2.0 后,因為逐漸要采用 DataFrame 和 DataSets 作為 API 使用,需要一個統一的入口點,所以就誕生了 SparkSession。本質上,可以簡單的把 SparkSession 理解成 sparkContext, sqlContext, StreamingContext, HiveContext 的統一封裝。

 

下面是一個來自官方的 demo:

 

import org.apache.spark.sql.SparkSession

val sparkSession = SparkSession.builder

  .master("local")

  .appName("my-spark-app")

  .config("spark.some.config.option", "config-value")

  .getOrCreate()

 

值得注意的一個點是,在 2.0 之前,啟動 spark repl 時,會自動給你創建一個 sparkContext,叫做 sc,但在 2.0 之后,啟動 spark repl 時會自動給你創建一個 SparkSession,叫做 spark。

 

這里有一個 databricks 出的關於 SparkSession 的說明文檔和使用方法:SparkSession - a new entry point

 

7. 特性 5 - 新的 Accumulator API

 

spark 2.0 設計了新的 Accumulator API,用戶可以基於默認的 Accumulator 實現自己定義的 Accumulator,當然老的 Accumulator 還是保留使用的。

 

下面是一個用戶自定義 Accumulator 的例子:

 

class VectorAccumulatorParam(AccumulatorParam):

    def zero(self, initialValue):

        return Vector.zeros(initialValue.size)

    def addInPlace(self, v1, v2):

        v1 += v2

        return v1

# Then, create an Accumulator of this type:

vecAccum = sc.accumulator(Vector(...), VectorAccumulatorParam())

 

而且 spark 2.0 里可以在 web ui 里查看 Accumulator 的數據了,非常方便[注明一下,這里我沒有嘗試過在 2.0 之前是否可以在 web ui 里查看 Accumulator 的數據,如果有寫錯了請大家指出哈,謝謝]

 

8. 特性 6 - DataFrame Based Machine Learning

 

在上篇文章里 『 Spark 』11. spark 機器學習,我們也提到過,從 2.0 開始,spark machine learning 開始采用基於 dataframe 開發的 ml package,基於 RDD API 的 mllib 將不再開發新 feature,只做維護。

 

9. 特性 7 - Machine learning pipeline persistence

 

spark 2.0 支持機器學習持久化了,雖然 2.0 之前也有類似的功能,但在這方面,2.0 有兩大亮點:

 

  • 不僅可以 save & load 模型,還可以 save & load 模型的 pipeline;

  • 可以跨語言 save & load 模型,比如說你用 scala 實現了一個模型,並且 save 到磁盤上,之后可以用 python 來 load 這個模型;

 

這里有官方出的一個介紹文檔和使用說明:Saving & loading Machine Learning (ML) models

 

10. 特性 8 - Distributed algorithms in R

 

也可以用 R 來實現一些機器學習算法了: Generalized Linear Models (GLM), Naive Bayes, Survival Regression, and K-Means.

 

11. 特性 9 - Whole-stage code generation

 

spark 2.0 性能上會有較大的提升,根據官方文檔,2.0 會引入新的物理執行引擎 new Tungsten execution engine,相對於之前的執行引擎[之前也有 code generation],新的物理執行引擎會充分利用 內存,cpu,cpu 寄存器 三者,最大化的提升代碼執行速度。

 

關於 new Tungsten execution engine 的原理,可以參考這篇官方博客:Apache Spark as a Compiler: Joining a Billion Rows per Second on a Laptop : Deep dive into the new Tungsten execution engine

 

這里有官方做的一個簡單的測試:Performance of Spark 2.0’s Tungsten engine

 

下圖是一個簡要的性能對比截圖:

 

12. 特性 10 - Structured Streaming

 

這個就不用說了,是 2.0 的三大更新之一。官方的這句話很有意思: the simplest way to compute answers on streams of data is to not having to reason about the fact that it is a stream.,中文翻譯來說就是說:處理流式計算最簡單的方法,就是不要特地去區分流式計算與非流式計算的區別[因為歸根結底,他們都是數據,我們要區分的,並不是數據本身,而是我們處理數據的方式]

 

在 rxin 的這個 slide 里,Apache Spark 2.0: Faster, Easier, and Smarter,第 17 ~ 26 也專門有說 2.0 里的 structure streaming,非常值得借鑒。

 

下面是其中兩張需要理解的 ppt 截圖:

 

本文來自:http://mp.weixin.qq.com/s/g5oZ8m-Ac-ExAmIcIGG1Yg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM