您好,登錄后才能下訂單哦!
1 前言
以Java/Scala
代碼通過設置開始時間和結束時間的方式來進行統計測試,其實不夠準確,最好的方式就是把Spark
應用部署到集群中,通過觀察Spark UI
的統計信息來獲取時間,這樣會更準備,尤其是希望觀察RDD
緩存時對性能帶來的提升。
為了更好查看Spark UI
提供的信息,通過操作方便簡單,下面會使用Spark Shell
的方式來做測試,這樣一來,就可以輕松使用Spark Shell
的localhost:8080
來查看應用程序的執行信息。
測試是基于大數據計算的經典helloword
案例—wordcount
程序來進行,所以首先應該準備一定量的數據,這里我準備的數據如下:
yeyonghao@yeyonghaodeMacBook-Pro:~$ ls -lh wordcount_text.txt
-rw-r--r-- 1 yeyonghao staff 127M 10 1 14:24 wordcount_text.txt
數據量不用太大,不然就需要等待很長時間,同時在進行RDD
緩存時,也有可能會出現沒有足夠內容來緩存RDD
的問題;數據量也不要太小,太小的話,時間差別不大,很難觀察出效果。
如下:
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
,如下:
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
:
scala> retRDD.cache()
res0: retRDD.type = ShuffledRDD[4] at reduceByKey at <console>:29
注意上面的操作并不會觸發Spark
的計算操作,只有執行action
算子時才會觸發,如下:
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
持久化會有更大的提升。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。