关闭

动手实战联合使用Spark Streaming、Broadcast、Accumulator计数器实现在线黑名单过滤和计数

标签: sparkbroadcast
1803人阅读 评论(0) 收藏 举报
分类:

本博文主要包括:
1、Spark Streaming与Broadcast、Accumulator联合
2、在线黑名单过滤和计数实战

一、Spark Streaming与Broadcast、Accumulator联合:

在企业实战中,广播本身广播到集群的时候,联合上计数器的话就有很大杀伤力,这时候你可以自定义,例如自定义广播中的内容,可以实现非常复杂的内容。

之所以广播和计数器特别重要,一方面鉴于广播和计数器本身的特性,另一方面广播和计数器可以说实现非常复杂的操作。在线黑名单过滤实战中,将黑名单放在广播中,有Accumulator你可以计数黑名单。

二、在线黑名单过滤和计数实战:

1、代码如下:

import org.apache.spark.Accumulator;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.broadcast.Broadcast;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.Time;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import scala.Tuple2;

import java.util.Arrays;
import java.util.List;

/**
 * Created by zpf on 2016/8/31.
 */
public class SparkStreamingBroadcastAccumulator {

    private static volatile Broadcast<List<String>> broadcastList = null;
    private static volatile Accumulator<Integer> accumulator = null;

    public void main(String[] args) throws InterruptedException {

        SparkConf conf = new SparkConf().setMaster("local[2]").
                setAppName("SparkStreamingBroadcastAccumulator");


        JavaStreamingContext jsc = new JavaStreamingContext(conf, Durations.seconds(15));

        //实例化我们的broadcast,使用Broadcast广播黑名单到每个Executor中
        broadcastList = jsc.sparkContext().broadcast(Arrays.asList("Hadoop","Mahout","Hive"));
      /*全局计数器,用于统计在线过滤多少黑名单
      * */
        accumulator = jsc.sparkContext().accumulator(0,"OnlineBlacklistCount");

        JavaReceiverInputDStream lines = jsc.socketTextStream("Master",9999);

        JavaPairDStream<String,Integer> pairs = lines.mapToPair(new PairFunction<String,String,Integer>() {

            public Tuple2<String,Integer> call(String word) throws Exception {
                return new Tuple2<String, Integer>(word,1);
            }
        });

        JavaPairDStream<String,Integer> wordsCount = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
            public Integer call(Integer v1, Integer v2) throws Exception {
                return v1+v2;
            }
        });

        /*过滤黑明单我们一般把内容写在foreach中*/

        wordsCount.foreachRDD(new Function2<JavaPairRDD<String,Integer>, Time, Void>(){

            public Void call(JavaPairRDD<String, Integer> rdd, Time time) throws Exception {
                rdd.filter(new Function<Tuple2<String, Integer>, Boolean>() {
                    public Boolean call(Tuple2<String, Integer> wordPair) throws Exception {
                        if(broadcastList.value().contains(wordPair._1)){
                            accumulator.add(wordPair._2);
                            return false;

                        }else{
                            return true;
                        }
                    }



                }).collect();

//                System.out.println(broadcastList.value().toString() + ":" + accumulator.value());
                System.out.println("BlackList append : " + ":" + accumulator.value() + "times");
                return null;


            }
        });



        jsc.start();

        jsc.awaitTermination();

        jsc.close();
    }

}

2、在命令端输入数据

nc -lk 9999

3、观察结果

这里写图片描述

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

SparkStreaming之Accumulators和Broadcast

1、Accumulators和Broadcast基础理解 共享变量 共享变量目的是将一个变量缓存在每台机器上,而不用在任务之间传递。在SparkCore中经常广播一些环境变量, 目的是使得在同一时间集...
  • legotime
  • legotime
  • 2016-07-06 07:49
  • 2870

第103讲: 动手实战联合使用Spark Streaming、Broadcast、Accumulator实现在线黑名单过滤和计数

1:广播可以自定义,例如你自定义广播里面的内容,就有很多你可以自定义的操作。尤其是结合了Broadcast和Accumulator的时候,他可以实现一些非常复杂的功能。 2:广播和计数器在企业的实际开...
  • qq_21234493
  • qq_21234493
  • 2016-05-22 17:13
  • 1165

Spark大师之路:广播变量(Broadcast)源码分析

概述 最近工作上忙死了……广播变量这一块其实早就看过了,一直没有贴出来。 本文基于Spark 1.0源码分析,主要探讨广播变量的初始化、创建、读取以及清除。   类关系 BroadcastManage...
  • doggie_wangtao
  • doggie_wangtao
  • 2014-07-09 01:59
  • 8382

Spark的广播和累加器的使用

广播和计数器的解释1.1 广播: 广播变量允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量。广播变量可被用于有效地给每个节点一个大输入数据集的副本。Spark还尝试使用高效地广播...
  • lxhandlbb
  • lxhandlbb
  • 2016-07-17 12:19
  • 9029

spark 基本方法

 转换(Transformations) Transformation Meaning map( func) 返回一个新的分布式数据集...
  • ws_developer
  • ws_developer
  • 2016-06-01 16:01
  • 1272

Spark累加器

Accumulator(累加器, 计数器) 类似于MapReduce中的counter, 将数据从一个节点发送到其他各个节 点上去; 通常用于监控, 调试, 记录符合某类特征的数据数目等 累加器在Dr...
  • sunspeedzy
  • sunspeedzy
  • 2017-04-10 11:07
  • 301

关于Spark的Broadcast解析

首先,推荐下大神的文章,http://blog.csdn.net/column/details/spark.html 仅作为大神未未提到的细枝末节,进行补充。 Broadcast(广播)是相对较为...
  • w412692660
  • w412692660
  • 2015-02-08 22:44
  • 22367

spark2.1.0自定义累加器AccumulatorV2的使用

spark2.1.0自定义累加器AccumulatorV2的使用
  • ASAS1314
  • ASAS1314
  • 2017-01-16 10:35
  • 2532

第39课:Spark中的Broadcast和Accumulator机制解密

第39课:Spark中的Broadcast和Accumulator机制解密Spark的Broadcast和Accumulator很重要,在实际的企业级开发环境中一般会使用Broadcast和Accum...
  • duan_zhihua
  • duan_zhihua
  • 2017-06-04 13:46
  • 483

Spark源码解读(8)——累加器

首先,看下以下代码: var value = 0 sc.parallelize(1 to 10).foreach(i=>value += i) value这里value的结果仍然为0 这个比较好解...
  • scalahome
  • scalahome
  • 2016-08-01 21:43
  • 390
    个人资料
    • 访问:72660次
    • 积分:1212
    • 等级:
    • 排名:千里之外
    • 原创:50篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论