Spark Broadcast概述

概述

Spark的Broadcast机制实现了将变量从Driver发送到Executor(或Executor到Executor),且至多发送一次。这篇文章主要关注使用场景和几种实现Broadcast的思路。

使用场景

使用场景之一是优化task的传输,如果task中使用了size较大的变量,那么这个变量会随着task每次发送到executor,假设Partition是1k个,那么就会发送1k个task,同样,变量也被反复发送了1k次,使用Broadcast,每个executor至多只需发送一次,task中不再有此变量,size变小,优化了传输,通常,executor数远远小于Partition数。

另一个重要场景是join优化,大表join小表的情况,将小表broadcast到executor,可以使用SparkContext进行操作,Spark 1.5版本起DataFrame提供了语法上的支持,如下

import org.apache.spark.sql.functions.broadcast
// left and right are DataFrames
left.join(broadcast(right), "joinKey")

此外,Spark内部使用Broadcast传输conf到executor。

Broadcast设计要求

Broadcast的实现要同时兼顾到以下几方面

  • Performance
    性能是Spark不断的追求,Broadcast的实现也是如此,尽可能降低每次传输的时间。
  • Scalability
    扩展性是针对集群节点数量方面的要求,当集群节点较多时,如几千台,Broadcast花费的总时间不应显著增加。
  • Fault tolerance
    Broadcast机制能够容错,个别节点问题不影响整体运行。
  • Topology independence
    不依赖物理拓扑结构,自身创建及维护逻辑拓扑结构。

Broadcast四种实现思路

Performance and Scalability of Broadcast in Spark介绍了实现Broadcast的四种思路,如下

  • Centralized HDFS Broadcast(CHB)
    思路:使用HDFS存储序列化的Broadcast变量,executor从HDFS读取该变量并缓存在本地。
    优缺点:集群节点较多且同时读取时,HDFS读取速度成为瓶颈,HDFS的副本机制提供了容错机制。

  • Chained Streaming Broadcas(CSB)
    思路: driver将broadcast变量切分为block存储在本地,并维护一个tree结构记录哪些节点已接收broadcast变量,executor请求broadcast变量后,master将executor加入tree,再有executor请求时,从tree中选择一个节点提供下载服务,从tree中选择节点的策略有两个:LLCF(最少被使用)、HOSF(下载速度最快)。
    优缺点:所有已下载Broadcast变量的节点均提供下载服务,负载达到均衡。

  • BitTorrent Broadcast(BTB)
    思路: p2p下载,和CSB相似,和CSB主要不同在于,使用tracker代替tree记录已下载文件的节点,每个节点提供下载服务基于更细粒度的block,而不是完整的broadcast变量。
    优缺点:CSB相似,但是下载文件的粒度更细。

  • SplitStream Broadcast (SSB)
    思路:将broadcast变量分为K个block,每个block对应着一个tree结构。这个tree记录了所有已下载这个block的节点,新节点请求数据时,依次去每个block对应的tree中寻求一个节点下载该block。
    优缺点:BTB思路基本相同,只是BTB是从节点的角度考虑,SSB是block的角度。

Broadcast实现

Spark中Broadcast实现依次有BitTorrentBroadcast、TreeBroadcast、HttpBroadcast、TorrentBroadcast,这四种具体实现可以和Broadcast四种实现思路中的介绍简单对应上,但实现细节并不完全一致,Spark 2.0及以后只保留了TorrentBroadcast,因此,接下来的分析只关注TorrentBroadcast的实现。

总结

介绍Broadcast的使用场景,及几种实现思路。

参考:
Performance and Scalability of Broadcast in Spark
Spark Programming Guide - Broadcast Variables
Spark Broadcast Variables - What are they and how do I use them

你可能感兴趣的:(spark-core源码,spark)