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

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

/* 王家林老师授课http://weibo.com/ilovepains  每天晚上20:00YY频道现场授课频道68917580*/

Spark Streaming实时流处理,对于nc 输入的数据流进行黑名单过滤,并对黑名单输入的次数进行计数。


我们使用广播变量定义黑名单,使用Broadcast广播黑名单到每个Executor中

broadcastList = jsc.sparkContext().broadcast(Arrays.asList("Hadoop","Mahout","Hive"));


全局计数器,用于通知在线过滤了多少各黑名单

accumulator = jsc.sparkContext().accumulator(0, "OnlineBlacklistCounter");


实验步骤:

1、之前好用的的Tcpudp工具报错了,折腾这个浪费了一点时间

第103课:动手实战联合使用Spark Streaming、Broadcast、Accumulator实现在线黑名单过滤和计数_第1张图片


2、重新下载一个windows的nc.exe,java代码中使用hostname pc

在windows cmd命令行中使用nc -l -p 9999 -v,解决了socket 测试数据输入的问题

第103课:动手实战联合使用Spark Streaming、Broadcast、Accumulator实现在线黑名单过滤和计数_第2张图片


3、java代码运行,进行黑名单统计计数,结果如下:


第103课:动手实战联合使用Spark Streaming、Broadcast、Accumulator实现在线黑名单过滤和计数_第3张图片第103课:动手实战联合使用Spark Streaming、Broadcast、Accumulator实现在线黑名单过滤和计数_第4张图片

第103课:动手实战联合使用Spark Streaming、Broadcast、Accumulator实现在线黑名单过滤和计数_第5张图片








第103课:动手实战联合使用Spark Streaming、Broadcast、Accumulator实现在线黑名单过滤和计数_第6张图片


第103课:动手实战联合使用Spark Streaming、Broadcast、Accumulator实现在线黑名单过滤和计数_第7张图片





第103课:动手实战联合使用Spark Streaming、Broadcast、Accumulator实现在线黑名单过滤和计数_第8张图片




第103课:动手实战联合使用Spark Streaming、Broadcast、Accumulator实现在线黑名单过滤和计数_第9张图片







源代码如下:

定义了2个receive,分别接收9999、8888两个端口的数据,9999端口统计黑名单,8888的端口不用做什么。

public class SparkStreamingBroadcastAccumulator {
	
	private static volatile Broadcast> broadcastList = null;
	private static volatile Accumulator accumulator = null;
	public static void main(String[] args) {
		
		SparkConf conf = new SparkConf().setMaster("local[4]").
				setAppName("SparkStreamingBroadcastAccumulator");
		JavaStreamingContext jsc = new JavaStreamingContext(conf, Durations.seconds(15));
		
		/**
		 * 使用Broadcast广播黑名单到每个Executor中
		 */
		broadcastList = jsc.sparkContext().broadcast(Arrays.asList("Hadoop","Mahout","Hive"));
		
		/**
		 * 全局计数器,用于通知在线过滤了多少各黑名单
		 */
		accumulator = jsc.sparkContext().accumulator(0, "OnlineBlacklistCounter");
		
		
		JavaReceiverInputDStream lines = jsc.socketTextStream("pc", 9999);
		 
		JavaReceiverInputDStream lines2 = jsc.socketTextStream("pc", 8888);
		
		JavaPairDStream pairs = lines.mapToPair(new PairFunction() {

			@Override
			public Tuple2 call(String word) throws Exception {
				return new Tuple2(word, 1);
			}
		});
		
		
		JavaPairDStream wordsCount = pairs.reduceByKey(new Function2() { //对相同的Key,进行Value的累计(包括Local和Reducer级别同时Reduce)
			
			@Override
			public Integer call(Integer v1, Integer v2) throws Exception {
				return v1 + v2;
			}
		});
		
		wordsCount.foreachRDD(new Function2, Time, Void> (){

			@Override
			public Void call(JavaPairRDD rdd, Time time) throws Exception {
				System.out.println("IMF the time is" + time );
				rdd.filter(new Function,Boolean>(){

					@Override
					public Boolean call(Tuple2 wordPair) throws Exception {
						if (broadcastList.value().contains(wordPair._1)){
							accumulator.add(wordPair._2);
							return false;
						} else {
							return true;
						}
						
						
					}

					
				}).collect();
				
				System.out.println(" BlackList appeared : " + accumulator.value() + " times");
				return null;
			}
			
		});
		
		
		/*
		 * Spark Streaming执行引擎也就是Driver开始运行,Driver启动的时候是位于一条新的线程中的,当然其内部有消息循环体,用于
		 * 接受应用程序本身或者Executor中的消息;
		 */
		jsc.start();
		
		jsc.awaitTermination();
		jsc.close();

	}

}



你可能感兴趣的:(Hadoop)