当前位置: 首页 > news >正文

软件工程师薪资赣州seo培训

软件工程师薪资,赣州seo培训,爱空间装修靠谱吗,wordpress开发的主流架构RDD缓存 Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或缓存多个数据集。当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出的RDD进行的其他动作中重用。这使得后续的动作变得更加迅速。…

RDD缓存
Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或缓存多个数据集。当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出的RDD进行的其他动作中重用。这使得后续的动作变得更加迅速。RDD相关的持久化和缓存,是Spark最重要的特征之一。

RDD通过persist方法或cache方法可以将前面的计算结果缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的行动算子时,该RDD将会被缓存在计算节点的内存中,并供以后重用。

不带缓存的计算示例
以下通过一个计算斐波那契数列(1,1,2,3,5,8,13,....)第n项的例子,来展示 Spark 中cache方法的运行效果。

先来看看一段代码。

import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}object Cache {def main(args: Array[String]): Unit = {// 配置Sparkval conf = new SparkConf().setAppName("CacheExample").setMaster("local[*]")val sc = new SparkContext(conf)
//    conf.set("spark.local.dir", "_cache")
sc.setLogLevel("WARN")// 创建一个包含大量随机数的 RDDval largeRDD = sc.parallelize(1 to 1000*1000*10).map(_ => scala.util.Random.nextInt(1000))// 定义一个复杂的转换函数def complexTransformation(num: Int): Int = {var result = numfor (_ <- 1 to 1000) {result = result * 2 % 1000}result}// 不使用 cache 的情况val nonCachedRDD = largeRDD.map(complexTransformation)// 第一次触发行动算子,计算并统计时间val startTime1 = System.currentTimeMillis()val result1 = nonCachedRDD.collect()val endTime1 = System.currentTimeMillis()println(s"不使用 cache 第一次计算耗时: ${endTime1 - startTime1} 毫秒")// 第二次触发行动算子,计算并统计时间val startTime2 = System.currentTimeMillis()val result2 = nonCachedRDD.collect()val endTime2 = System.currentTimeMillis()println(s"不使用 cache 第二次计算耗时: ${endTime2 - startTime2} 毫秒")sc.stop()}
}

在 Scala 里,cache 方法定义于 org.apache.spark.rdd.RDD 类中,其方法签名如下:

scaladef cache(): this.type

返回类型:this.type,这表明返回的是调用该方法的 RDD 自身,只不过这个 RDD 已经被标记为需要缓存。

// 使用 cache 的情况val cachedRDD = largeRDD.map(complexTransformation).cache()// 第一次触发行动算子,计算并统计时间val startTime3 = System.currentTimeMillis()val result3 = cachedRDD.collect()val endTime3 = System.currentTimeMillis()println(s"使用 cache 第一次计算耗时: ${endTime3 - startTime3} 毫秒")// 第二次触发行动算子,计算并统计时间val startTime4 = System.currentTimeMillis()val result4 = cachedRDD.collect()val endTime4 = System.currentTimeMillis()println(s"使用 cache 第二次计算耗时: ${endTime4 - startTime4} 毫秒")println(s"spark.local.dir 的值: ${conf.get("spark.local.dir")}")sc.stop()

核心代码说明:

第一次调用collect时,程序需要对RDD中的每个元素执行fibonacci函数进行计算,这涉及到递归运算,比较耗时。

第二次调用collect时,因为之前已经调用了cache方法,并且结果已被缓存,所以不需要再次执行计算,直接从缓存中读取数据。通过对比两次计算的耗时,可以明显发现第二次计算耗时会远小于第一次(在数据量较大或计算复杂时效果更显著),这就体现了cache方法缓存计算结果、避免重复计算、提升后续操作速度的作用 。

persist和cache方法
在 Spark 中,persist 和 cache 方法都用于将 RDD(弹性分布式数据集)或 DataFrame 持久化,以避免重复计算从而提升性能,但二者存在一些区别。

1. 功能本质

persist:这是一个通用的持久化方法,能够指定多种不同的存储级别。存储级别决定了数据的存储位置(如内存、磁盘)以及存储形式(如是否序列化)。

cache:其实是 persist 方法的一种特殊情况,它等价于调用 persist(StorageLevel.MEMORY_ONLY),也就是将数据以非序列化的 Java 对象形式存储在内存中。

2. 存储级别指定

persist:可以通过传入 StorageLevel 参数来指定不同的持久化级别。常见的持久化级别有:

MEMORY_ONLY:将 RDD 以 Java 对象的形式存储在 JVM 的内存中。若内存不足,部分分区将不会被缓存,需要时会重新计算。

MEMORY_AND_DISK:优先把 RDD 以 Java 对象的形式存储在 JVM 的内存中。若内存不足,会把多余的分区存储到磁盘上。

DISK_ONLY:将 RDD 的数据存储在磁盘上。

MEMORY_ONLY_SER:将 RDD 以序列化的 Java 对象形式存储在内存中,相较于 MEMORY_ONLY,序列化后占用的内存空间更小,但读取时需要进行反序列化操作,会带来一定的性能开销。

MEMORY_AND_DISK_SER:优先将 RDD 以序列化的 Java 对象形式存储在内存中,内存不足时存储到磁盘上。

cache:不能指定存储级别,它固定使用 MEMORY_ONLY 存储级别。

下面我们以DISK_ONLY为例,改写上面的程序,验证它的持久化效果。具体要改动的地方有两个: 指定持久化地址; 把cache改成persist;

import org.apache.spark.{SparkConf, SparkContext}object Main {def main(args: Array[String]): Unit = {//打印hello word!println("Hello World!")//学习sparkRDD中的转换算子//1.map//2.filter:过滤//3.flatMap:flat(扁平化)+map(映射)//4.reduceByKey:键值对的数据(world,1),(hello,1)val conf = new SparkConf().setMaster("local[*]").setAppName("Test")val sc = new SparkContext(conf)//创建一个RDD
//    val rdd = sc.parallelize(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))//    val rdd1 = rdd.map(x => x * 2)//使用filter算子,保留偶数
//    val rdd1 = rdd.filter(x => x % 2 == 0)//有多个句子,每个句子有多个单词,单词之间使用空格隔开//目标,把所有单词找出来,放一个数组中
//    val rdd = sc.parallelize(List("hello world", "hello scala"))
//    val rdd1 = rdd.flatMap(x => x.split(" "))//hello world hello scala//词频统计的例子val rdd = sc.parallelize(List("apple","banana","apple","banana","apple"))
//    val rdd1 = rdd.map(x => (x,1))//(apple,1)(banana,1)(apple,1)(banana,1)(apple,1)
//    val rdd3 = rdd1.reduceByKey((x,y) => x+y)//(apple,3)(banana,2)rdd.map(x => (x,1)).reduceByKey((x,y) => x+y).collect().foreach(println)//collect()行动算子
//    rdd3.collect().foreach(println)}
}

http://www.cadmedia.cn/news/12521.html

相关文章:

  • 建设网站方向百度新闻排行榜
  • hbuilder 做网站网络服务提供商是指
  • 山西智能建站系统价格关键词首页排名代做
  • 华强北 做网站谷歌google浏览器
  • 深圳建设企业网站新闻20条摘抄大全
  • 网站站建设怎么在网上做广告
  • 龙岗网站建设需要考量些什么刷网站百度关键词软件
  • 泰安网站开发佛山seo教程
  • .案例 商务网站的推广策略设计网络营销方案
  • 中卫网站推广服务长沙seo推广
  • 宁波企业网站建设软文营销的写作技巧有哪些
  • 自助网站建设系统网站推广网站
  • 聊城市城乡建设委员会网站哈尔滨优化网站方法
  • 西宁招聘网站开发google ads 推广
  • 毕业论文做网站百度竞价专员
  • 全网网站建设链接交换平台
  • 百度公司官网seo网站优化推荐
  • 周口网站建设 网站制作 网络推广公司网站推广运营
  • 建设平台型网站多少钱如何宣传推广产品
  • 网站建设了解seo策略什么意思
  • wap 在线上海seo网站推广公司
  • 饲料公司网站建设方案全球疫情今天最新消息
  • 江苏建科建设监理有限公司网站健康码防疫核验一体机
  • 武汉企业网站设计网站设计公司
  • 建设银行企业网站打不开网络推广外包搜索手机蛙软件
  • 周口网站建设电话抖音seo供应商
  • 旅游营销的网站建设360seo排名优化服务
  • 物联网流量卡官网购买上海网络seo
  • 北京营销型网站建设费用推广网站制作
  • 做日本美食的视频网站本地推广最有效的方法