spark-4

Spark 编程进阶
简介
共享变量:累加器 与 广播变量 分别为结果聚合与广播这种常见的通信模式突破了这一限制。
累加器:用来对信息进行聚合
广播变量:高效分发较大的对象。

6.2 累加器
通常在向Spark传递函数时,使用map()或者filter()传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些
变量的一份新的副本,更新这些副本的值也不会影响驱动器中对应的变量。

第一种共享变量,即累加器,提供了将工作节点中的值聚合到驱动器程序中的简单语法。
累加器的一个常见用途在调试时对作业执行过程中的事件进行计数。
用法如下:
通过SparkContext.accumulator(0) 创建初始化累加器,返回值为Accumulator[T]对象,其中T是初始值的类型
在spark闭包里的执行器代码可以使用累加器+=方法(在Java中是add)增加累加器的值。
通过value() 或setValue()来获取或访问累加器的值。
有一点需注意,执行的代码生成的RDD需要有行动操作后,累加器才会计值。
工作节点上的任务不能访问累加器的值,从这些任务的角度来看,累加器是一个只写的变量,这种模式下,累加器的实现可以
高效,不需要对每次更新操作进行复杂的通信。我们也可以同时使用多个累加器,用程序去累加,实现并行程序的多个地方的
增长。

累加器与容错性(应引用与行动操作中,而非转换操作)
Spark 会自动重新执行失败的或较慢的任务来应对错误的或者比较慢的机器,例如在某个分区执行map() 操作的节点失败了,Spark
会在另一个节点上重新运行该任务,即使该节点没有崩溃,而只是处理速度比别的节点慢很多,Spark也可以抢占式地在另一个节点
上启动一个投机型的任务副本,如果该任务更早结束就可以直接获取结果。即使没有节点失败,Spark也需要重新运行任务来获取
缓存中被移除内存的数据。因此最终结果就是同一个函数可能对同一个数据运行了很多次,这取决与集群发生了什么。
对于行动操作中使用的累加器,Spark只会把每个任务对累加器的修改应用一次,因此如果想要一个无论在失败还是重复计算时都绝对
可靠的累加器,我们必修把它放在foreach()这样的行动操作中。

对于RDD转换操作中使用的累加器,就不能保证有这种情况了,转化操作中累加器可能会发生不止一次的更新。例如:当一个被缓存
下来但是没有经常使用的RDD在第一次从LRU缓存中被一处并有重新用到时,这种非预期的多次更新就会发生,这回强制Rdd根据其谱系
进行重复计算。而副作用是这也会使得谱系中的转换操作里的累加器进行更新,并再次发送到驱动器中,在转换操作中,累加器通常使用
调试目的

6.3 广播变量

 Spark的第二种共享变量类型是广播变量,它可以让程序高效地想所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用
 比如,如果你的应用需要向所有节点发送一个较大的只读查询表,甚至机器学习算法中的一个很大的特征向量,广播变量用起来都比较
 顺手。

 Spark会自动把闭包中所有引用到的变量发送到工作节点上,虽然这很方便,但也很低效。
 原因有二:1.默认的任务发射机制是专门为了小任务进行优化的
           2.可以会在多个并行操作中使用同一个变量,但是spark会为每个操作分别发送。

 用法:
 通过对一个类型T的对象调用SparkContext.broadcast创建出一个Broadcast[T] 对象,任何可序列化的类型都可以这么实现
 通过value属性访问该对象的值
 变量只会发到各个节点一次,应作为只读值处理。(修改这个值不会影响到别的节点)

 满足只读要求的最容易的使用方式是广播基本类型的值或者引用不可改变对象,再这样的情况下你没有办法修改广播变量的值,除了在驱动
 程序的代码可以修改,但是有时传一个可变对象可能更为方便与高效。注意不要修改这个地址里面数据的值。
 广播的时候可以使用序列化库来选择优化序列化过程。

6.4 基于分区进行操作

基于分区对数据进行操作可以让我们避免为每个数据元素进行重复的配置工作。诸如打开数据库连接或者创建随机数生成器等操作。都是我们应当
避免为每个元素都配置一次的工作。Spark提供基于分区的map和foreach,让你部分代码只对RDD的每个分区进行一次,这样可以帮助降低这些操作的代价
mapPartitions: 该分区中元素的迭代器  返回的元素的迭代器
mapPartitionsWithIndex() 分区序号,以及每个分区中元素的迭代器。 返回的元素的迭代器
foreachPartitions() 元素迭代器 

6.5 与外部程序间的管道

6.6 数值RDD的操作。
Spark对包含数值数据的RDD提供了一些描述性的统计操作,Spark的数值操作是通过流式算法实现的,允许以每次一个元素的方式构建出模型,这些统计数据
都会掉用stats() 时通过一次遍历数据计算出来,并以StatsCounter对象返回。
count() RDD元素个数
mean() 元素的平均值
sum() 总和
max() min() variance() 元素的方差 sampleVariance()从采样中计算出的方差 stdev 标准差 sampleStdev 采样的标准差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值