写点什么

深入探究 Flink:实时处理与批量处理的完美结合

作者:xfgg
  • 2023-06-08
    福建
  • 本文字数:4859 字

    阅读完需:约 16 分钟

深入探究Flink:实时处理与批量处理的完美结合

引言

每一个生产线都面临着不同的挑战与机遇:数据源不断涌现,数据格式多样、数据额度庞大。实时处理和批量处理对于许多企业都是不可或缺的工具,但它们本身都存在缺陷。然而,随着实时大数据产业不断升级,它们终于找到完美的结合点——谷歌、阿里巴巴等大企业的选择就是 Flink。那么,它究竟是如何成为实时处理与批量处理之间的桥梁呢? 在本文中, 我们将深入探究 Flink 处理引擎,解析它的核心功能,看它如何实现完美的结合。

Flink 简介

Apache Flink 是一个分布式流处理框架,它支持高效、准确、有状态流处理。它是基于事件驱动的模型实现的,可以对无限数据流进行实时计算和处理,同时还支持批处理任务。Flink 的 API 使得用户可以方便地编写复杂的程序并提供了完整的特性集以满足从简单的批处理到复杂的流处理等各种需求。

实时处理和批量处理的介绍

实时处理通常指在数据到达后立即对其进行处理和分析,以便实现即时响应和及时处理。而批处理通常指将一批数据作为一个整体进行处理,一次完成所有计算操作。相比之下,实时处理可以更快地提供分析结果,但在时间和计算资源方面存在一些限制,而批量处理可以处理更大、更复杂的数据集,但在许多情况下需要更长时间。

Flink 之所以被称作实时处理和批量处理完美结合的原因

Flink 不仅能够对无限数据流进行实时计算与处理,同时还可以通过 DataSet API 支持批处理任务。这意味着 Flink 在各种情况下都可以提供高效、准确和可伸缩的数据处理,因此被称为实时处理和批量处理完美结合的数据处理框架。Flink 还允许用户在批处理和流处理之间自由地切换,并结合使用这两种处理模式,从而实现更灵活的计算模式和更快速的分析结果。

实时计算的优势

传统流式计算的困境

在传统的流式计算中,被处理的数据持续不断地流入系统,并需要被立即处理。这通常意味着需要处理海量实时数据,而且需要实时产生对数据趋势和信号的响应。传统的流处理框架(例如 Storm)的计算方式要么是对每个事件都进行单独计算,要么是对数据颗粒较大或固定的时间窗口内的数据进行计算,这种方法往往需要处理海量的事件流,并占用大量的资源,而且对延迟要求较高。

Flink 如何解决传统流式计算的问题

Flink 允许窗口中的数据可以按 event time(事件时间)或 processing time(处理时间)进行分配。Flink 引入迭代式流处理方法来提高延迟,支持 event time 语义,控制 processi  ‌‌‌‌ng 时间戳,减少延迟。此外,Flink 引入了快照机制来保存与执行状态,从而缓解了数据被频繁计算的压力。

Flink 实时计算的优点

相比于传统的流式计算框架,Flink 具有以下优点:

  • 支持可维护和高度可靠的迭代式流处理方法,使其具有良好的延迟和处理能力。

  • 支持闲置资源回收机制“Elastic-scaling 模式”,使得框架可以稳定地应对流和批处理工作量。

  • Flink 提供了灵活的窗口支持以及处理时间和事件时间的处理模式,并能够深度融合机器学习、图工具集与联机事务处理(thick)。

  • Flink 完全向下兼容它的前任程序的调试 APIs 和数据处理流社区库 Streamlib 来提高用户的使用效率。涵盖了单机单轨芯片处理、CPU 和 GPU 协同合作能力扩展使用场景,并广泛裂化数据流规模和目标场景,使其成为业界,标准的、可靠的、高效速,可扩展的数据流处理框架之一。

批量计算的优势

传统离线批量处理的优缺点

传统的离线批量处理一般采用 MapReduce 技术实现,其优点是可以高效处理大规模数据,并且支持离线分析的场景。但是,传统 MapReduce 存在许多局限性,包括无法实现低延迟的数据处理,处理途中缺乏数据保持与维护功能。

Flink 如何实现批量计算

