大数据技术之flink(7)end

本文介绍了Flink的复杂事件处理(CEP)功能,包括CEP的基本概念、特点,以及Flink CEP库的组件和使用方法。通过示例详细解释了如何定义事件模式、进行模式检测,并处理超时事件。最后,文章强调理解Flink CEP的重要性,预告下篇将继续讲解大数据相关内容。

写在前面

你们好我是啊晨 接着更新Flink技术。
这是Flink最后一篇讲解篇,如有其它需要请阅读我的其它文章
中间有什么问题请留言:

在这里插入图片描述

第十一章Flink CEP 简介

11.1 什么是复杂事件处理 CEP

一个或多个由简单事件构成的事件流通过一定的规则匹配,然后输出用户想得到的数据,满足规则的复杂事件。

特征
目标:从有序的简单事件流中发现一些高阶特征
输入:一个或多个由简单事件构成的事件流
处理:识别简单事件之间的内在联系,多个符合一定规则的简单事件构成复杂事件
输出:满足规则的复杂事件

在这里插入图片描述
CEP 用于分析低延迟、频繁产生的不同来源的事件流。CEP 可以帮助在复杂的、不相关的事件流中找出有意义的模式和复杂的关系,以接近实时或准实时的获得通知并阻止一些行为。

CEP 支持在流上进行模式匹配,根据模式的条件不同,分为连续的条件或不连续的条件;模式的条件允许有时间的限制,当在条件范围内没有达到满足的条件时,会导致模式匹配超时。

看起来很简单,但是它有很多不同的功能:
输入的流数据,尽快产生结果
在 2 个 event 流上,基于时间进行聚合类的计算
提供实时/准实时的警告和通知 在多样的数据源中产生关联并分析模式 高吞吐、低延迟的处理
市场上有多种 CEP 的解决方案,例如Spark、Samza、Beam 等,但他们都没有提供专门的 library(库) 支持。但是 Flink 提供了专门的 CEP library。

11.2 Flink CEP

Flink 为 CEP 提供了专门的 Flink CEP library,它包含如下组件:

Event Stream
pattern 定义
pattern 检测
生成 Alert(警告)

在这里插入图片描述

首先,开发人员要在 DataStream 流上定义出模式条件,之后 Flink CEP 引擎进行模式检测,必要时生成告警。
为了使用 Flink CEP,我们需要导入依赖:

<dependency>
 <groupId>org.apache.flink</groupId>
 <artifactId>flink-cep_${scala.binary.version}</artifactId>
 <version>${flink.version}</version>
</dependency>

Event Streams
以登陆事件流为例:

case class LoginEvent(userId: String, ip: String, eventType: String, eventTi
me: String)
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.setParallelism(1)
val loginEventStream = env.fromCollection(List(
 LoginEvent("1", "192.168.0.1", "fail", "1558430842"),
 LoginEvent("1", "192.168.0.2", "fail", "1558430843"),
 LoginEvent("1", "192.168.0.3", "fail", "1558430844"),
 LoginEvent("2", "192.168.10.10", "success", "1558430845")
)).assignAscendingTimestamps(_.eventTime.toLong)

Pattern API
每个 Pattern 都应该包含几个步骤,或者叫做 state(状态)。从一个 state 到另一个 state,通常我们需要定义一些条件,例如下列的代码:

