[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
持久化会有更大的提高。