流处理应用的功能设计模式与原则
立即解锁
发布时间: 2025-08-25 00:21:37 阅读量: 1 订阅数: 6 

### 流处理应用的功能设计模式与原则
#### 1. 流操作概述
在许多应用中,特定领域的分析流需要通过各种操作符来进行处理和转换。这些流操作任务包括数据缩减、分区、流拆分、数据丰富和跨流关联等,下面将详细介绍这些操作的原理和相关模式。
#### 2. 流操作原则
##### 2.1 数据量缩减
为了提高吞吐量和处理高数据速率,需要进行数据缩减。常见的数据缩减方法有:
- **过滤**:丢弃与下游处理无关的数据。过滤可以是无状态的,仅根据元组内容决定是否丢弃;也可以是有状态的,还会考虑过滤器累积的状态。例如,在日志监控应用中,无状态过滤可去除不感兴趣的日志事件类型;在传感器网络应用中,有状态过滤可去除与上次报告值相近的读数。
- **采样**:从流中选择代表性的元组子集。可以通过简单的随机采样(基于固定概率选择或丢弃元组)或更高级的算法(如水库采样)实现。
- **聚合**:将多个元组合并为一个,用描述性统计量(如均值、中位数)表示组的摘要。例如,网络监控应用可能需要每分钟的数据使用信息,可将每秒的信息聚合。
- **投影**:从流中移除或替换一个或多个元组属性,不改变元组数量,但可能减小每个元组的大小。
- **量化**:将值从较大的域映射到较小的离散值域。例如,图像处理应用可将32位彩色像素量化为8位灰度像素。
这些数据缩减技术可以单独使用,也可以组合使用,以满足应用的特定需求。
##### 2.2 分区多路复用流
许多应用需要处理来自单个物理流的多个逻辑子流。例如,股票市场数据流中,具有相同股票代码的元组可视为一个子流;入侵检测系统中,具有相同IP地址的元组可视为一个逻辑子流。
处理多路复用流的第一步是确定元组模式中的一个或多个属性作为分区属性,每个属性值的组合代表一个不同的逻辑子流。例如,计算股票的成交量加权平均价格(VWAP)时,股票代码就是分区属性。
一旦定义了分区属性,原始物理流和应用中其他操作符产生的派生流就可以进行多路复用处理。常见的实现支持多路复用处理的操作符的技术是使用哈希表对其内部状态进行分区。在SPL标准工具包中,Aggregate、Join、Barrier和Sort等操作符支持多路复用处理,通过配置partitionBy参数指定用于逻辑解复用入站流的属性。
##### 2.3 流数据丰富
在许多应用中,需要对传入的数据进行丰富。通常使用持久存储中的辅助静态信息(如外部关系数据库、文本文件)或通过远程过程调用访问的其他系统和应用来完成。
例如,在电信应用中处理电话通话记录时,可从单独的关系数据库中获取客户信息,丰富包含通话双方客户标识号的流数据。
丰富操作通常通过基于处理的元组中的信息进行查找操作来实现。为了减轻丰富操作带来的额外计算成本和背压,可根据丰富数据和外部数据的特点采用不同策略:
- 当静态数据集足够小,可在单个主机的内存中存储时,可使用基于缓存的丰富方法,在应用初始化时将数据索引并加载到内存中。
- 当静态数据集太大,无法在单个主机的主内存中存储时,可扩展基于缓存的丰富方法,使用哈希分区策略,将客户数据的非重叠子集存储在不同主机上,并对传入的CDR流进行物理分区。
- 当丰富数据集可以定期更新时,仍可使用基于缓存的丰富方法,定期或按需重建和重新加载查找表。
- 在某些情况下,可采用保持与外部数据源的连接并批量进行查找的方法,以降低查找成本。
##### 2.4 流数据评分
许多流处理应用需要使用历史知识(通常是通过数据挖掘技术从旧数据中提取的模型)来进行分析,这个过程称为评分。
评分与数据丰富类似,但不是直接从其他数据源检索额外信息来扩充当前元组,而是根据存储数据派生的模型对元组进行评分,这个过程可能会产生新属性或更新现有属性。
评分操作也可以从基于内存缓存的方法中受益,尽可能预加载所需的数据挖掘模型,并根据需要定期或按需更新。例如,在情感分析应用中,可使用流文本分析从推特流中提取产品和相关情感信息,并根据评分模型报告产品的正负情感原因和频率。随着应用的运行,可能需要重建评分模型以适应数据的变化。
##### 2.5 流拆分
将处理流拆分为多个独立的下游流是一种广泛应用的流操作原则,可实现不同的并行处理模式,以扩展应用处理更大数据量的能力。流拆分有以下几种形式:
- **复制**:将一个流拆分为两个或多个相同的流,用于并行执行不同的任务。例如,在视频监控应用中,可将视频帧流复制为两个流,分别进行人脸检测和目标检测。
- **垂直分布**:将一个流拆分为两个或多个包含元组属性子集的流。例如,将视频流拆分为音频流和图像流。
- **水平分布**:将一个流拆分为两个或多个包含源流元组子集的流。实现水平拆分有两种基本方法:
- 非基于内容的流拆分机制:不考虑元组内容,按轮询方式拆分。例如,在情感分析应用中,可将推特流按轮询方式拆分,让多个文本分析子图同时处理不同元组。
- 基于内容的流拆分机制:检查元组内容,根据内容路由元组。例如,在日志处理应用中,可将包含多种日志格式的入站日志流拆分为多个出站流,让不同解析器分析日志条目。
##### 2.6 跨流关联
许多应用需要将多个流结合起来,对从不同源提取的数据进行关联,以实现多模态分析。例如,将股票交易所市场数据与新闻和博客文章数据结合,以增强股票和期权的定价和风险模型。
支持关联任务的基本操作包括:
- **并集**:将两个或多个流的元组交错合并为一个具有公共模式的流,元组按接收顺序投影并发出。
- **屏障**:根据元组的到达顺序匹配两个或多个流中的对应元组,常用于重新组合因拆分操作产生的流。
- **合并**:将按给定属性排序的两个或多个流合并为一个按相同属性排序的流。
- **连接**:根据匹配条件在两个或多个流的窗口中匹配元组。
在进行关联操作时,通常需要对齐流,即存在一种机制让关联算法将一个流中的元组与另一个流中的元组关联起来。例如,在屏障操作中,元组的相对到达顺序决定了关联方式;在连接操作中,匹配条件明确了元组的关联方式。同时,需要考虑在处理实时数据时建立流对齐所需的内存量。
##### 2.7 时间模式匹配
在流处理中,检测跨时间的模式是常见任务。例如,在股票市场交易流中,查找特定时间范围内股票价格的M形走势。
时间模式匹配类似于字符串的正则表达式匹配,不同之处在于,正则表达式匹配是匹配字符,而时间模式匹配是匹配事件。这些事件对应于流上定义的谓词,当元组属性值的变化匹配这些谓词时,可提取相应事件并进行模式匹配。
时间模式定义涉及常见的模式匹配操作,如Kleene星运算符(表示事件的零次或多次出现)、检测可选事件、检测析取事件和检测事件组等。时间模式匹配谓词通常引用当前元组属性的值和对元组属性定义的聚合函数的值。
#### 3. 流操作模式
##### 3.1 基于时间的采样
基于时间的采样是一种简单的减少传入流数据量的技术,有两种实现方式:
**内联基于时间的采样**:将连续时间线分割为具有一定周期的离散块,每次元组到达时,检查是否在未发出元组的周期内,如果是则将元组转发下游,否则丢弃。以下是实现该算法的SPL代码:
```
composite InlineTimeBasedSampler(output Sampled; input Source) {
param
expression<float64> $period;
graph
stream<Source> Sampled = Custom(Source) {
logic
state:
mutable float64 nextTime = 0.0;
onTuple Source: {
float64 time = getTimestamp();
if (time>=nextTime) {
submit(Source, Sampled);
while (nextTime<=time)
nextTime += $period;
}
}
}
}
```
**固定间隔基于时间的采样**:以固定间隔产生元组,始终输出最近收到的元组。如果在一段时间内没有新元组到达,则会在连续周期内发出相同的元组。以下是实现该算法的SPL代码:
```
composite FixedIntervalTimeBasedSampler(output Sampled; input Source) {
param
expression<float64> $period;
graph
stream<int32 a> Beat = Beacon() {
param
period: $period;
}
stream<Source> Sampled = Custom(Source; Beat) {
logic
state: {
mutable boolean cached = false;
mutable tuple<Source> lastTuple = {};
}
onTuple Source: {
```
0
0
复制全文
相关推荐










