从浅入深理解流式计算框架Flink

随着互联网的不断发展,行业内对于数据的处理能力和计算的实时性要求都在不断增加,随之而来的是计算框架的升级。经过了十余年开源社区的不断演进,现在计算框架已经从第一代的雅虎开源的Hadoop体系进化到目前主流的Spark框架,这两套框架的计算主要是从强依赖硬盘存储能力的计算发展到了内存计算,大大增强了计算力。下一代计算引擎,也就是第三代计算引擎,将会从计算实时性的角度突破,也就是今天要讲到的Flink框架,本文将从简入深的介绍Flink框架的特点。

基本架构

 

调度层面Flink支持本地运行以及分布式运行两种,分布式运行可以跑在目前主流的基于Yarn体系中,也可以跑在目前业内最主流的K8S中,Flink本质上还是专注于做计算框架的部分,应用于目前行业内主流的调度引擎上而确保一个分布式的计算能力。

 

在核心层主要做的是一件事是如何对流式任务进行编排,流式任务不同于离线任务的最大一个特点在于任务编排上面,比如我们有三个事件分别叫1、2、3。在离线任务中,事件运行是有先后顺序的,比如要先运行1再运行2接着运行3,在流式任务场景下这种事件只有逻辑上的先后关系,实际上是同时触发并执行的。

 

API层面稍后单独用一个模块讲解,在Library方面内置了图计算算法包Gelly和机器学习包FlinkML以及CEP。其中Gelly和FlinkML是基于DataSet API进行开发的,而DataSet API是一个离线批计算的接口,所以本质上Gelly和FlinkML并没有发挥Flink这个天然流式框架的优势。个人觉得,Flink作为Apache相对比较年轻的开源计算框架,对于一些组件化的支持还不完善,相比于Spark生态还有比较大的差距。后续如果能基于Flink Stream API开发出流式的上层应用,会成为Flink的一大亮点。

 

分布式架构层面Flink和Spark或者Hadoop区别不大,整体框架是:

由Flink的Client向Job Master提交任务,Job Master作为整个集群的管理节点。Task Manager是Slave的角色,负责底层的运算工作。Job Master控制整个计算任务的Checkpoint的进度。Task Manager间可以通过数据流的方式交换数据,同时Task Manager在任务的并行化计算方面比MapReduce做的更好,Flink Task Manager是采用多线程的机制进行并行化数据计算,而传统的MapReduce方法采用的是JVM进程的形式。

开发接口架构

作为一个算法发烧友,我还是愿意花更多的篇幅来介绍如何基于Flink框架进行开发。首先看下开放编程接口的API上下游站位关系,

 

最上一层是Flink SQL,这一层其实是一个上级封装,了解机器学习或者其它更复杂编程模型的同学应该比较清楚,并不是所有的逻辑都能通过SQL来实现。不过目前绝大部分的数据实时处理逻辑通过SQL这一层就可以解决。

 

TableAPI这一级可以看出Flink要实现流批一体化的野心,Flink希望可以在流式DataStream API和离线DataSet API之上做一层封装,对用户暴露更多复杂计算的函数,同时基于这一层API实现的功能可以完成流批一体。这个设想是很好的,不过目前还有很多功能没办法在这一级实现,也导致了TableAPI的尴尬。

 

DataStream和DataSet仍是目前的主流编程接口,如果希望在Flink中实现诸如机器学习算法这样负责逻辑的函数,还是要依赖于这一层。至于Runtime内核开发,这个明显是留给非常资深的高级用户来使用,大部分的开发应该不会触碰。

 

如何做流式编程

 

重点讲下DataStream这个开发接口,首先Flink把流式编程模型切分为DataSource模块、Transformation模块和DataSink模块。DataSource和DataSink分别对应着数据的流入和流出。

 

在DataSource和Sink模块,Flink都原生支持了Apache体系内的很多产品的I/O,比如Kafka Connector和Elastic Search Connector等等。同时在数据接入导出方面还内置了很多数据源,

  • readFile接口可以实现读写一些CSV、TXT本地文件

  • Socket数据源可以接收来自其它服务的数据,这个接口非常好,可以让Flink和许多主流的Restful服务适配

 

在Transformation模块,DataStream提供了诸如map、FlatMap、Filter、Reduce、KeyBy这些函数,我个人感觉Flink的这些接口使用起来还是比较方便的,比如要把下面这个二元组类型的数据都+1,

