首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

示例演示:Spark性能优化之RDD持久化

  • 25-03-07 20:02
  • 3556
  • 9466
blog.csdn.net

        Spark非常重要的一个功能特性就是可以将RDD持久化在内存中。当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内存中,并且在之后对该RDD的反复使用中,直接使用内存缓存的partition。这样的话,对于针对一个RDD反复执行多个操作的场景,就只要对RDD计算一次即可,后面直接使用该RDD,而不需要反复计算多次该RDD。

        巧妙使用RDD持久化,甚至在某些场景下,可以将spark应用程序的性能提升10倍。对于迭代式算法和快速交互式应用来说,RDD持久化,是非常重要的。

        要持久化一个RDD,只要调用其cache()或者persist()方法即可。在该RDD第一次被计算出来时,就会直接缓存在每个节点中。而且Spark的持久化机制还是自动容错的,如果持久化的RDD的任何partition丢失了,那么Spark会自动通过其源RDD,使用transformation操作重新计算该partition。

        cache()和persist()的区别在于,cache()是persist()的一种简化方式,cache()的底层就是调用的persist()的无参版本,同时就是调用persist(MEMORY_ONLY),将数据持久化到内存中。如果需要从内存中清楚缓存,那么可以使用unpersist()方法。

        Spark自己也会在shuffle操作时,进行数据的持久化,比如写入磁盘,主要是为了在节点失败时,避免需要重新计算整个过程。

直接上示例:

      接下来,通过实例展示未使用RDD持久化运行情况:

  1. package cn.spark.study.core1;
  2. import org.apache.spark.SparkConf;
  3. import org.apache.spark.api.java.JavaRDD;
  4. import org.apache.spark.api.java.JavaSparkContext;
  5. public class Persist {
  6. public static String m_FilePath = "C://Users//Leizuquan//Desktop//spark_thinkpad//spark code//spark-test-file//";
  7. public static void main(String[] args) {
  8. // TODO Auto-generated method stub
  9. SparkConf conf = new SparkConf()
  10. .setAppName("Persist")
  11. .setMaster("local");
  12. // cache()或者persist()的使用,是有规则的
  13. // 必须在transformation或者textFile等创建了一个RDD之后,直接连续调用cache()或persist()才可以
  14. // 如果你先创建一个RDD,然后单独另起一行执行cache()或persist()方法,是没有用的
  15. // 而且,会报错,大量的文件会丢失
  16. JavaSparkContext sc = new JavaSparkContext(conf);
  17. JavaRDD linesRDD = sc.textFile(m_FilePath + "Persist.txt");
  18. long startTime = System.currentTimeMillis();
  19. long count = linesRDD.count();
  20. System.out.println("第一次计算文本行数: " + count);
  21. long endTime = System.currentTimeMillis();
  22. long spendTime = endTime - startTime;
  23. System.out.println("第一次计算花费时间:" + spendTime + " ms");
  24. startTime = System.currentTimeMillis();
  25. count = linesRDD.count();
  26. System.out.println("第二次计算文本行数: " + count);
  27. endTime = System.currentTimeMillis();
  28. spendTime = endTime - startTime;
  29. System.out.println("第二次计算花费时间:" + spendTime + " ms");
  30. sc.close();
  31. }
  32. }

未使用RDD持久化运行结果:

       接下来,通过实例展示RDD持久化带来的性能优化(textFile等创建了一个RDD之后,直接连续调用cache()):

  1. package cn.spark.study.core1;
  2. import org.apache.spark.SparkConf;
  3. import org.apache.spark.api.java.JavaRDD;
  4. import org.apache.spark.api.java.JavaSparkContext;
  5. public class Persist {
  6. public static String m_FilePath = "C://Users//Leizuquan//Desktop//spark_thinkpad//spark code//spark-test-file//";
  7. public static void main(String[] args) {
  8. // TODO Auto-generated method stub
  9. SparkConf conf = new SparkConf()
  10. .setAppName("Persist")
  11. .setMaster("local");
  12. // cache()或者persist()的使用,是有规则的
  13. // 必须在transformation或者textFile等创建了一个RDD之后,直接连续调用cache()或persist()才可以
  14. // 如果你先创建一个RDD,然后单独另起一行执行cache()或persist()方法,是没有用的
  15. // 而且,会报错,大量的文件会丢失
  16. JavaSparkContext sc = new JavaSparkContext(conf);
  17. JavaRDD linesRDD = sc.textFile(m_FilePath + "Persist.txt").cache();
  18. long startTime = System.currentTimeMillis();
  19. long count = linesRDD.count();
  20. System.out.println("第一次计算文本行数: " + count);
  21. long endTime = System.currentTimeMillis();
  22. long spendTime = endTime - startTime;
  23. System.out.println("第一次计算花费时间:" + spendTime + " ms");
  24. startTime = System.currentTimeMillis();
  25. count = linesRDD.count();
  26. System.out.println("第二次计算文本行数: " + count);
  27. endTime = System.currentTimeMillis();
  28. spendTime = endTime - startTime;
  29. System.out.println("第二次计算花费时间:" + spendTime + " ms");
  30. sc.close();
  31. }
  32. }

使用RDD持久化运行结果:

总结:

        RDD持久化能够给应用程序带来数倍的性能提升。

 


文章最后,给大家推荐一些受欢迎的技术博客链接:

  1. Hadoop相关技术博客链接
  2. Spark 核心技术链接
  3. JAVA相关的深度技术博客链接
  4. 超全干货--Flink思维导图,花了3周左右编写、校对
  5. 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
  6. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
  7. 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂

 


欢迎扫描下方的二维码或 搜索 公众号“10点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!

                                           

       

注:本文转载自blog.csdn.net的不埋雷的探长的文章"https://blog.csdn.net/weixin_32265569/article/details/83507029"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top