val loginFailPattern = Pattern.begin[LoginEvent]("begin")
 .where(_.eventType.equals("fail"))
 .next("next")
 .where(_.eventType.equals("fail"))
 .within(Time.seconds(10)

每个 state 都应该有一个标示:例如.begin[LoginEvent] (“begin”)中的"begin"

每个 state 都需要有一个唯一的名字,而且需要一个 filter 来过滤条件,这个过滤条件定义事件需要符合的条件,例如:

.where(_.eventType.equals("fail"))

我们也可以通过 subtype 来限制 event 的子类型:

start.subtype(SubEvent.class).where(...);

事实上,你可以多次调用 subtype 和 where 方法;而且如果 where 条件是不相关的,你可以通过 or 来指定一个单独的 filter 函数:

pattern.where(...).or(...);

之后,我们可以在此条件基础上,通过 next 或者 followedBy 方法切换到下一个state,next 的意思是说上一步符合条件的元素之后紧挨着的元素;而 followedBy 并不要求一定是挨着的元素。这两者分别称为严格近邻和非严格近邻。

val strictNext = start.next("middle")
val nonStrictNext = start.followedBy("middle")

最后,我们可以将所有的 Pattern 的条件限定在一定的时间范围内:

next.within(Time.seconds(10))

这个时间可以是 Processing Time,也可以是 Event Time。

Pattern 检测
通过一个 input DataStream 以及刚刚我们定义的 Pattern,我们可以创建一个PatternStream:

val input = ...
val pattern = ...
val patternStream = CEP.pattern(input, pattern)
val patternStream = CEP.pattern(loginEventStream.keyBy(_.userId), loginFail
Pattern)

一旦获得 PatternStream,我们就可以通过 select 或 flatSelect,从一个 Map 序列找到我们需要的警告信息。

select
select 方法需要实现一个 PatternSelectFunction,通过 select 方法来输出需要的警告。它接受一个 Map 对,包含 string/event,其中 key 为 state 的名字,event 则为真实的Event。

val loginFailDataStream = patternStream
 .select((pattern: Map[String, Iterable[LoginEvent]]) => {
 val first = pattern.getOrElse("begin", null).iterator.next()
 val second = pattern.getOrElse("next", null).iterator.next()
 Warning(first.userId, first.eventTime, second.eventTime, "warning")
 })

其返回值仅为 1 条记录。

flatSelect
通过实现 PatternFlatSelectFunction,实现与 select 相似的功能。唯一的区别就是 flatSelect 方法可以返回多条记录,它通过一个 Collector[OUT]类型的参数来将要输出的数据传递到下游。

超时事件的处理
通过 within 方法,我们的 parttern 规则将匹配的事件限定在一定的窗口范围内。当有超过窗口时间之后到达的 event,我们可以通过在 select 或 flatSelect 中,实现
PatternTimeoutFunction 和 PatternFlatTimeoutFunction 来处理这种情况。

val patternStream: PatternStream[Event] = CEP.pattern(input, pattern)
val outputTag = OutputTag[String]("side-output")
val result: SingleOutputStreamOperator[ComplexEvent] = patternStream.select
(outputTag){
 (pattern: Map[String, Iterable[Event]], timestamp: Long) => TimeoutEvent
()
} {
 pattern: Map[String, Iterable[Event]] => ComplexEvent()
}
val timeoutResult: DataStream<TimeoutEvent> = result.getSideOutput(outputTa
g)

在这里插入图片描述

Flink篇完结,一定敲敲敲着去理解,下篇继续更新大数据其他内容,记得关注点赞支持哈,谢谢观看
单是说不行,要紧的是做。——鲁迅

<think>嗯,用户想了解关于大数据技术毕业论文的内容。首先,我需要确定用户的需求是什么。他们可能是一名即将毕业的学生,正在寻找论文选题的方向,或者需要了解如何组织论文结构,也可能是想了解大数据技术的研究热点。 接下来,我应该考虑大数据技术涵盖哪些领域,比如数据挖掘、机器学习、分布式系统、实时处理、数据安全等。然后,用户可能需要知道如何选择合适的研究题目,这需要结合当前的技术趋势和实际应用。 还要考虑论文的结构,通常包括摘要、引言、文献综述、方法论、实验分析、结论等部分。需要确保用户了解每个部分应包含的内容和写作技巧。 另外,可能的挑战是用户对大数据技术的具体应用场景不太清楚,或者对研究方法如Hadoop、Spark等工具的使用不熟悉。这时候需要给出一些例子,比如在金融、医疗、物流等领域的应用案例。 还要注意用户可能存在的误区,比如认为大数据技术只是处理海量数据,而忽略了数据质量、隐私保护等问题。因此,在建议中需要涵盖这些方面,确保论文的全面性。 最后,要提醒用户注意论文的创新性和实用性,确保他们的研究有实际价值,并且方法可行。可能需要建议他们参考最新的学术论文,关注行业动态,以及进行充分的数据实验和结果分析。</think>以下是大数据技术毕业论文的撰写思路与框架建议,分步骤指导您完成研究: 一、选题方向(结合热点与技术难点) 1. 垂直领域应用 - 医疗健康:$$Hadoop+Spark在基因测序数据并行分析中的优化$$ - 金融风控:$$基于Flink的实时反欺诈模型阈值动态调整算法$$ - 工业制造:$$改进K-means算法在设备预测性维护中的聚类效果$$ 2. 核心技术突破 - 存储优化:$$纠删码技术在HDFS冷数据存储中的写入延迟优化$$ - 计算框架:$$Spark Shuffle阶段数据倾斜问题的动态分区算法$$ - 算法改进:$$融合注意力机制的LSTM时序预测模型$$ 二、论文核心结构(示例模板) ```latex \section{基于改进协同过滤的电商推荐系统} \subsection{问题定义} 传统方法面临稀疏矩阵问题:$$R_{m \times n} = \begin{bmatrix} r_{11} & ? & \cdots \\ ? & r_{22} & \\ \vdots & & \ddots \end{bmatrix}$$ \subsection{创新方案} 提出混合模型:$$ \hat{r}_{ui} = \mu + b_u + b_i + q_i^T \left( p_u + |N(u)|^{-1/2} \sum_{j \in N(u)} y_j \right) $$ \subsection{实验验证} 对比实验设计: \begin{table}[h] \centering \begin{tabular}{lccc} & RMSE & MAE & 覆盖率 \\ \hline 传统CF & 1.23 & 0.89 & 68\% \\ 本文算法 & 0.97 & 0.71 & 82\% \\ \end{tabular} \end{table} ``` 三、关键技术实现要点 1. 数据预处理 - 使用MapReduce处理日志数据: ```java public class LogCleaner extends Mapper<LongWritable, Text, Text, NullWritable> { protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { if(isValidLog(value.toString())){ context.write(value, NullWritable.get()); } } } ``` 2. 算法优化示例 改进DBSCAN聚类: $$ CorePoint(p) \Leftrightarrow |N_\epsilon(p)| \geq MinPts' $$ 其中动态调整:$$ MinPts' = MinPts \times \log(1 + \frac{Density(p)}{AvgDensity}) $$ 四、论文写作建议 1. 创新性体现 - 技术指标对比:将改进算法与基准模型在准确率、响应时间等维度对比 $$ Precision=\frac{TP}{TP+FP},\ Recall=\frac{TP}{TP+FN} $$ - 资源消耗对比:展示内存占用优化效果 $$ \frac{Memory_{原算法}}{Memory_{改进}} = 1.78 $$ 2. 实验设计 - 数据集选择:公开数据集(如Kaggle)与行业数据结合 - 评估指标:除常规指标外,增加QPS(每秒查询率) $$ QPS = \frac{N_{requests}}{T_{total}} $$ 五、最新研究热点参考 1. 联邦学习:$$ \min_w \sum_{k=1}^K \frac{n_k}{n} F_k(w) + \lambda \|w\|^2 $$ 2. 图神经网络
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值