Spark笔记整理(十三):RDD持久化性能测试(图文并茂)
2018-10-01 15:47
302 查看
[TOC]
1 前言
其实在之前的文章《Spark笔记整理(五):Spark RDD持久化、广播变量和累加器》中也有类似的测试,不过当时做的测试仅仅是在本地跑代码,并以
Java/Scala代码通过设置开始时间和结束时间的方式来进行统计测试,其实不够准确,最好的方式就是把
Spark应用部署到集群中,通过观察
Spark UI的统计信息来获取时间,这样会更准备,尤其是希望观察
RDD缓存时对性能带来的提升。
为了更好查看
Spark UI提供的信息,通过操作方便简单,下面会使用
Spark Shell的方式来做测试,这样一来,就可以轻松使用
Spark Shell的
localhost:8080来查看应用程序的执行信息。
2 数据准备
测试是基于大数据计算的经典
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的问题;数据量也不要太小,太小的话,时间差别不大,很难观察出效果。
3 测试
3.1 启动Spark Shell
如下:
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.
3.2 加载文本数据并缓存RDD
先加载数据,并设置
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
3.3 初次触发action操作并观察结果
注意上面的操作并不会触发
Spark的计算操作,只有执行
action算子时才会触发,如下:
scala> retRDD.count() res1: Long = 1388678
此时打开
Spark UI,观察执行结果:
Jobs界面:
Stages界面:
Storage界面:
分析:显然可以看到DAG图中,reduceByKey中有个绿色的点,说明该RDD已经被显示地缓存下来,这样在查看Storage界面时,也可以看到该缓存的RDD,另外需要说明的是,在执行该次操作中,所有的步骤都是需要执行的,然后产生了retRDD之后才将其缓存下来,这样下一次,如果再需要使用到retRDD时,就可以不用执行前面的操作了,可以节省很多时间,当然,不可否认地是,在本次操作中,缓存RDD时也是需要使用一定的时间的。
3.4 再次执行action操作
scala> retRDD.count() res1: Long = 1388678
Jobs界面:
Stages界面:
Storage界面:
分析,通过上面的观察也可以 4000 知道,retRDD前面的操作全部都没有执行,它是直接利用缓存的RDD来执行后面的action操作,所以时间上有大幅度地提升。
3.5 不执行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的最大区别。
4 说明
有很多细节的东西这里是没有办法展示的,这需要进一步去实践操作,如果可以,阅读源码也是十分不错的选择,当然这里也提供了十分不错的验证方式,通过这样一个操作的过程,相信会比在抽象概念上去理解
RDD持久化会有更大的提升。 阅读更多
相关文章推荐
- Spark笔记整理(十三):RDD持久化性能测试(图文并茂)
- Spark笔记整理(五):Spark RDD持久化、广播变量和累加器
- Spark笔记一之启动、简单RDD、提交、测试
- Spark性能调优之——在实际项目中重构RDD架构以及RDD持久化
- Spark---性能调优之重构RDD架构以及RDD持久化
- spark性能调优之重构RDD架构,RDD持久化
- Spark性能调优之——在实际项目中重构RDD架构以及RDD持久化
- 【学习笔记】系列十三:使用JMeter进行性能测试之Java请求
- RDD持久化、Spark广播、累加器笔记
- Spark笔记整理(四):Spark RDD算子实战
- spark新能优化之多次使用RDD的持久化或checkPoint
- Spark 中关于Parquet的应用与性能初步测试
- Spark优化(三):对多次使用的RDD进行持久化
- app端性能测试笔记
- spark-sql性能测试
- Spark笔记:复杂RDD的API的理解(上)
- Web性能测试术语整理
- loadrunner自学笔记-性能测试的注意要点
- Spark笔记:复杂RDD的API的理解(下)
- LR学习笔记之—事务(性能测试进阶指南LR11)