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

  1、驱动程序使将闭包中使用变量封装成对象,驱动程序序列化对象,传给worker节点任务;

  2、worker节点任务接收到对象,执行闭包函数;

由于使用外部变量势必会通过网络、序列化、反序列化,如外部变量过大或过多使用外部变量将会影响Spark程序的性能;

  Spark提供了两种类型的共享变量(Shared Variables):广播变量(Broadcast Variables)、累加器(Accumulators );

  

广播变量(Broadcast Variables)

  Spark提供的广播变量可以解决闭包函数引用外部大变量引起的性能问题;广播变量将只读变量缓存在每个worker节点中,Spark使用了高效广播算法分发变量从而提高通信性能;如直接在闭包函数中使用外部 变量该变量会缓存在每个任务(jobTask)中如果多个任务同时使用了一个大变量势必会影响到程序性能;

  广播变量:每个worker节点中缓存一个副本,通过高效广播算法提高传输效率,广播变量是只读的;

  Spark Scala Api与Java Api默认使用了Jdk自带序列化库,通过使用第三方或使用自定义的序列化库还可以进一步提高广播变量的性能;

广播变量使用示例:

val sc = SparkContext("");
val eigenValue = sc.bradcast(loadEigenValue())
val eigen = computer.map{x =>
val temp = eigenValue.value
...
...
}

      左节点不使用广播变量,右使用广播变量

累加器(Accumulators)

  累加器可以使得worker节点中指定的值聚合到驱动程序中,如统计Spark程序执行过程中的事件总数等;

val sc = new SparkContext(...)
val file = sc.textFile("xxx.txt")
val eventCount = sc.accumulator(0,"EventAccumulator") //累加器初始值为0 val formatEvent = file.flatMap(line => {
if(line.contains("error")){
eventCount +=1
}
})
formatEvent.saveAsTextFile("eventData.txt")
println("error event count : " + eventCount);

  在使用累加器(Accumulators)时需要注意,只有在行动操作中才会触发累加器,也就是说上述代码中由于flatMap()为转换操作因为Spark惰性特征所以只用当saveAsTextFile() 执行时累加器才会被触发;累加器只有在驱动程序中才可访问,worker节点中的任务不可访问累加器中的值;

  Spark原生支持了数字类型的的累加器如:Int、Double、Long、Float等;此外Spark还支持自定义累加器用户可以通过继承AccumulableParam特征来实现自定义的累加器此外Spark还提供了accumulableCollection()累加集合用于;创建累加器时可以使用名字也可以不是用名字,当使用了名字时在Spark UI中可看到当中程序中定义的累加器, 广播变量存储级别为MEMORY_AND_DISK;

文章首发地址:Solinx

http://www.solinx.co/archives/570

最新文章

  1. JokeClient-Swift 仿写学习
  2. SQL Server Profiler
  3. java提高篇(二二)---LinkedList
  4. mysql中,ENCODE警告---Warning Code : 1287
  5. IOS NSTimer和CADisplayLink的用法
  6. ural 1251. Cemetery Manager
  7. C#设计模式——模板方法(Template Method)
  8. PowerShell - Read an Excel file using COM Interface
  9. javascript设计模式-生成器模式(Builder)
  10. Javascript之登陆验证
  11. vs2005中无法修改控件ID
  12. `npm install --save --save-exact react-native` failed
  13. HDU 4812 D Tree 树分区+逆+hash新位置
  14. 学点Groovy来理解build.gradle代码
  15. 闭锁——CountDownLatch
  16. LeetCode 414. Third Maximum Number (第三大的数)
  17. 使用TP5创建一个REST API
  18. zzw原创_cmd下带jar包运行提示 “错误: 找不到或无法加载主类 ”
  19. 【转】WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式
  20. 【连载6】二手电商APP的导购功能与关系链机制分析

热门文章

  1. 关于JavaScript中的delete操作
  2. Spark核心作业调度和任务调度之DAGScheduler源码
  3. 架构设计:负载均衡层设计方案(3)——Nginx进阶
  4. 搭建自己的Nuget服务器
  5. 梯度提升树(GBDT)原理小结
  6. 第二章 consul的安装和启动
  7. java监控之ManagementFactory分析
  8. JQuery中ajax的相关方法总结
  9. Vertica集群单节点宕机恢复方法
  10. Windows Live Writer 在线安装失败的解决方法。