spark玩转大数据大数据

Spark的广播变量机制

2017-12-24  本文已影响28人  陈_志鹏

Spark广播变量

什么是广播变量?

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

广播变量使用场景

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


过滤内容
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;

/**
 * <p>Title:BroadcastMain</p>
 * <p>Description:广播变量</p>
 * @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<String> rdd = context.textFile("examples-01/src/main/resources/names");

        //添加过滤的信息
        List list = new ArrayList<String>();
        list.add("java");
        list.add("object-c");

        //使用广播变量
       final Broadcast<List> broadcast = context.broadcast(list);

        JavaRDD<String> filter = rdd.filter(new Function<String, Boolean>() {

            private static final long serialVersionUID = 1L;

            @Override
            public Boolean call(String v1) throws Exception {
                //过滤集合中的内容
                return !broadcast.value().contains(v1);

            }
        });

        //触发执行后的过滤后结果
        List<String> collect = filter.collect();

        for (String str : collect) {
            System.out.println(str);
        }

        context.close();
        context.stop();

    }

}

执行结果:


过滤后结果

为什么要使用广播变量?

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

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

不使用广播变量 使用广播变量

总结

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

使用注意事项

上一篇下一篇

猜你喜欢

热点阅读