Spark中的两个重要抽象是RDD和共享变量。

一般情况下,当Spark在集群的多个不同节点的多个任务上并行运行一个函数的时候,

它会把函数中涉及到的每个变量在每个节点每个任务上都生成一个副本。

Spark 操作实际上操作的是这个函数所用变量的一个独立副本。

这些变量被复制到每台机器上,并且这些变量在远程机器上的所有更新都不会传递回驱动程序。

通常跨任务的读写变量是低效的。

但是,有时候我们需要在多个任务之间共享变量,或者在任务和任务控制节点之间共享变量。

为了满足这种需求,Spark提供了两种有限的共享变量:广播变量( broadcast variable )和累加器( accumulator )。

 1.广播变量

  广播变量用来把变量在所有节点的内存之间进行共享。

  广播变量允许开发人员在每台机器上缓存一个只读的变量,而不是为每台机器上每个任务生成一个副本 。

  Spark的任务操作一般会跨越多个阶段,对于每个阶段内的所有任务所需要的公共数据,Spark都会自动进行广播。

语法:

  SparkContext.broadcase(v);

  广播变量就是对普通变量v的一个包装器,通过调用value方法就可以获取这个广播变量的值。

  1. //建立内容为Array(1,2,3)的广播变量
  2. val broadcastVal = sc.broadcast(Array(1,2,3))
  3. //获取广播变量的值
  4. broadcastVal.value()

注意:我们在把变量v建立成广播变量后,在集群中的任何函数,都应该使用broadcase(v),而不是v本身,

这样就不会把v重复的分发到使用变量v的节点上。此外,我们一旦建立了broadcase(v)之后,就不行再次发生修改。

2.累加器

  累加器支持在所有不同节点之间进行累加操作。

  累加器是仅仅被相关操作累加的变量,通常可以被用来实现计数器和求和。

  Spark原生地支持数值型(numeric)的累加器,也可以自己编写对新类型的累加器。

  可以通过SparkContext.longAccumulator()或者SparkContext.doubleAccumulator()来创建累加器。

  参数有两个(Int,String),第一个参数为初始累加值,默认为0,第二个参数为累加器的名字。

  运行在集群中的任务,就可以使用add()方法来把数值累加到累加器上。

  但是任务节点执行做累加操作,不能读取累加器的值,只有任务控制节点(Driver Program)可以使用value方法来读取。

  1. import org.apache.spark._
  2. object MyRdd {
  3. def main(args:Array[String]): Unit ={
  4. //初始化配置:设置主机名和程序主类的名字
  5. val conf = new SparkConf().setMaster("local").setAppName("MyRdd");
  6. //通过conf来创建sparkcontext
  7. val sc = new SparkContext(conf);
  8. val accum = sc.longAccumulator("My Accumulator");//后边是计数器的名字
  9. val list = List(1,2,3,4,5);
  10. val rdd = sc.parallelize(list);
  11. rdd.foreach(x => accum.add(x));//调用累加器求和
  12. accum.value;//注意只有任务控制节点(Driver节点)才能使用value方法来获取累加器的值
  13. }
  14. }

如果创建了一个具名的累加器,它可以在spark的UI中显示。这对于理解运行阶段(running stages)的过程有很重要的作用。

【spark】共享变量的更多相关文章

  1. spark共享变量

    boradcast例子代码: scala版本 spark共享变量之Accumulator 例子代码: scala版本

  2. 7.spark共享变量

    spark共享变量 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性分布式数据集 ...

  3. Spark——共享变量

    Spark执行不少操作时都依赖于闭包函数的调用,此时如果闭包函数使用到了外部变量驱动程序在使用行动操作时传递到集群中各worker节点任务时就会进行一系列操作: 1.驱动程序使将闭包中使用变量封装成对 ...

  4. Spark共享变量(广播变量、累加器)

    转载自:https://blog.csdn.net/Android_xue/article/details/79780463 Spark两种共享变量:广播变量(broadcast variable)与 ...

  5. SPARK共享变量:广播变量和累加器

    Shared Variables Spark does provide two limited types of shared variables for two common usage patte ...

  6. Spark分布式编程之全局变量专题【共享变量】

    转载自:http://www.aboutyun.com/thread-19652-1-1.html 问题导读 1.spark共享变量的作用是什么?2.什么情况下使用共享变量?3.如何在程序中使用共享变 ...

  7. 9.Spark Streaming

    Spark Streaming 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性 ...

  8. 8.Spark SQL

    Spark SQL 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性分布式数据集 ...

  9. 5.spark弹性分布式数据集

    弹性分布式数据集 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性分布式数据集 ...

  10. 4.Apache Spark的工作原理

    Apache Spark的工作原理 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark ...

随机推荐

  1. Python--(并发编程之线程Part2)

    GIL只能保证垃圾回收机制的安全,进程中的数据安全还是需要自定义锁 线程执行代码首先要抢到GIL全局锁,假设线程X首先抢到,以为要抢到自定义锁要执行代码,所以这个线程在执行代码的时候就很容抢到了自定义 ...

  2. Linux(7)- Nginx.conf主配置文件、Nginx虚拟主机/访问日志/限制访问IP/错误页面优化、Nginx反向代理、Nginx负载均衡

    一.Nginx.conf主配置文件 Nginx主配置文件conf/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的.一般,每个区块以一对大括号{}来表示开始与结束. 核心模 ...

  3. 搭建ss的步骤

    1. 购买vultr产品 购买地址 (这个比较稳定) 2. 更改ssh的端口,混淆一下,我改成了2333 vim /etc/ssh/sshd_config 将里面的port改为2333 更改防火墙规则 ...

  4. 练Focus T25必看!T25课表 视频与成功案例汇总

    练Focus T25必看!T25课表 视频与成功案例汇总! [复制链接]  http://jianfei.39.net/thread-3645799-1.html     小西i减肥         ...

  5. HDOJ 1257 最少拦截系统 【DP】

    HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  6. CAS单点登出的原理

    单点登出功能跟单点登录功能是相对应的,旨在通过Cas Server的登出使所有的Cas Client都登出. Cas Server的登出是通过请求“/logout”发生的,即如果你的Cas Serve ...

  7. MySQL-5.7密码策略及用户资源限制

    1.密码策略 在mysql 5.6对密码的强度进行了加强,推出了validate_password 插件.支持密码的强度要求. (1)安装插件 [root@localhost ~]# ll /usr/ ...

  8. redis_入门网址

    redis中文网: http://www.redis.cn/ 可以 试用 以及 下载 redis百度百科:http://baike.baidu.com/link?url=MEkE5MpGAOfJ7ci ...

  9. C++类初始化列表

    转自:https://www.cnblogs.com/BlueTzar/articles/1223169.html 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟 ...

  10. Chemistry

    Problem A. Chemistry Input file: chemistry.in Output file: chemistry.out Time limit: 1 seconds Memor ...