重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1 前言
成都网站建设公司更懂你!创新互联只做搜索引擎喜欢的网站!成都网站制作前台采用搜索引擎认可的DIV+CSS架构,全站HTML静态,HTML5+CSS3网站,提供:网站建设,微信开发,小程序制作,商城系统网站开发,手机APP定制开发,域名与空间,服务器租售,网站代托管运营,微信公众号代托管运营。以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 :27
scala> val retRDD = linesRDD.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
retRDD: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at :29
缓存RDD
:
scala> retRDD.cache()
res0: retRDD.type = ShuffledRDD[4] at reduceByKey at :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 :27
scala> val retRDD = linesRDD.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
retRDD: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at :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
持久化会有更大的提升。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。