设为首页 收藏本站
查看: 2084|回复: 0

[经验分享] Spark笔记整理(十三):RDD持久化性能测试(图文并茂)

[复制链接]

尚未签到

发表于 2019-1-30 13:25:07 | 显示全部楼层 |阅读模式
  [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 :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
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界面:


  分析,通过上面的观察也可以知道,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 :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的最大区别。

4 说明
  有很多细节的东西这里是没有办法展示的,这需要进一步去实践操作,如果可以,阅读源码也是十分不错的选择,当然这里也提供了十分不错的验证方式,通过这样一个操作的过程,相信会比在抽象概念上去理解RDD持久化会有更大的提升。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-669661-1-1.html 上篇帖子: SPark面向对象编程OOP实战 下篇帖子: 发福利喽!学Spark课程送Spark技术峰会的门票........
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表