一、transform以及实时黑名单过滤案例实战

1、概述

transform操作,应用在DStream上时,可以用于执行任意的RDD到RDD的转换操作。它可以用于实现,DStream API中所没有提供的操作。比如说,DStream API中,
并没有提供将一个DStream中的每个batch,与一个特定的RDD进行join的操作。但是我们自己就可以使用transform操作来实现该功能。 DStream.join(),只能join其他DStream。在DStream每个batch的RDD计算出来之后,会去跟其他DStream的RDD进行join。 案例:广告计费日志实时黑名单过滤

2、java案例

package cn.spark.study.streaming;

import java.util.ArrayList;
import java.util.List; import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
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 com.google.common.base.Optional; import scala.Tuple2; /**
* 基于transform的实时广告计费日志黑名单过滤
*
* @author bcqf
*
*/
public class TransformBlacklist { @SuppressWarnings("deprecation")
public static void main(String[] args) {
SparkConf conf = new SparkConf()
.setMaster("local[2]")
.setAppName("TransformBlacklist");
JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(5)); // 用户对我们的网站上的广告可以进行点击
// 点击之后,是不是要进行实时计费,点一下,算一次钱
// 但是,对于那些帮助某些无良商家刷广告的人,那么我们有一个黑名单
// 只要是黑名单中的用户点击的广告,我们就给过滤掉 // 先做一份模拟的黑名单RDD
List<Tuple2<String, Boolean>> blacklist = new ArrayList<Tuple2<String, Boolean>>();
blacklist.add(new Tuple2<String, Boolean>("tom", true));
final JavaPairRDD<String, Boolean> blacklistRDD = jssc.sc().parallelizePairs(blacklist); // 这里的日志格式,就简化一下,就是date username的方式
JavaReceiverInputDStream<String> adsClickLogDStream = jssc.socketTextStream("spark1", 9999); // 所以,要先对输入的数据,进行一下转换操作,变成,(username, date username)
// 以便于,后面对每个batch RDD,与定义好的黑名单RDD进行join操作
JavaPairDStream<String, String> userAdsClickLogDStream = adsClickLogDStream.mapToPair( new PairFunction<String, String, String>() { private static final long serialVersionUID = 1L; @Override
public Tuple2<String, String> call(String adsClickLog)
throws Exception {
return new Tuple2<String, String>(
adsClickLog.split(" ")[1], adsClickLog);
} }); // 然后,就可以执行transform操作了,将每个batch的RDD,与黑名单RDD进行join、filter、map等操作
// 实时进行黑名单过滤
JavaDStream<String> validAdsClickLogDStream = userAdsClickLogDStream.transform( new Function<JavaPairRDD<String,String>, JavaRDD<String>>() { private static final long serialVersionUID = 1L; @Override
public JavaRDD<String> call(JavaPairRDD<String, String> userAdsClickLogRDD)
throws Exception {
// 这里为什么用左外连接?
// 因为,并不是每个用户都存在于黑名单中的
// 所以,如果直接用join,那么没有存在于黑名单中的数据,会无法join到
// 就给丢弃掉了
// 所以,这里用leftOuterJoin,就是说,哪怕一个user不在黑名单RDD中,没有join到
// 也还是会被保存下来的
JavaPairRDD<String, Tuple2<String, Optional<Boolean>>> joinedRDD =
userAdsClickLogRDD.leftOuterJoin(blacklistRDD); // 连接之后,执行filter算子
JavaPairRDD<String, Tuple2<String, Optional<Boolean>>> filteredRDD =
joinedRDD.filter( new Function<Tuple2<String,
Tuple2<String,Optional<Boolean>>>, Boolean>() { private static final long serialVersionUID = 1L; @Override
public Boolean call(
Tuple2<String,
Tuple2<String, Optional<Boolean>>> tuple)
throws Exception {
// 这里的tuple,就是每个用户,对应的访问日志,和在黑名单中
// 的状态
if(tuple._2._2().isPresent() &&
tuple._2._2.get()) {
return false;
}
return true;
} }); // 此时,filteredRDD中,就只剩下没有被黑名单过滤的用户点击了
// 进行map操作,转换成我们想要的格式
JavaRDD<String> validAdsClickLogRDD = filteredRDD.map( new Function<Tuple2<String,Tuple2<String,Optional<Boolean>>>, String>() { private static final long serialVersionUID = 1L; @Override
public String call(
Tuple2<String, Tuple2<String, Optional<Boolean>>> tuple)
throws Exception {
return tuple._2._1;
} });
//
return validAdsClickLogRDD;
} }); // 打印有效的广告点击日志
// 其实在真实企业场景中,这里后面就可以走写入kafka、ActiveMQ等这种中间件消息队列
// 然后再开发一个专门的后台服务,作为广告计费服务,执行实时的广告计费,这里就是只拿到了有效的广告点击
validAdsClickLogDStream.print(); jssc.start();
jssc.awaitTermination();
jssc.close();
} } ##在eclipse中运行程序 ##服务器端运行nc
[root@spark1 kafka]# nc -lk 9999
20150814 marry
20150814 tom ##结果,tom已经被过滤掉了
20150814 marry

2、scala案例

package cn.spark.study.streaming

