Spark部分广播变量的理解(原理+图解+代码实现)

您所在的位置:网站首页 spark广播变量的两种方式是什么 Spark部分广播变量的理解(原理+图解+代码实现)

Spark部分广播变量的理解(原理+图解+代码实现)

#Spark部分广播变量的理解(原理+图解+代码实现)| 来源: 网络整理| 查看: 265

    1.广播变量         当在Executor端用到了Driver变量,不使用广播变量,在每个Executor中有多少个task就有多少个Driver端变量副本。         如果使用广播变量在每个Executor端中只有一份Driver端的变量副本。         val broadcast = sc.broadCast(...)         broadcast.value()         注意:             1).不能将RDD广播出去,可以将RDD的结果广播出去             2).广播变量在Driver定义,在Exector端不可改变,在Executor端不能定义

一.原理

广播变量:实际上就是Executor端用到了driver端的变量

如果在executor端你使用到了driver端的广播变量,如果不使用广播变量,在每个executor中有多少task就有多少变量副本。

注意:

不能将RDD广播出去,RDD不存数据,可以将RDD的结果广播出去,rdd.collect()广播变量只能在Driver定义,在Executor端不能修改广播变量的值。

使用了广播变量,实际上就是为了减少executor端的备份,最终减少executor端的内存。

举个简单的例子:driver端有1000个变量,如果不使用广播变量的话,从driver端发给executor端有1000个备份,使用了广播变量,就会只有一个备份,从而可以减少executor端的内存。

 二.图解说明

三.代码实现

package com.bjsxt; import java.util.Arrays; import java.util.List; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.Function; import org.apache.spark.api.java.function.VoidFunction; import org.apache.spark.broadcast.Broadcast; public class Add {     public static void main(String[] args) {         SparkConf conf = new SparkConf().setAppName("test").setMaster("local");         JavaSparkContext sc = new JavaSparkContext(conf);         /**          * 对于广播变量的理解          */         // list要转换成final类型的修饰         final List asList = Arrays.asList("hello java", "hello python", "hello word");         /**          * 设置广播变量 将aslist广播出去          */         final Broadcast broadcast = sc.broadcast(asList);         JavaRDD rdd1 = sc.parallelize(Arrays.asList("hello java", "hello python", "hello text"));         JavaRDD rdd2 = rdd1.filter(new Function() {             @Override             public Boolean call(String line) throws Exception {                 /**                  * aslist中包含line的部分 然后再在此基础上取反                  */                 // return !asList.contains(line);                 /**                  * 返回广播变量获取的值                  */                 return !broadcast.value().contains(line);             }         });         /**          * 循环打印输出 同时也是触发执行          */         rdd2.foreach(new VoidFunction() {             @Override             public void call(String arg0) throws Exception {                 System.out.println(arg0);             }         });     } }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3