(a,1),(b,2)->(a,2),(b,3)

 

只需要使用map函数作如下处理:

 

val dataStream=env.fromElements((a,1),(b,2))

val mapStream:DataStream[(String,Int)]= dataStream.map(t=>(t._1,t._2+1))

 

流式编程的时间概念与Watermark

流式开发和离线开发的最大区别在于对于数据时间的理解上,离线开发针对的都是有边界数据,有边界的意思是在开发过程中会用到的数据是有限的。而流式应用,因为数据是实时流入的,所以对应的数据是无边界的。以机器学习算法为例,经常需要缓冲一部分数据求区间内的最大值和最小值,那么在无边界数据条件下如何处理呢?这里就应用到了watermark功能。

 

首先介绍下几个时间的概念:

  • Event Time是数据在业务方的真实发生时间,比如某个手机在2019-03-05下午2点被购买,这个时间就是Event Time

  • Ingestion Time指的是数据进入Flink系统的时间,理论上会比Event Time晚一点

  • Processing Time:数据在当前系统被处理的时间,也就是Flink worker机器的时间,这个是Flink系统的默认时间

所以从概念层面理解,用Flink去处理业务最合适的时间是Event Time,而系统默认使用Processing Time是一种简化方法,因为流式数据在录入Flink系统的过程中会出现时间乱序。

 

接着介绍下Window和Watermark的概念,当系统按照Processing Time去流式处理数据的时候,假设某个流式算法需要缓冲5分钟的数据算一次Loss,这个5分钟就是一个Window窗口。但是当5分钟已经结束了,还是没有数据流入计算引擎,这个时候怎么办?接着等还是执行下一个操作。这就用到了Watermark,当等待时间超过Watermark的设定时间,系统就会自动触发计算,无论数据是否满足Window的要求。

写到做后

本文是我学习了Flink的一些资料之后的笔记,可以作为对Flink框架的一个大体了解。其实随着互联网业务的不断发展和计算框架的普及,后续各种广告推荐、商品推荐、金融风控相关的业务都会逐渐从传统的离线计算向流式计算转型。未来Flink在数据业务领域大有可为,期待接下来产业计算的框架升级。

 

