[TOC]html
其實在以前的文章《Spark筆記整理(五):Spark RDD持久化、廣播變量和累加器》中也有相似的測試,不過當時作的測試僅僅是在本地跑代碼,並以Java/Scala
代碼經過設置開始時間和結束時間的方式來進行統計測試,其實不夠準確,最好的方式就是把Spark
應用部署到集羣中,經過觀察Spark UI
的統計信息來獲取時間,這樣會更準備,尤爲是但願觀察RDD
緩存時對性能帶來的提高。sql
爲了更好查看Spark UI
提供的信息,經過操做方便簡單,下面會使用Spark Shell
的方式來作測試,這樣一來,就能夠輕鬆使用Spark Shell
的localhost:8080
來查看應用程序的執行信息。shell
測試是基於大數據計算的經典helloword
案例—wordcount
程序來進行,因此首先應該準備必定量的數據,這裏我準備的數據以下:express
yeyonghao@yeyonghaodeMacBook-Pro:~$ ls -lh wordcount_text.txt -rw-r--r-- 1 yeyonghao staff 127M 10 1 14:24 wordcount_text.txt
數據量不用太大,否則就須要等待很長時間,同時在進行RDD
緩存時,也有可能會出現沒有足夠內容來緩存RDD
的問題;數據量也不要過小,過小的話,時間差異不大,很難觀察出效果。apache
以下:緩存
yeyonghao@yeyonghaodeMacBook-Pro:~$ sudo spark-shell --driver-memory 2G Password: log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Using Spark's repl log4j profile: org/apache/spark/log4j-defaults-repl.properties To adjust logging level use sc.setLogLevel("INFO") Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_\ version 1.6.2 /_/ Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_181) Type in expressions to have them evaluated. Type :help for more information. Spark context available as sc. 18/10/01 14:39:36 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies) 18/10/01 14:39:36 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies) 18/10/01 14:39:38 WARN ObjectStore: Version information not found in metastore. hive.metastore.schema.verification is not enabled so recording the schema version 1.2.0 18/10/01 14:39:38 WARN ObjectStore: Failed to get database default, returning NoSuchObjectException 18/10/01 14:39:39 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies) 18/10/01 14:39:39 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies) SQL context available as sqlContext.
先加載數據,並設置transformation
,以下:app
scala> val linesRDD = sc.textFile("/Users/yeyonghao/wordcount_text.txt") linesRDD: org.apache.spark.rdd.RDD[String] = /Users/yeyonghao/wordcount_text.txt MapPartitionsRDD[1] at textFile at <console>:27 scala> val retRDD = linesRDD.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _) retRDD: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:29
緩存RDD
:ide
scala> retRDD.cache() res0: retRDD.type = ShuffledRDD[4] at reduceByKey at <console>:29
注意上面的操做並不會觸發Spark
的計算操做,只有執行action
算子時纔會觸發,以下:oop
scala> retRDD.count() res1: Long = 1388678
此時打開Spark UI
,觀察執行結果:性能
Jobs
界面:
Stages
界面:
Storage
界面:
分析:顯然能夠看到DAG圖中,reduceByKey中有個綠色的點,說明該RDD已經被顯示地緩存下來,這樣在查看Storage界面時,也能夠看到該緩存的RDD,另外須要說明的是,在執行該次操做中,全部的步驟都是須要執行的,而後產生了retRDD以後纔將其緩存下來,這樣下一次,若是再須要使用到retRDD時,就能夠不用執行前面的操做了,能夠節省不少時間,固然,不能否認地是,在本次操做中,緩存RDD時也是須要使用必定的時間的。
scala> retRDD.count() res1: Long = 1388678
Jobs
界面:
Stages
界面:
Storage
界面:
分析,經過上面的觀察也能夠知道,retRDD前面的操做所有都沒有執行,它是直接利用緩存的RDD來執行後面的action操做,因此時間上有大幅度地提高。
從新打開Spark-shell
,執行下面的操做:
scala> val linesRDD = sc.textFile("/Users/yeyonghao/wordcount_text.txt") linesRDD: org.apache.spark.rdd.RDD[String] = /Users/yeyonghao/wordcount_text.txt MapPartitionsRDD[1] at textFile at <console>:27 scala> val retRDD = linesRDD.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _) retRDD: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:29 scala> retRDD.count() res0: Long = 1388678 scala> retRDD.count() res1: Long = 1388678 scala> retRDD.count() res2: Long = 1388678
Jos
界面:
全部job
的stages
界面:
storage
界面:
再查看後面兩個job
其中一個的詳細stages
界面:
能夠看到這與前面執行RDD
緩存操做以後是同樣的,是由於在linestage
中,最後一個RDD
即使不顯示執行RDD
緩存的操做,那麼它也會保存在內存當中,固然,好比這裏的retRDD
再執行了一次transformation
操做,那麼當執行action
操做以後`retRDD
就不會被緩存下來了,通過迭代式計算以後,它轉化爲下一個RDD
;然而若是是顯式緩存了retRDD
的操做,在storage
界面能夠看到它,無論它後面再執行怎麼樣的操做,retRDD
仍是會存在內存當中,這就是主動緩存RDD
跟非主動緩存RDD
的最大區別。
有不少細節的東西這裏是沒有辦法展現的,這須要進一步去實踐操做,若是能夠,閱讀源碼也是十分不錯的選擇,固然這裏也提供了十分不錯的驗證方式,經過這樣一個操做的過程,相信會比在抽象概念上去理解RDD
持久化會有更大的提高。