spark---广播变量

一.

在写spark程序时,有可能Driver会从本地读取一份数据,这个时候这份数据就会在Driver所在的机器上,那么executor端也要使用这份数据;
这时就需要将Driver端的数据广播给Executor端

/**
   * Broadcast a read-only variable to the cluster, returning a
   * [[org.apache.spark.broadcast.Broadcast]] object for reading it in distributed functions.
   * The variable will be sent to each cluster only once.
   *
   * @param value value to broadcast to the Spark nodes
   * @return `Broadcast` object, a read-only variable cached on each machine
   */
  def broadcast[T: ClassTag](value: T): Broadcast[T] = {
    assertNotStopped()
    require(!classOf[RDD[_]].isAssignableFrom(classTag[T].runtimeClass),
      "Can not directly broadcast RDDs; instead, call collect() and broadcast the result.")
    val bc = env.broadcastManager.newBroadcast[T](value, isLocal)
    val callSite = getCallSite
    logInfo("Created broadcast " + bc.id + " from " + callSite.shortForm)
    cleaner.foreach(_.registerBroadcastForCleanup(bc))
    bc
  }

向集群广播只读变量,返回a
[[org.apache.spark.broadcast。对象,用于在分布式函数中读取它。
变量只会发送到每个集群一次。
@param值向Spark节点广播的值
@return ’ Broadcast '对象,缓存在每台机器上的只读变量

使用broadcast这个方法就可以将数据广播给其他Executor,会生成一个广播数据的引用

然后Executor就可以通过这个引用直接使用这份数据了,因为Task是在Driver端生成的,广播变量的引用也会伴随着Task被发送到Executor端。
调用方法是生成的引用.value

或者这份数据从HDFS上读取的,那么executor端获取的数据是不完整的,但是Executor又要使用完整的数据,那么这时候的解决办法就是:
1.先将每个Executor上的数据收集到Driver端
2.再将Driver上完整的数据广播给Executor。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值