RDD持久化、广播、累加器

本文探讨了Spark中的RDD持久化策略,包括Memory_only_2、Memory_only_ser和MEMORY_AND_DISK等,强调了在特定场景如耗时计算、长链条和shuffle后进行缓存的重要性。此外,还解释了广播变量的作用,如何减少网络传输和内存占用,以及累加器在记录集群状态和管理全局唯一状态方面的应用。作业部分提到了如何手动清除persist内容和研究累加器源码。

所有的节点host配置一样,可以互相访问
命令:scp /etc/hosts root@node1:/etc/hosts(node1,2,3,4)
常用的Action:reduce,count,saveTextFile,foreach,countByKey
如果想在命令终端中看到执行结果,就必须Collect
这里写图片描述
凡是Action级别的操作都会触发sc.runJob

sc
val numbers=sc.parallelize
val numbers =sc.parallelize(1 to 100)
numbers.reduce(_+_)
val result=numbers.map(2*_)
val data=result.collect
numbers
1 to 100
numbers.count
val topN=numbers.take(5)
val scores=Array(Tuple2(1,100),Tuple2(2,100),Tuple2(3,100),Tuple2(1,100),)
val content=scores.paralelize//转化成RDD
val data=content.countBykey
sc.textFile("/root/javacount.sh").flapMap().map.reduceByKey.saveAsFile("")

RDD缓存情况
1,某步骤计算特别耗时;
2,计算链条特别长的情况;
3,checkpoint所在的RDD也一定要持久化数据;
4,shuffle之后;网络传输,丢失重来
5,shuffle之前(框架默认帮助我们把数据持久化到本地磁盘)

StorageLevel
Memory_only_2在两台机器内存中缓存同样的东西,
Memory_only_ser节约内存,但是需要反序列化
MEMORY_AND_DISK主要是降低OOM的可能性

cache是persist的特例,只能缓存在内存
Cache之后一定不能立即有其它算子!

scala>sc.textFile("/data/putfile.txt").flatMap(_.split(" ")).map(word=> (word,1)).reduceByKey(_+_).count

scala>sc.textFile("/data/putfile.txt").flatMap(_.split(" ")).map(word=> (word,1)).reduceByKey(_+_).cache

scala>sc.textFile("/data/putfile.txt").flatMap(_.split(" ")).map(word=>(word,1)).reduceByKey(_+_).cache.count//此时变慢,主要是Cache之后一定不能立即有其它算子!

persist是lazy级别的
unpersist是eager级别的

为什么需要广播
大的变量:减少冗余,减少传输,每个task都要拷贝一份数据副本,一个excutor保存一份,(函数式编程,状态一致性,但耗内存)–》OOM
join:
shuffle:
同步:全局变量,只读,
广播是由Driver发给当前Application分配的所有Executor内存级别的全局只读变量,Executor中的线程池中的线程共享该全局变量,极大的减少了网络传输(否则的话每个Task都要传输一次该变量)并极大的节省了内存,当然也隐形的提高的CPU的有效工作
原因:每一task都需要一个全局变量,要是每个task都有一个全局变量的话,会产生OOM

这里写图片描述

val number =10
val broadcastNumber =sc.brodcast(number)//只能由sc广播

输出

org.apache.spark.broadcast.Broadcast[Int] = Broadcast(33)
val data=sc.parallelize(1 to 100)//task使用广播变量,所以要创建RDD
val bn = data.map(_* broadcastNumber.value)

累加器
Accumulator:对于Executor只能修改但不可读,只对Driver可读
记录集群状态,尤其全局唯一状态,
管理有点代价

val sum = sc.accumulator(0)
val data = sc.parallelize(0 to 5)
data.foreach(item => sum += item)
println(sum)

作业:
1.手动清除到persist内容
2。阅读累加器源码

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值