Spark的广播变量机制

Spark广播变量

什么是广播变量?

在同一个Execute共享同一份计算逻辑的变量

广播变量使用场景

我现在要在在这些内容中过滤java和object-c


Spark的广播变量机制_第1张图片
过滤内容
  • 使用广播变量过滤代码逻辑:
package com.chenzhipeng.spark.examples01;

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.broadcast.Broadcast;

import java.util.ArrayList;
import java.util.List;

/**
 * 

Title:BroadcastMain

*

Description:广播变量

* @version V1.0 * @author ZhiPeng_Chen * @date: 2017/12/23 */ public class BroadcastMain { public static void main(String[] args) { SparkConf sparkConf = new SparkConf(); sparkConf.setMaster("local").setAppName("BroadcastMain"); JavaSparkContext context = new JavaSparkContext(sparkConf); JavaRDD rdd = context.textFile("examples-01/src/main/resources/names"); //添加过滤的信息 List list = new ArrayList(); list.add("java"); list.add("object-c"); //使用广播变量 final Broadcast broadcast = context.broadcast(list); JavaRDD filter = rdd.filter(new Function() { private static final long serialVersionUID = 1L; @Override public Boolean call(String v1) throws Exception { //过滤集合中的内容 return !broadcast.value().contains(v1); } }); //触发执行后的过滤后结果 List collect = filter.collect(); for (String str : collect) { System.out.println(str); } context.close(); context.stop(); } }

执行结果:


Spark的广播变量机制_第2张图片
过滤后结果

为什么要使用广播变量?

主要用于节约内存的开销。

Driver每次分发任务的时候会把task和计算逻辑的变量发送给Executor,不是使用广播变量会有多份的变量副本。这样会导致消耗大量的内存导致严重的后果。

  • 不使用广播变量:
Spark的广播变量机制_第3张图片
不使用广播变量
  • 使用广播变量:
Spark的广播变量机制_第4张图片
使用广播变量

总结

如果不使用广播变量,task的个数越多越消耗性能,使用广播变量Driver端不管分发有多少个task在同一个Executor只享用同一份变量。

使用注意事项

  • 广播变量在Driver端定义
  • 广播变量在Execoutor只能读取不能修改
  • 广播变量的值只能在Driver端修改

你可能感兴趣的:(Spark的广播变量机制)