Flink 基于 DataSet API,允许用户使用函数、过滤器和自定义算子等方式通过声明式、SQL 将数据处理成数据集,并在分布式环境中运行。数据集可以从 HDFS、Kafka、Cassandra、任意文件系统和适用于当前端工具库的类型中获取,并使用专门的 set/算子库进行关联、筛选、窗口、聚合等操作。

Flink 批量计算的优点

相比于传统 MapReduce,使用 Flink 进行批量计算,可以有以下优点:

  • 采用倒序迭代,传递到内存中的缓存可以支持所有数据大小而不是可以覆盖一整个分布式集群范围。

  • 使用临时快照即可对流涌入操作(outputs 放在节点本地 DMBSs 中),在并行节点生成并在输出过程中有效级别执行,结果捆绑到临时对象冣中自动发送到指定交点(link out)之一。结果存 储策略必须高效优化,再笔者中完美的结果作为 Datational 内查询的末端保存在至少两种处理节点(*RT 测量函数不存在),方便快速的交换式字段等读 0 时访问操作。

  • 框架能够对处理流程中经常使用的类库和算法集成到自身实现辅助功能中(*RT 测浙功能存在),支持机器学习常在线退火 Flink Online Learning Operator。

  • Flink 提供丰富的窗口化 API 支持,另外在 Flink 中基于回撤机制的实时更新语义开始成为事后计算处理框架中的标准,Flink 缓解了传统批处理的痛点。

  • 可以方便地与实时数据处理相结合,同样的 API 和运行时环境会计量有效地处理 Stream 以及 DataSet 的数据模型,实现全方位数据处理。


Flink 实时处理和批量处理的完美结合

  1. Flink Unified Batch and Stream Processing

Flink 提供了一个统一的、一致的 API 和处理引擎,使得批处理和实时处理能够直接共享代码,被统一管理起来,从而使得它们之间能够通信和互操作,并让组合应用程序更容易实现 和管理。

  1. Flink Batch Processing with Bounded Data Stream

Flink 提供了对有限数据流的批处理支持,实现方式是将数据流划分为有限数据块,并对其执行集合操作,例如:map,reduce 等操作。这样,可以利用 Spark 编程模型的同时,扩展适用性,使元程序实现近似无延迟的批数据处理。

  1. Flink Stream Processing with Unbounded Data Stream

Flink 维护了分布式时间戳,它的窗口操作支持大部分在批处理中出现的窗口类型,如 Tumbling window、Sliding window 和 Session window。它关心时间并以此为基础展开流式计算,更重要而亲后的是,在可靠容错的前提下使得计算结果无限累加,为实时统计分析业务提供了极大的方便。

  1. Flink 时间特性:Processing Time、Event Time、Ingestion Time

Processing Time:处理时间指的是每个记录到达处理器时刻产生的时间戳。一旦达到了视图定义的阈值,则可以强制性地进行 emit 处理。

Event Time:事件时间指的是由数据本身决定所使用的时间戳。对延迟数据(beverage 数据)这一时间戳站的是数据积累的实际小时。同时,还可以将一些明确认为延迟的记录追溯回在线使用它时的正确时刻。

Ingestion Time:是指使用诸如 Kafka、消息列队之类的存储原型时可能保存的时间戳。例如 Segment 固定延迟的领域,Ingestion Time 更为有用。

  1. Flink 支持具有消息丝束的批处理

Flink 支持有状态的丝束处理。他允许对有序消息数据流进行聚合操作,例如:time-window 中的重复方式聚合。 由于丝束处理运行在批处理引擎上,并充分坚定执行计算状态变量;这些特性向分析底层状态变量中的数据问题提供了机会。 分类日志处理、会话分析应用程序以及事件提醒引擎贷款非常适合 Flink 中的批丝束处理。

实际应用之异构计算

