Spark 1.4新特性概述
經過4個RC版本,Spark 1.4最終還是趕在Spark Summit前發布了,本文簡單談下本版本中那些非常重要的新feature和improvement.
正式引入SparkR
Spark 1.4正式引入了SparkR(可以參見本博客的《Spark官方正式宣布支持SparkR(R on Spark)》介紹),它是一個R API,SparkR是基于Spark的DataFrame抽象。用戶可以通過local R data frames或者來自Spark各種外部數據源(比如Hie表)來創建SparkR DataFrame,SparkR DataFrame支持所有Spark DataFrame所支持的操作,包括聚合、過濾、分組、匯總統計以及其他的分析函數。同時它也支持混入SQL查詢,而且支持將查詢結果保存成DataFrame或者從DataFrame中獲取數據。因為SparkR使用的是Spark的并行計算引擎,所以它的操作將可以使用多個Core和機器,而且可以在集群中分析大規模的數據,來看下下面的例子:
| 01 | people <-?read.df(sqlContext,?"./examples/src/main/resources/people.json",?"json") |
| 02 | head(people) |
| 03 | ##? age??? name |
| 04 | ##1? NA Michael |
| 05 | ##2? 30??? Andy |
| 06 | ##3? 19? Justin |
| 07 | ? |
| 08 | # SparkR automatically infers the schema from the JSON file |
| 09 | printSchema(people) |
| 10 | # root |
| 11 | #? |-- age: integer (nullable = true) |
| 12 | #? |-- name: string (nullable = true) |
關于SparkR的編程指南,可以看這里《SparkR(R on Spark)編程指南》。
Spark Core:
現在大家最關心什么?性能和運維呀! 什么最影響性能?必須shuffle呀!什么是運維第一要務?必須是監控呀(就先不扯alert了)!1.4在這兩點都做足了功夫。 1.4中,Spark為應用提供了REST API來獲取各種信息(jobs / stages / tasks / storage info),使用這個API搭建個自己的監控簡直是分分鐘的事情,不止于此,DAG現在也能可視化了,不清楚Spark的DAGScheduler怎么運作的同學,現在也能非常輕易地知道DAG細節了。再來說說shuffle, 大家都知道,從1.2開始sort-based shuffle已經成為默認的shuffe策略了,基于sort的shuffle不需要同時打開很多文件,并且也能減少中間文件的生成,但是帶來的問題是在JVM的heap中留了大量的java對象,1.4開始,shuffle的map階段的輸出會被序列化,這會帶來兩個好處:1、spill到磁盤上的文件變小了 2、GC效率大增 ,有人又會說,序列化反序列化會產生額外的cpu開銷啊,事實上,shuffle過程往往都是IO密集型的操作,帶來的這點cpu開銷,是可以接受。
大家期待的鎢絲計劃(Project Tungsten)也在1.4初露鋒芒,引入了新的shuffle manager “UnsafeShuffleManager”, 來提供緩存友好的排序算法,及其它一些改進,目的是降低shuffle過程中的內存使用量,并且加速排序過程。 鎢絲計劃必定會成為接下來兩個版本(1.5,1.6)重點關注的地方。
Spark Streaming:
Streaming在這個版本中增加了新的UI, 簡直是Streaming用戶的福音啊,各種詳細信息盡收眼底。話說Spark中國峰會,TD當時坐我旁邊review這部分的code,悄悄對說我”this is awesome”。對了,這部分主要是由朱詩雄做的,雖然詩雄在峰會上放了我鴿子,但必須感謝他給我們帶來了這么好的特性!另外此版本也支持了0.8.2.x的Kafka版本。
窗口函數和DataFrame的其他提升
Spark SQL(DataFrame)
支持老牌的ORCFile了,雖然比Parquet年輕,但是人家bug少啊 : ) 1.4提供了類似于Hive中的window function,還是比較實用的。本次對于join的優化還是比較給力的,特別是針對那種比較大的join,大家可以體會下。JDBC Server的用戶肯定非常開心了,因為終于有UI可以看了呀。
| 1 | val?w?=?Window.partitionBy("name").orderBy("id") |
| 2 | df.select( |
| 3 | ??sum("price").over(w.rangeBetween(Long.MinValue,?2)), |
| 4 | ??avg("price").over(w.rowsBetween(0,?4)) |
| 5 | ) |
除此之外,社區為DataFrame帶來了大量的提升,包括支持豐富的統計和數學函數(看這里《Spark1.4中DataFrame功能加強,新增科學和數學函數》)。
Spark ML/MLlib
ML pipelines從alpha畢業了,大家對于ML pipelines的熱情還真的蠻高的啊。我對Personalized PageRank with GraphX倒是蠻感興趣的,與之相關的是recommendAll in matrix factorization model。 事實上大多數公司還是會在Spark上實現自己的算法。
可視化和監控工具
生成環境下的Spark程序一般都很復雜,而且包含了很多的stages,Spark 1.4.0加入了可視化和監控工具,使得我們在spark作業運行的時候理解Spark的運行,這些都是非常棒的功能!
RestAPI
在Spark?1.4中引入了REST API,這樣我們可以像Hadoop中REST API一樣,很方便地獲取一些信息。這個ISSUE在https://issues.apache.org/jira/browse/SPARK-3644里面首先被提出,已經在Spark?1.4加入。
Spark的REST API返回的信息是JSON格式的,開發者們可以很方便地通過這個API來創建可視化的Spark監控工具。目前這個API支持正在運行的應用程序,也支持歷史服務器。在請求URL都有/api/v1。比如,對于歷史服務器來說,我們可以通過http://:18080/api/v1來獲取一些信息;對于正在運行的Spark應用程序,我們可以通過http://localhost:4040/api/v1來獲取一些信息。
下面是目前Spark支持的所有REST API:
/applications:這個將顯示所有的應用程序; /applications/[app-id]/jobs:獲取給定應用程序的所有Jobs; /applications/[app-id]/jobs/[job-id]:獲取給定Job的信息 /applications/[app-id]/stages:獲取給定應用程序的所有stages; /applications/[app-id]/stages/[stage-id]:獲取給定stages的所有attempts ; /applications/[app-id]/stages/[stage-id]/[stage-attempt-id]:獲取給定stages attempts 的信息 /applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskSummary:獲取給定stage attempt中所有tasks的metrics信息 /applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskList:獲取給定stage attempt的所有tasks; /applications/[app-id]/executors:獲取給定應用程序的所有executors; /applications/[app-id]/storage/rdd:獲取給定應用程序的所有緩存的RDDs ; /applications/[app-id]/storage/rdd/[rdd-id]:獲取給定RDD的存儲狀態詳情。 當應用程序運行在YARN模式,每個應用程序將有多個attempts,所以我們需要將上面所有[app-id]改成[app-id]/[attempt-id]。上面所有的URL都是有版本的,這樣將使得開發者們很容易在上面開發應用程序。此外,Spark還提供以下保證:
1、任何一個版本的Endpoints都不會被移除;
2、單個字段將永遠不會從任何的Endpoints中移除;
3、新的Endpoints可能被加入;
4、新的字段可能會被加入到某個Endpoints中;
5、新的版本可能會在未來加入到單獨的Endpoint中(比如api/v2),而且新版本不要求向后兼容;
6、API的版本可能會被刪除,但至少存在一個新的API版本。
需要注意的是,即使是想檢查正在運行的應用程序UI是,我們也需要加入applications/[app-id]部分,即使是存在一個應用程序。比如如果你想獲取所有正在運行的應用程序的作業列表,你可以通過http://localhost:4040/api/v1/applications/[app-id]/jobs獲取,這樣做是為了在兩種模式中保存一致的路徑。查看:http://www.iteblog.com/archives/1386
總結
以上是生活随笔為你收集整理的Spark 1.4新特性概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark 1.3 新特性 :176个贡
- 下一篇: Apache Spark 1.5新特性介