流式计算中的window机制

本文深入探讨了流式计算中的window机制,包括watermark的概念及其在处理乱序数据中的作用,详细介绍了滚动窗口、滑动窗口和会话窗口的原理和应用场景。同时,文章通过两个具体的业务案例展示了如何利用Flink SQL解决实时计算问题,讨论了增量计算和全量计算的差异,以及高级优化策略,如Mini-batch优化、倾斜优化和状态复用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、摘要

  1. 概述流式计算跟批计算,以及实时数仓和离线数仓的区别;引出流式计算中的window计算定义以及挑战
  2. 介绍实时计算中的Watermark概念,以及如何产生、传递,还有一些典型的生产实践中遇到的问题
  3. 介绍三种最基本的window类型,以及他们的实现原理;同时会结合业务场景介绍一些高级优化的功能和原理
  4. 结合两个真实业务场景的需求,讲解window是如何解决实际生产问题的(字节Flink使用量峰值90亿QPS)
QPS:全名 Queries Per Second,意思是“每秒查询率”,是一台服务器每秒能够响应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准

二、概述流式计算机制

简述流式计算的基本概念,与批式计算相比的难点和挑战

    数据价值:实时性越高,数据价值越高

2.1批处理

批处理模型典型的数仓架构为T+1架构,即数据计算时天级别的,当天只能看到前一天的计算结果
通常使用的计算引擎为Hive或者Spark等。计算的时候,数据是完全ready的,输入和输出都是确定性的

2.2实时处理

实时计算:处理时间窗口
数据实时流动,实时计算,窗口结束直接发送结果,不需要周期调度任务

处理时间(Processing time):数据在流式计算系统中真正处理时所在机器的当前时间。
处理时间这是在系统中观察事件的时间
事件时间(Event time):数据产生的时间,比如客户端、传感器、后端代码等上报数据时的时间。
事件时间这是事件实际发生的时间

实时计算:事件时间窗口(传入,运算,到输出时间总和)
数据实时进入到真实事件发生的窗口中进行计算,可以有效的处理数据延迟和乱序

窗口真实结束时间(延迟与乱序)衡量:watermark
在数据中插入—些watermark,来表示当前的真实时间。
在数据存在乱序的时候,watermark就比较重要了,它可以用来在乱序容忍和实时性之间做一个平衡。


三、watermark(水印)

Watermark的含义、生成方法、传递机制,以及—些典型场景的问题和优化

    概念:表示系统认为的当前真实的事件时间

3.1产生watermark

可以通过Watermark Generator 来生成
一般是从数据的事件时间来产生,产生策略可以灵活多样,最常见的包括使用当前事件时间的时

### Softmax 的流式计算实现 Softmax 函数是一种常用的激活函数,在机器学习领域广泛应用于分类问题。其核心作用是对输入向量进行指数化处理,并将其归一化为概率分布形式。然而,当面对大规模数据集或实时应用场景时,传统的 softmax 计算可能无法满足性能需求。因此,引入流式计算来优化 softmax 的效率变得尤为重要。 #### 背景知识 在传统 softmax 中,计算过程可以表示为: \[ P(y=i|x) = \frac{e^{z_i}}{\sum_{j=1}^{N} e^{z_j}} \] 其中 \( z_i \) 是第 i 个类别的得分值,\( N \) 表示类别总数。此公式的分母部分涉及全局求和操作,这可能导致高时间复杂度以及内存占用增加的问题。为了应对这一挑战,可以通过以下方式实现流式计算版本的 softmax。 --- #### 方法一:基于滑动窗口的局部规范化 一种常见的策略是采用 **滑动窗口技术** 来近似整个 softmax 输出。具体而言,仅考虑当前时刻及其附近若干步的数据作为上下文范围,从而减少不必要的全局计算开销。 代码示例如下: ```python import numpy as np def streaming_softmax(scores, window_size=5): """ 使用滑动窗口机制实现流式 softmax。 参数: scores (list): 输入分数列表。 window_size (int): 滑动窗口大小,默认为 5。 返回: list: 经过 softmax 处理后的结果。 """ result = [] exp_scores = np.exp(scores) for idx in range(len(exp_scores)): start_idx = max(0, idx - window_size // 2) end_idx = min(len(exp_scores), idx + window_size // 2 + 1) local_sum = sum(exp_scores[start_idx:end_idx]) prob = exp_scores[idx] / local_sum if local_sum != 0 else 0 result.append(prob) return result ``` 这种方法的核心在于通过限定窗口内的元素数量降低每次迭代所需的计算成本[^1]。 --- #### 方法二:增量更新法 另一种更高效的解决方案称为 **增量更新法**,它利用前一步的结果动态调整当前状态下的 softmax 值,而无需重新执行完整的指数运算与归一化步骤。 以下是其实现逻辑: ```python class StreamingSoftmax: def __init__(self): self.cumulative_exp_sum = 0 self.prev_score = None def update(self, new_score): """ 更新 softmax 结果。 参数: new_score (float): 新增项的原始得分。 返回: float: 当前位置对应的 softmax 概率估计。 """ if self.prev_score is not None: # 移除旧项的影响 old_term = np.exp(self.prev_score) self.cumulative_exp_sum -= old_term current_exp = np.exp(new_score) self.cumulative_exp_sum += current_exp probability = current_exp / self.cumulative_exp_sum if self.cumulative_exp_sum != 0 else 0 # 缓存最新一项用于后续移除 self.prev_score = new_score return probability ``` 上述算法假设我们始终维护一个固定长度的历史记录队列,并不断替换最早加入的一项以保持整体结构稳定[^2]。 --- #### 方法三:结合 GPU 加速的大规模分布式实现 如果目标场景涉及到极其庞大的维度或者超多批次样本,则可借助 MATLAB 或其他框架所提供的 GPU 支持功能进一步提升运行效能。例如,在 MATLAB 平台上创建 gpuArray 对象存储中间变量即可自动完成底层硬件调度工作;而在 Python 生态圈里也有类似的库比如 TensorFlow 和 PyTorch 提供相应接口简化开发流程。 下面给出一段伪代码展示如何调用这些工具完成任务: ```python import tensorflow as tf # 初始化设备配置 with tf.device('/GPU:0'): input_tensor = tf.constant([your_data], dtype=tf.float32) output_probs = tf.nn.softmax(input_tensor) ``` 此处需要注意的是实际部署过程中还需要充分考虑到通信延迟等因素影响最终表现效果。 --- ### 总结 综上所述,针对不同业务需求可以选择合适的技术路线达成目的——从小巧灵活适用于嵌入式系统的简单启发式估算方案直到依托先进计算资源驱动的强大端到端流水线架构都有各自适用场合。无论采取哪种途径都应紧密结合项目具体情况权衡利弊做出明智决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值