import org.apache.spark.SparkConf
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.streaming.Seconds /**
* @author bcqf
*/
object TransformBlacklist { def main(args: Array[String]): Unit = {
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("TransformBlacklist")
val ssc = new StreamingContext(conf, Seconds(5)) val blacklist = Array(("tom", true))
val blacklistRDD = ssc.sparkContext.parallelize(blacklist, 5) val adsClickLogDStream = ssc.socketTextStream("spark1", 9999)
val userAdsClickLogDStream = adsClickLogDStream
.map { adsClickLog => (adsClickLog.split(" ")(1), adsClickLog) } val validAdsClickLogDStream = userAdsClickLogDStream.transform(userAdsClickLogRDD => {
val joinedRDD = userAdsClickLogRDD.leftOuterJoin(blacklistRDD)
val filteredRDD = joinedRDD.filter(tuple => {
if(tuple._2._2.getOrElse(false)) {
false
} else {
true
}
})
val validAdsClickLogRDD = filteredRDD.map(tuple => tuple._2._1)
validAdsClickLogRDD
}) validAdsClickLogDStream.print() ssc.start()
ssc.awaitTermination()
} }

56、Spark Streaming: transform以及实时黑名单过滤案例实战的更多相关文章

  1. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

  2. 基于Spark Streaming + Canal + Kafka对Mysql增量数据实时进行监测分析

    Spark Streaming可以用于实时流项目的开发,实时流项目的数据源除了可以来源于日志.文件.网络端口等,常常也有这种需求,那就是实时分析处理MySQL中的增量数据.面对这种需求当然我们可以通过 ...

  3. 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用

    https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...

  4. 【慕课网实战】Spark Streaming实时流处理项目实战笔记八之铭文升级版

    铭文一级: Spark Streaming is an extension of the core Spark API that enables scalable, high-throughput, ...

  5. 【Streaming】30分钟概览Spark Streaming 实时计算

    本文主要介绍四个问题: 什么是Spark Streaming实时计算? Spark实时计算原理流程是什么? Spark 2.X下一代实时计算框架Structured Streaming Spark S ...

  6. spark streaming (二)

    一.基础核心概念 1.StreamingContext详解 (一) 有两种创建StreamingContext的方式:             val conf = new SparkConf().s ...

  7. Spark调优 | Spark Streaming 调优

    Spark调优 | Spark Streaming 调优 1.数据序列化 2.广播大变量 3.数据处理和接收时的并行度 4.设置合理的批处理间隔 5.内存优化 5.1 内存管理 5.2优化策略 5.3 ...

  8. Spark Streaming笔记

    Spark Streaming学习笔记 liunx系统的习惯创建hadoop用户在hadoop根目录(/home/hadoop)上创建如下目录app 存放所有软件的安装目录 app/tmp 存放临时文 ...

  9. Spark Streaming中空batches处理的两种方法(转)

    原文链接:Spark Streaming中空batches处理的两种方法 Spark Streaming是近实时(near real time)的小批处理系统.对给定的时间间隔(interval),S ...

随机推荐

  1. HTTP协议的认识

    1.内容回顾 1.HTTP协议消息的格式: 1.请求(request) 请求方法 路径 HTTP/1.1 \r\n k1:v1\r\n ...\r\n \r\n 请求体 <--这里可以有可以没有 ...

  2. Java之路---Day02

    2019-10-17-20:21:22 顺序结构: 概述:顺序执行,根据编写的顺序,从上到下执行语句 判断语句1-if: if语句第一种格式: if(关系表达式){ 语句体; } 执行流程: 1.首先 ...

  3. 换个语言学一下 Golang (6)——控制流程

    Go语言的控制结构关键字只有if..else if..else ,for 和 switch. 而且在Go中,为了避免格式化战争,对程序结构做了统一的强制的规定.看下下面的例子. 请比较一下A程序和B程 ...

  4. 2019-07-25 php错误级别及设置方法

    在php的开发过程里,我们总是会有一系列的错误警告,这些错误警告在我们开发的过程中是十分需要的,因为它能够提示我们在哪里出现了错误,以便修改和维护.但在网站开发结束投入使用时,这些报错我们就要尽量避免 ...

  5. springCloud学习5(Spring-Cloud-Stream事件驱动)

    springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33 代码见文章结尾   想想平常生活中做饭的场景,在用电饭锅做饭的同时, ...

  6. 彻底解决unable to find valid certification path to requested target

    安装证书. 下载证书 第一步是要下载证书 去你程序要访问的网站,点击那个锁按钮,并点击查看详情(chrome浏览器) 点击View certificate 点击详细信息 复制到文件 下一步 选择格式 ...

  7. nginx服务器除了更目录可以访问,其他都出现404

    配置如下: listen 80; server_name www.hongtaofei.com; location / { root /home/www/shop/public; index inde ...

  8. 【故障处理】ORA-19809错误处理

    [故障处理]ORA-19809错误处理 一.1  BLOG文档结构图       一.2  前言部分 一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它 ...

  9. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  10. Python 3.6 版本-使用Pytesseract 模块进行图像验证码识别

    环境: (1) win7 64位 (2) Idea (3) python 3.6 (4) pip install pillow <&nbsp>pip install pytesse ...