Spark Broadcast内幕分析
来源:互联网 发布:webuploader java 编辑:程序博客网 时间:2024/05/17 02:41
一:Broadcast彻底解析
1.Broadcast就是将数据从一个节点发送到其他的节点上。例如Driver上有一张表,而Executor中的每个并行执行的Task(100万个)都要查询这张表,那我们通过Broadcast的方式就只需要往每个Executor把这张表发送一次就行了。Executor中的每个运行的Task查询这张唯一的表,而不是每次执行的时候都从Driver获得这张表!
2.这就好像ServletContext的具体作用,只是Broadcast是分布式的共享数据。默认情况下,只要程序在运行Broadcast变量就会存在,因为Broadcast在底层是通过BlockManager管理的!但是你可以手动指定或者配置具体周期来销毁Broadcast变量!
3.Broadcast一般用于处理共享配置文件,通用的Dataset,常用的数据结构等等。但是不适合存放太大的数据在Broadcast中,Broadcast不会内存溢出,因为其数据的保存的StorageLevel是MEMORY_AND_DISK的方式。虽然如此,我们也不可以放入太大的数据在Broadcast中,因为网络IO和可能的单点压力会非常大!
4.广播Broadcast变量是只读变量,保持数据一致性。
5.Broadcast的使用:
{{{* scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))* broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)** scala> broadcastVar.value* res0: Array[Int] = Array(1, 2, 3)* }}}
6.HttpBroadcast方式的Broadcast,最开始的时候数据放在Driver的本地文件系统中,Driver在本地会创建一个文件夹来存放Broadcast中的data,然后启动HttpServer来访问文件夹中的数据。同时写入到BlockManager中获得BlockId(BroadcastBlockId)。当第一次Executor中的Task要访问Broadcast变量的时候,会向Driver通过HttpServer来访问数据,然后会在Executor中的BlockManager中注册该Broadcast中的数据BlockManager,这样后需要的Task需要访问Broadcast的变量的时候会首先查询BlockManager中有没有该数据,如果有就直接使用。
7.BroadcastManager是用来管理Broadcast。该实例对象实在SparkContext创建SparkEnv的时候创建的:
// Called by SparkContext or Executor before using Broadcastprivate def initialize() { synchronized { if (!initialized) { val broadcastFactoryClass = conf.get("spark.broadcast.factory","org.apache.spark.broadcast.TorrentBroadcastFactory") broadcastFactory = Utils.classForName(broadcastFactoryClass).newInstance.asInstanceOf[BroadcastFactory] // Initialize appropriate BroadcastFactory and BroadcastObject broadcastFactory.initialize(isDriver, conf, securityManager) initialized = true } }}在实例化BroadcastManager的时候会创建BroadcastFactory工厂来构建具体实际的Broadcast类型,默认情况下是TorrentBroadcastFactory。
8.HttpBroadcast方式存在单点故障,和网络IO性能问题,所以默认使用TorrentBroadcast的方式,开始数据在Driver中,假设A节点使用了数据,A节点也会变为数据源,使用越多,数据源就越多,理论上就会越快。当然都要被BroadcastManager管理的。
9.TorrentBroadcast按照BLOCK_SIZE(默认是4MB)将Broadcast中的数据划分成为不同的Block,然后将分块信息也就是meta信息存放到Driver的Blockmanager中,同时会告诉BlockManagerMaster说明meta信息存放完毕。
10,如果是TorrentBroadcast的方式,Executor从Driver中拿到了广播数据,会通知BlockManagerMaster,数据多了一份副本。
- Spark Broadcast内幕分析
- Spark Broadcast内幕解密
- spark Broadcast 内幕解密
- Spark Broadcast源码分析
- Spark Broadcast源码分析
- 源码- Spark Broadcast源码分析
- 第42课: Spark Broadcast内幕解密:Broadcast运行机制彻底解密、Broadcast源码解析、Broadcast最佳实践
- Spark SQL中的broadcast join分析
- spark-broadcast
- Spark大师之路:广播变量(Broadcast)源码分析
- Spark技术内幕:Stage划分及提交源码分析
- Spark技术内幕:Stage划分及提交源码分析
- Spark技术内幕:Stage划分及提交源码分析
- spark join broadcast优化
- spark join broadcast优化
- Spark Broadcast 广播变量
- Spark之BroadCast
- Spark 之Broadcast
- js图片预览
- 中国IT武林大会暨中国首席技术官2016年度人物颁奖盛典
- Android相机Camera基础
- C#小游戏,拼音打字练习
- 网络的那些事之VLSM
- Spark Broadcast内幕分析
- 136. Single Number&137. Single Number II
- Nginx中的rewrite指令(break,last,redirect,permanent)
- Activity类如何给普通类发消息
- golang中("import cycle not allowed")错误
- Android 用Animation-list实现逐帧动画
- cuda8.0使用nvcc编译程序出现warning:The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated的解决办法
- Android5.1-s5p6818平台代码混淆导致jar里面的类不能读取---classnotfound exception
- UICollectionView不调用collectionView: cellForItemAtIndexPath: