Spark 4
来源:互联网 发布:海康网络监控摄像头 编辑:程序博客网 时间:2024/06/13 04:19
6 分布式数据集操作
分布式数据集支持两种类型的操作:transformation和action。transformation的意思是从老数据集中生成新的数据集,action是在数据集上进行计算并将结果返回给driver program。每一个Spark应用包含一个driver program用来执行用户的main函数,比如,map就是一个transformation,将大数据集划分处理为小数据集,reduce是action,将数据集上内容进行聚合并返回给driver program。有个例外是reduceByKey应该属于transformation,返回的是分布式数据集。
需要注意的是,Spark的transformation是lazy的,transformation先将操作记录下来,直到接下来的action需要将处理结果返回给driver program的时候。
另一个特性是caching,如果用户指定cache一个数据集RDD,那么该数据集中的不同slice会按照partition被存放到相应不同节点的内存中,这样重用该数据集的时候,效率会高很多,尤其适用于迭代型和交互式的应用。如果cache的RDD丢失,那么重新使用transformation生成。
7 共享变量
与Hadoop的MapReduce不同的是,Spark允许共享变量,但只允许两种受限的变量:broadcast和accumulators。
Broadcast顾名思义是“广播”,在每个节点上保持一份read-only的变量。比如,Hadoop的map task需要一部只读词典来处理文本时,由于不存在共享变量,每个task都需要加载一部词典。当然也可以使用DistributedCache来解决。在Spark中,通过broadcast,每个节点存放一部词典就够了,这样从task粒度上升到node粒度,节约的资源可想而知。Spark的broadcast路由算法也考虑到了通信开销。
通过使用SparkContext.broadcast(v)来实现对变量v的包装和共享。
scala> val broadcastVar = sc.broadcast(Array(1,2,3))
12/05/10 10:54:21 INFO spark.BoundedMemoryCache: Asked to add key ((1,a5c2a151-185d-4ea4-aad1-9ec642eebc5d),0)
12/05/10 10:54:21 INFO spark.BoundedMemoryCache: Estimated size for key ((1,a5c2a151-185d-4ea4-aad1-9ec642eebc5d),0) is 12
12/05/10 10:54:21 INFO spark.BoundedMemoryCache: Size estimation for key ((1,a5c2a151-185d-4ea4-aad1-9ec642eebc5d),0) took 0 ms
12/05/10 10:54:21 INFO spark.BoundedMemoryCache: ensureFreeSpace((1,a5c2a151-185d-4ea4-aad1-9ec642eebc5d), 12) called with curBytes=12, maxBytes=339585269
12/05/10 10:54:21 INFO spark.BoundedMemoryCache: Adding key ((1,a5c2a151-185d-4ea4-aad1-9ec642eebc5d),0)
12/05/10 10:54:21 INFO spark.BoundedMemoryCache: Number of entries is now 2
broadcastVar: spark.broadcast.Broadcast[Array[Int]] = spark.Broadcast(a5c2a151-185d-4ea4-aad1-9ec642eebc5d)
创建broadcast变量后,可以通过.value来访问只读原始变量v。
scala> broadcastVar.value
res4: Array[Int] = Array(1, 2, 3)
另一种共享变量是Accumulators,顾名思义就是可以被“added”的变量,比如MapReduce中的counters就是不断累加的变量。Spark原生支持Int和Double类型的累加变量。
通过SparkContext.accumulator(v)来创建accumulator类型的变量,然后运行的task可以使用“+=”操作符来进行累加。但是task不能读取到该变量,只有driver program能够读取(通过.value),这也是为了避免使用太多读写锁吧。
创建0的accumulator版本。
scala> val accum = sc.accumulator(0)
accum: spark.Accumulator[Int] = 0
对生成的RDD进行累加,这次不要reduce了。
scala> sc.parallelize(Array(1,2,3,4)).foreach(x => accum += x)
12/05/10 11:05:48 INFO spark.SparkContext: Starting job...
scala> accum.value
res7: Int = 20
- Spark 4
- Spark系列(4)-Spark Web 页面
- Spark实践项目4:Spark基本概念
- Spark -4:maven编译spark 源码
- 【Spark系列4】Spark的shuffle原理
- Spark问题笔记4
- Spark 阶段总结 4
- 4-1、Spark简介
- 4 Spark Streaming 事务处理
- Spark学习日志4
- spark
- spark
- Spark
- spark
- Spark
- spark
- Spark
- Spark
- 《移动设计》阅读笔记
- java 中的序列化
- Populating Next Right Pointers in Each Node(leetcode)
- 给Linux初学者和管理员一个终极命令行"备忘单"
- JS获取字符串实际长度!
- Spark 4
- Spark--5
- 支持取消操作和暂停操作的Backgroundworker示例一则
- 弹出UIDateicker
- Ubunt 14.04 lts 安装 workbench及相关错误解决
- 冯永昌:云计算与大数据时代的量化投资
- 关于hibernate中多对多关系
- sendBroadcastAsUser——Calling a method in the system process without a qualified user
- 多线程之线程范围内的数据共享ThreadLocal