Flink 基础教程

Flink 的一个优势是,它拥有诸多重要的流式计算功能。其他项目为了实现这些功能,都不得不付出代价。比如,Storm 实现了低延迟,但是做不到高吞吐,也不能在故障发生时准确地处理计算状态;Spark Streaming 通过采用微批处理方法实现了高吞吐和容错性,但是牺牲了低延迟和实时处理能力,也不能使窗口与自然时间相匹配,并且表现力欠佳。

初探 Flink

Apache Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架。Flink 不仅能提供同时支持高吞吐和 exactly-once 语义的实时计算,还能提供批量数据处理。

Flink 起源于 Stratosphere 项目, Stratosphere 是在 2010~2014 年由 3 所地处柏林的大学和欧洲的一些其他的大学共同进行的研究项目。2014 年 4 月,Stratosphere 的代码被复制并捐献给了 Apache 软件基金会,Flink 一词在德语中表示快速和灵巧。项目采用一只松鼠的彩色图案作为 logo,这不仅因为松鼠具有快速和灵巧的特点,还因为柏林的松鼠有一种迷人的红棕色。

批处理与流处理

Flink 的核心计算构造是 Flink Runtime 执行引擎,它是一个分布式系统,能够接受数据流程序并在一台或多台机器上以容错方式执行。 Flink Runtime 执行引擎可以作为 YARN(Yet Another Resource Negotiator)的应用程序在集群上运行,也可以在 Mesos 集群上运行,还可以在单机上运行(这对于调试 Flink 应用程序来说非常有用)。

Flink 分别提供了面向流处理的接口(DataStream API)和面向批处理的接口(DataSet API)。因此,Flink 既可以完成流处理,也可以完成批处理。Flink 支持的拓展库涉及机器学习(FlinkML)、复杂事件处理(CEP),以及图计算(Gelly),还有分别针对流处理和批处理的 Table API。

Flink 提供了封装在 Runtime 执行引擎之上的 API,以帮助用户更方便地生成流式计算程序。

Flink 项目的架构有两个主要组成部分:消息传输层和由 Flink 提供的流处理层。消息传输层负责传输连续事件产生的消息,能够提供消息传输的系统包括 Kafka 和 MapR Streams。

对时间的处理

采用批处理架构

用定期运行的批处理作业来实现应用程序的持续性。数据被持续地分割为文件(如以一小时为单位);然后,批处理作业将文件作为输入,以此达到持续处理数据的效果。

采用流处理架构计数

通过流处理架构实现应用程序的持续性。水平圆柱体表示消息传输系统(Kafka 或 MapR Streams)。消息传输系统为负责处理所有数据的流处理器(在本例中是 Flink)提供流数据。

DataStream<LogEvent> stream = env
    // 通过Kafka生成数据流
    .addSource(new FlinkKafkaConsumer(...)) 
    // 分组
   .keyBy("country")
    // 将时间窗口设为60分钟 
    .timeWindow(Time.minutes(60))
    // 针对每个时间窗口进行操作 
    .apply(new CountPerWindowFunction());

流处理区别于批处理最主要的两点是:流即是流,不必人为地将它分割为文件;时间的定义被明确地写入应用程序代码(如以上代码的时间窗口),而不是与摄取、计算和调度等过程牵扯不清。

时间概念

在流处理中,主要有两个时间概念:

  • 事件时间,即事件实际发生的时间。

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。