异构计算是指将不同技术和设备上的计算资源整合使用,以提升应用程序的性能和效率。类似于仅使用同构计算机进行计算的范例,如在 Flink 中进行批处理或流处理操作,将 Flink 与其他计算引擎协作使用,无疑可以充分发挥各自的技术优势,获得更优异的结果,其主要有以下好处:

  1. 多技术混合使用:将 Flink 与其他计算引擎相结合使用,在编写程序时,可以将程序所需的计算划分成小块,并使用最适合每个块的技术进行计算。

  2. 提升计算性能:通过利用不同计算引擎的特点,异构计算可以将不同部分的计算拆分开来 ou,然后使用最适合处理每个块的技术高效地处理数据。这些技术分别相对于合并全部计算一步获得更优异的处理效果。

  3. 降低计算开销:使用异构计算大幅减少计算程序的内存和 CPU 占用,牺牲可扩展性的同时降低机器边缘上所需的数据序列化开销,使用转模型的方式使得任务直接可移植扩容。

  4. 更佳适应性:数据处理程序几乎被要求随着所需社交解ر影响的计算的复杂程度而异化制定,异构计算能够充分发挥不同的计算引擎,适应不断变复杂的数据计算挑战。

  5. 全面评估资源使用率:异构计算可以更理性地评估资源的利用率,可以精确类比不同技术下的吞吐量,同时跟踪状态。评估结束后,又可以利用合适的方式计算任务资源会篡夺哪种部偏从 MS-DPT 服务器的代码透写的计算技术。

实时处理和批量处理完美结合的 Java 实例

// 导入所需的库import org.apache.flink.api.common.functions.MapFunction;import org.apache.flink.api.java.ExecutionEnvironment;import org.apache.flink.api.java.io.TextInputFormat;import org.apache.flink.api.java.tuple.Tuple2;import org.apache.flink.core.fs.Path;import org.apache.flink.streaming.api.datastream.DataStream;import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class BatchRealTimeExample { public static void main(String[] args) throws Exception { // 创建批量处理环境 final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 读取本地文件 String input = "/path/to/local/file"; env .readFile(new TextInputFormat(new Path(input))) .map(new MapFunction<String, Tuple2<String, Integer>>() { @Override public Tuple2<String, Integer> map(String line) throws Exception { String[] words = line.toLowerCase().split("\\W+"); for (String word : words) { if (word.length() > 0) { return new Tuple2<String, Integer>(word, 1); } } return null; } }) .groupBy(0) .sum(1) .print(); // 创建实时处理环境 final StreamExecutionEnvironment streamingEnv = StreamExecutionEnvironment.getExecutionEnvironment(); // 读取kafka消息 DataStream<String> inputKafkaStream = streamingEnv.addSource(new FlinkKafkaConsumer09<>("topic-name", new SimpleStringSchema(), getKafkaProperties())); inputKafkaStream .map(new MapFunction<String, Tuple2<String, Integer>>() { @Override public Tuple2<String, Integer> map(String line) throws Exception { String[] words = line.toLowerCase().split("\\W+"); for (String word : words) { if (word.length() > 0) { return new Tuple2<String, Integer>(word, 1); } } return null; } }) .keyBy(0) .sum(1) .print(); // 提交作业 streamingEnv.execute("Batch RealTime Example"); }}
复制代码

该例子展示了如何在相同的 Java 程序中,结合 Flink 的批处理和实时处理进行流处理操作。批处理部分使用 ExecutionEnvironment 来读取本地文件,将所有单词都转换成小写,并按单词统计数量。接着,每个单词当作 key,与每个 value 对应时 1 这个 Tuple2 键值对利用 groupBy 进行求和,最后输出结果。


实时处理部分使用了 StreamExecutionEnvironment 和 FlinkKafkaConsumer09 在一个 topic 上读取消息。流被 map,分配一个字符串的单词,并过滤空单词,再与一个 1Tuple2 键值对发送到 Sum 算子,每个单词仅经过一次计算得出对应的 sum 总和。最终结果将被输出。


需要注意的是,在使用 end()方法将 Pipeline 执行环境传递给 StreamExecutionEnvironment 之前,需要确保批执行计划已经停止。这样,完整的批处理作业和实时处理作业将被同时发送到 Flink,并启动检查点/恢复机制。同时,该例子中执行实时处理从 Kafka 读取消息和批处理读取本地文件的操作非常简单。要使用 Hadoop 文件系统等其他类型的输入流,只需要相应调整 IO 方法,并在处理器中保留核心逻辑。

发布于: 刚刚阅读数: 6
用户头像

xfgg

关注

THINK TWICE! CODE ONCE! 2022-11-03 加入

目前:全栈工程师(前端+后端+大数据) 目标:架构师

评论

发布
暂无评论
深入探究Flink:实时处理与批量处理的完美结合_Java_xfgg_InfoQ写作社区