<think>好的,用户让我解释一下流式计算框架。首先,我需要回忆一下之前的对话历史。用户之前询问了响应实时派单需要考虑的资源,我提到了流式计算框架如Apache Flink和Kafka Streams。现在他们想更深入了解流式计算框架。 首先,用户可能是在学习或工作中需要处理实时数据,可能是在物流、外卖或类似领域的技术人员,或者是学生。他们可能已经知道流式处理的概念,但需要更系统的解释,或者他们刚开始接触这个概念,想了解其基础和应用。 接下来,我需要定义流式计算框架,说明它与批处理的区别。需要强调实时处理数据的特点,比如数据是连续、无界的,处理是低延迟的。然后要列举一些常见的框架,比如Flink、Kafka Streams、Spark Streaming,说明它们的特点。 用户可能想知道这些框架的应用场景,比如实时监控、推荐系统、物联网等,这样他们可以联系到实际项目。此外,可能需要解释核心概念,如事件时间、窗口、状态管理,这些都是流式处理中的关键点。 还要考虑用户可能的深层需求,比如如何选择合适的框架,或者这些框架如何解决他们之前提到的实时派单中的问题。可能需要举例说明,比如在派单系统中,如何用Flink实时匹配订单和骑手,处理动态变化的数据。 需要确保解释清晰,避免使用过多技术术语,但也要足够详细,让有技术背景的用户能够理解。同时,结构要条理分明,分点列出定义、特点、应用场景、常见框架和核心概念,这样用户容易消化信息。 最后,检查是否有遗漏的重要点,比如容错机制、扩展性,这些在实时系统中很重要。确保回答覆盖了用户可能的疑问,并帮助他们理解流式计算框架在实时派单系统中的角色。</think>### 流式计算框架(Stream Processing Framework) **流式计算框架**是一种专门用于实时处理**连续、无界数据流**的技术工具,其核心目标是实现**低延迟、高吞吐量**的数据处理。与传统的批处理(如 Hadoop、Spark 批处理模式)不同,流式计算框架处理的是**动态生成且永不停止**的数据流(例如传感器数据、用户点击日志、实时交易等)。 --- ### **核心特点** 1. **实时性(Low Latency)** - 数据产生后立即处理,延迟可低至毫秒级,适用于实时监控、告警等场景。 - 例如:滴滴实时匹配订单与司机,外卖系统动态调整骑手路线。 2. **无界数据流(Unbounded Data Streams)** - 数据持续产生,没有明确的“终点”,需支持增量处理。 - 例如:社交媒体中的用户评论流、股票市场实时行情。 3. **容错与状态管理(Fault Tolerance & State Management)** - 自动恢复故障,保证数据不丢失(如通过 Checkpoint 机制)。 - 管理计算过程中的中间状态(如统计过去 1 小时的订单量)。 4. **可扩展性(Scalability)** - 动态扩展计算节点,应对数据流量波动(如双十一期间的订单洪峰)。 --- ### **典型应用场景** 1. **实时监控与告警** - 金融反欺诈:实时检测异常交易。 - 服务器监控:即时发现 CPU/内存异常。 2. **实时分析与统计** - 电商大屏:实时展示成交额、用户活跃度。 - 广告投放:根据用户行为实时调整推荐策略。 3. **事件驱动型业务** - 网约车:实时匹配订单与司机。 - IoT 设备:处理传感器数据流,触发自动控制逻辑。 --- ### **常见流式计算框架** 1. **Apache Flink** - **特点**:支持精确一次(Exactly-Once)语义,兼具低延迟和高吞吐。 - **适用场景**:复杂事件处理(CEP)、实时 ETL、状态化流处理。 2. **Apache Kafka Streams** - **特点**:轻量级库(非独立集群),直接集成 Kafka 消息队列。 - **适用场景**:Kafka 生态内的实时数据转换、聚合。 3. **Apache Spark Streaming** - **特点**:基于微批次(Micro-Batch)模拟流处理,适合已有 Spark 生态的场景。 - **适用场景**:准实时分析(延迟秒级)、与批处理混合的任务。 4. **Storm / Heron** - **特点**:最早的开源流框架,延迟极低(毫秒级),但吞吐量较弱。 - **适用场景**:简单实时计算(如计数、过滤)。 --- ### **核心概念与技术** 1. **事件时间(Event Time) vs 处理时间(Processing Time)** - **事件时间**:数据实际发生的时间(如用户下单时间)。 - **处理时间**:数据到达系统的时间,两者可能因网络延迟产生差异。 2. **窗口(Window)** - 将无界数据流切分为有限块进行处理,例如: - **滚动窗口**:固定时长(如每 5 分钟统计一次)。 - **滑动窗口**:带重叠的窗口(如每 1 分钟统计过去 5 分钟的数据)。 - **会话窗口**:根据数据活跃度动态划分(如用户连续操作间隔超过阈值则关闭窗口)。 3. **水位线(Watermark)** - 用于处理乱序事件,标记“事件时间”的进度,决定何时关闭窗口并输出结果。 4. **状态后端(State Backend)** - 存储中间状态的组件(如内存、RocksDB),影响容错和性能。 --- ### **与传统批处理的对比** | **维度** | **流式计算** | **批处理** | |------------------|----------------------------------|--------------------------------| | **数据特征** | 无界、连续 | 有界、静态 | | **延迟** | 毫秒~秒级 | 分钟~小时级 | | **典型框架** | Flink、Kafka Streams | Hadoop MapReduce、Spark Batch | | **适用场景** | 实时响应 | 离线分析 | --- ### **示例:Flink 实时统计订单金额** ```java DataStream<Order> orders = env.addSource(new KafkaSource()); orders .keyBy(Order::getUserId) .window(TumblingEventTimeWindows.of(Time.minutes(5))) .sum("amount") .print(); ``` - 从 Kafka 读取订单流 → 按用户分组 → 每 5 分钟统计一次消费总额 → 输出结果。 --- ### **挑战与趋势** 1. **流批一体**:同一框架同时支持流与批处理(如 Flink 的 Table API)。 2. **边缘计算**:在靠近数据源的设备端进行实时处理,减少云端压力。 3. **AI 集成**:结合机器学习模型实现实时预测(如动态定价)。 流式计算框架是构建实时系统的核心技术,正在成为大数据领域的标配工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值