Flink教程(万字图文全面详解)

Flink教程(万字图文全面详解)-mikechen

Flink定义

Flink是Apache Apache的一个开源的流处理框架,用于在无边界和有边界数据流上进行有状态的计算。

 

为什么需要Flink

在Flink之前主流的计算框架以Hadoop和Spark占据主流,Hadoop是第一代大数据计算框架,而其后的Spark则是在Hadoop的基础上进行内存计算,实现了计算性能上的大大提升。

但是,随着流处理概念的兴起,Spark并不擅长流处理,因此催生了Flink流处理技术。

Flink框架可以说是实现真正意义上的实时流处理,大大降低了流计算的延迟,更能满足当下的大数据处理需求。

 

Flink特点

Flink 特点如下:

1.处理无界和有界数据

无界流有一个起点,但没有定义的终点,这就是无界数据流。

有界流具有定义的开始和结束,可以通过在执行任何计算之前提取所有数据来处理有界流。

Flink擅长处理无边界和有界的数据集。

 

2.分布式

Flink 程序可以运行在分布式环境下,高性能架构。

 

3.高可用

在分布式系统中,为了保证服务能够 7 * 2 4小时稳定运行, Flink不仅提供故障处理,而且还要能能够持久化服务内部各个组件的当前状态。

 

4.准确性

Flink 可以保证数据处理的准确性。

 

Flink应用场景

Flink 应用场景,主要分为如下5类:

1.在线系统

实时计算各类数据指标,并利用实时结果及时调整在线系统的相关策略,并应用于内容投放、智能推送领域。

比如:淘宝的双十一实时战报大屏,就是利用流式计算得出实时结果,直接被推送到前端应用。

 

2.监控预警

对系统和用户行为进行实时监测和分析,以便及时发现危险行为,比如:基于规则的报警。

 

3.数据分析

数据分析任务需要从原始数据中,提取有价值的信息和指标,从而实时输出,比如:电信网络质量监控。

 

4.实时报表

实时化采集,加工流式数据存储,实时监控和展现业务、客户各类指标,让数据化运营实时化。

 

5.数据管道应用

数据管道可以用来监控文件系统目录中的新文件,并将其数据写入事件日志,另一个应用可能会将事件流物化到数据库或增量构建和优化查询索引,比如:电子商务中的持续 ETL。

 

Flink架构

Flink架构,如下图所示:

Flink教程(万字图文全面详解)-mikechen

Flink架构主要会体现如下4层:

1.应用层

应用层是使用 Flink 的最上层,应用层负责定义 Flink 作业,包括数据源、转换操作和输出操作等。

Flink 支持各种类型的数据源,包括本地文件、Kafka、Hadoop HDFS 等,同时提供了许多内置的数据转换操作和输出操作。

 

2.API 层

API 层提供了 Flink 的核心功能,它定义了数据流的基本概念和操作,包括数据流、状态和窗口等。

Flink 提供了两种 API:DataStream API 和 DataSet API。

  • DataStream API 用于处理流数据;
  • DataSet API 用于处理有限数据集;

 

3.运行时层

运行时层是 Flink 的核心组件,它负责执行应用程序。

Flink 将应用程序转换为数据流图,并将其分发到集群中的任务管理器(Task Manager)上执行。

任务管理器负责将任务划分为子任务,并将其分配给具体的 Task Slot 执行。

 

4.分布式存储层

分布式存储层是 Flink 的数据存储组件,它支持在内存和磁盘上存储数据。

并提供了一些高级的数据管理功能,比如:状态后端、保存点和检查点等。

Flink 支持多种存储后端,包括 RocksDB、Hadoop HDFS 等。

 

Flink下载

为了运行Flink,需提前安装好 Java 8 或者 Java 11,通过以下命令来检查 Java 是否已经安装正确。

命令:

java -version

如果出现下面JDK版本信息:

java version “1.8.0”

说明安装好了Java,就可以开始下载Flink了:

$ wget https://archive.apache.org/dist/flink/flink-1.15.3/flink-1.15.3-bin-scala_2.12.tgz

 

Flink安装

Flink安装主要会涉及如下步骤:

1.Flink解压

命令:

$ tar xzf flink-1.15.3-bin-scala_2.12.tgz

 

2.Flink配置

进入Flink目录,修改配置文件

$ cd flink-1.15.3

修改配置文件:

$ vim conf/flink-conf.yaml

配置地址:把localhost改成具体的ip地址

rest.address: xxx.xxx.xxx.xxx

rest.bind-address: xxx.xxx.xxx.xxx

 

3.Flink启动

Flink附带了一个 bash 脚本,可以用于启动本地集群。

启动命令:

bin/start-cluster.sh

启动提示:

Starting cluster. 
Starting standalonesession daemon on host.

启动成功后,可以访问Flink 的 Web UI :

http://配置的ip:8081/

访问地址,如下图所示:

Flink教程(万字图文全面详解)-mikechen

出现上图界面,说明Flink安装成功了。

 

Flink使用示例

Flink 支持流式处理,例如:实时处理数据流,可以对数据进行转换、聚合、计算等操作。

下面是一个简单的 Flink 流式处理示例,它在5秒的窗口中计算来自web套接字的字数。

示例如下:

public class WindowWordCount {
 
    public static void main(String[] args) throws Exception {
 
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
 
        DataStream<Tuple2<String, Integer>> dataStream = env
                .socketTextStream("localhost", 9999)
                .flatMap(new Splitter())
                .keyBy(value -> value.f0)
                .window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
                .sum(1);
 
        dataStream.print();
 
        env.execute("Window WordCount");
    }
 
    public static class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
        @Override
        public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception {
            for (String word: sentence.split(" ")) {
                out.collect(new Tuple2<String, Integer>(word, 1));
            }
        }
    }
 
}

以上就是Flink教程的详解,分别详解了Flink的特点、架构、及原理与使用,希望对你掌握Flink有所帮助!

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法