Flink基础(一):什么是Flink

允我心安 提交于 2020-03-17 01:53:08

flink系列文章中,flink版本是1.9.0

什么是flink

引用官网的一句话:数据流上的有状态计算。

优势

Flink 提供了 State、Checkpoint、Time、Window 等,它们为 Flink 提供了容错性、实效性等优势。

部署方式
  • Local:直接在 IDE 中运行 Flink Job 时则会在本地启动一个 mini Flink 集群。
  • Standalone:在 Flink 目录下执行 bin/start-cluster.sh 脚本则会启动一个 Standalone 模式的集群。
  • YARN:YARN 是 Hadoop 集群的资源管理系统,它可以在群集上运行各种分布式应用程序,Flink 可与其他应用并行于 YARN 中。
  • Kubernetes:Kubernetes 是 Google 开源的容器集群管理系统,在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性,Flink 也支持部署在 Kubernetes 上,在 GitHub 看到有下面这种运行架构的。
作业提交架构流程
  • Job Client:Job Client 不是 Flink 程序执行的内部部分,但它是任务执行的起点。Job Client 负责接受用户的程序代码,然后创建数据流,将数据流提交给 Job Manager 以便进一步执行。执行完成后,Job Client 将结果返回给用户。
  • Job Manager:主进程(也称为作业管理器)协调和管理程序的执行。它的主要职责包括安排任务、管理 checkpoint 、故障恢复等。机器集群中至少要有一个 master,master 负责调度 task、协调 checkpoints 和容灾,高可用设置的话可以有多个 master,但要保证一个是 leader,其他是 standby。Job Manager 包含 Actor system、Scheduler、Check pointing 三个重要的组件。
  • Task Manager:从 Job Manager 处接收需要部署的 Task。Task Manager 是在 JVM 中的一个或多个线程中执行任务的工作节点。任务执行的并行性由每个 Task Manager 上可用的任务槽(Slot 个数)决定。每个任务代表分配给任务槽的一组资源。例如,如果 Task Manager 有四个插槽,那么它将为每个插槽分配 25% 的内存。可以在任务槽中运行一个或多个线程。同一插槽中的线程共享相同的 JVM。
程序结构

在这里插入图片描述

Flink API
  • 最底层提供了有状态流。它将通过 Process Function 嵌入到 DataStream API 中。它允许用户可以自由地处理来自一个或多个流数据的事件,并使用一致性、容错的状态。除此之外,用户可以注册事件时间和处理事件回调,从而使程序可以实现复杂的计算。
  • DataStream/DataSet API 是 Flink 提供的核心 API,DataSet 处理有界的数据集,DataStream 处理有界或者无界的数据流。用户可以通过各种方法(map/flatmap/window/keyby/sum/max/min/avg/join 等)将数据进行转换或者计算。
  • Table API 是以表为中心的声明式 DSL,其中表可能会动态变化(在表达流数据时)。Table API 提供了例如 select、project、join、group-by、aggregate 等操作,使用起来却更加简洁(代码量更少)。 你可以在表与 DataStream/DataSet 之间无缝切换,也允许程序将 Table API 与 DataStream 以及 DataSet 混合使用。
  • Flink 提供的最高层级的抽象是 SQL 。这一层抽象在语法与表达能力上与 Table API 类似,但是是以 SQL查询表达式的形式表现程序。SQL 抽象与 Table API 交互密切,同时 SQL 查询可以直接在 Table API 定义的表上执行。 Flink 除了 DataStream 和 DataSet API,它还支持 Table/SQL API,Flink 也将通过 SQL API 来构建统一的大数据流批处理引擎,因为在公司中通常会有那种每天定时生成报表的需求(批处理的场景,每晚定时跑一遍昨天的数据生成一个结果报表),但是也是会有流处理的场景(比如采用 Flink 来做实时性要求很高的需求),于是慢慢的整个公司的技术选型就变得越来越多了,这样开发人员也就要面临着学习两套不一样的技术框架,运维人员也需要对两种不一样的框架进行环境搭建和作业部署,平时还要维护作业的稳定性。
支持的connector
  • 不同版本的 Kafka
  • 不同版本的 ElasticSearch
  • Redis
  • MySQL
  • Cassandra
  • RabbitMQ
  • HBase
  • HDFS
处理时间语义

支持Event time、Ingestion Time、Processing Time

灵活的窗口机制

Time Window、Count Window、Session Window,还支持自定义 Window

支持状态存储

Keyed State 和 Operator State,在 Keyed State 中又提供了多种数据结构:

  • ValueState
  • MapState
  • ListState
  • ReducingState
  • AggregatingState
    另外状态存储也支持多种方式:
  • MemoryStateBackend:存储在内存中
  • FsStateBackend:存储在文件中
  • RocksDBStateBackend:存储在 RocksDB 中
checkpoint机制

使用 Checkpoint 来提高程序的可靠性,开启了 Checkpoint 之后,Flink 会按照一定的时间间隔对程序的运行状态进行备份,当发生故障时,Flink 会将所有任务的状态恢复至最后一次发生 Checkpoint 中的状态,并从那里开始重新开始执行。
另外 Flink 还支持根据 Savepoint 从已停止作业的运行状态进行恢复,这种方式需要通过命令进行触发。

WaterMark机制

提供了WaterMark来处理延迟数据。
同时对于更迟到的数据还有另外处理机制

内存管理机制

Flink 在 JVM 中提供了自己的内存管理,使其独立于 Java 的默认垃圾收集器。它通过使用散列、索引、缓存和排序有效地进行内存管理

其他机制…

注:准备做一个Flink的系列博客,一方面加深自己学习,一方面给大家分享,博客参阅了Flink官网,再结合自己的理解写成的,本人也是初学者,如果有讲的错误的地方,欢迎大家留言指正。
注:本文只是概要的说下Flink,对于上述的东西后续都会有细说!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!