# Apache Flink 概述

# 大数据时代发展背景及面临问题

大数据是大数据时代之下系统演化结果,是更加贴近大数据场景下用户处理数据的诉求,而非开历史倒车。大数据、大数据,我们讨论的就是一个 “数据爆炸” 时代下如何进行有效地大规模数据处理问题。这个问题是数据库之前未曾遇到、也未曾解决的特定问题,这些数据可能非结构化、非关系化,可能是半结构化的 Nginx 日志或者是用户上传的图片、再或者可能是整个城市大脑的交通探头高清视频数据。这些数据用传统的、狭义的关系型数据库无法解决,因此大数据方案舍弃了数据库模型中当前不适合上述数据处理的特性,牺牲某些功能从而换取大规模数据处理之能力。随着整个物理世界更多地数据化,更多更垂直更定制化的大数据系统将源源不断产生,以应对快速爆炸的数据时代。

# 三个方案?

  • 实时计算:让计算更快产生业务价值(storm->spark->flink)
  • 全家桶:一套引擎解决 “所有” 大数据问题(Flink 和 Spark:All-In-One)
  • 高阶抽象:让人人成为大数据用户

source:大数据十年回顾:浪潮之巅数英雄

# Hadoop 发展史(MapReduce)

批处理框架的代表,第一个在开源社区获得极大关注的大数据处理框架,Hadoop 是一种分布式计算的基础架构,迄今为止 Hadoop 已经形成了一个广阔的生态圈,内部实现了大量的算法和组件,其核心有两个:HDFS(Hadoop 的分布式文件系统) 和 MapReduce(分布式任务处理架构)。Hadoop 的核心机制是通过 HDFS 和 MapReduce 进行数据存储、内存和程序的有效利用与管理。通过 Hadoop 把由多台普通的、廉价的服务器组合成分布式的计算 - 存储集群,从而提供大数据的存储和处理能力。

Hadoop 及其 MapReduce 处理引擎提供了一套久经考验的批处理模型,以其可靠、高效、可伸缩的特点使人们能很方便地处理海量数据。允许用户通过很低成本的组件即可搭建完整功能的 Hadoop 集群,因此这种廉价而高效的处理技术可以灵活应用在很多案例中。与其他框架和引擎的兼容与集成能力使 Hadoop 可以成为使用不同技术的多种工作负载处理平台的底层基础。不过由于这种处理模式需要依赖持久存储,计算任务需要在集群的节点上执行多次读写,因此在速度上会稍显劣势,但是其吞吐量也同样是其他框架所不能匹敌的,这也是批处理模式的特点。

source:大数据技术简介

# 流式计算

Google Dataflow 模型旨在提供一种统一批处理和流处理的系统,是现代流式计算的基石。其内部使用 Flume 和 MillWheel 来作为底层实现,这里的 Flume 不是 Apache Flume,而是 MapReduce 的编排工具,也有人称之为 FlumeJava;MillWheel 是 Google 内部的流式系统,可以提供强大的无序数据计算能力。

Dataflow 模型的核心点在于:对于无序的流式数据提供基于 event-time 的顺序处理、基于数据本身的特征进行窗口聚合处理的能力,以及平衡正确性、延迟、成本之间的相互关系。

# Flink 是什么

Flink 是一个流式数据的流执行引擎,提供支持流处理批处理两种类型应用(流批!),其针对数据流的分布式计算提供了数据分布,数据通信,容错机制等功能。基于流执行引擎,Flink 提供了跟多高抽象层 API 便于用户编写分布式任务。数据可以作为无界或有界流进行处理。

2022-07-25T14:57:14.png

  • 无界流有头尾未定义,不会终止,数据一经生成即可提供,一定是持续不断地处理,事件引入后必须立即处理。不可能等待所有输入数据到达,因为输入是无界的并且不会在任何时间点完成。
  • 有界流定义有头和尾,在处理计算之前,需要引入所有的数据,批处理。

Apache Flink 擅长处理无界和有界数据集。对时间和状态的精确控制使 Flink 的运行时能够在无限流上运行任何类型的应用程序。有界流由专门为固定大小的数据集设计的算法和数据结构在内部进行处理,从而产生出色的性能。

# 流批一体的 Apache Flink 架构

2022-07-25T15:28:33.png

  • JobClient:负责接收程序,解析和优化程序的执行计划,然后提交执行计划到 JobManager
  • JobManager:负责申请资源,协调以及控制整个 job 的执行过程(任务调度,处理 checkpoint,容错...)
  • TaskManger:TaskManager 是运行在不同节点上的 JVM 进程,负责接收并执行 JobManger 发送的 task,并与 JobManger 通信,反馈任务状态信息,如果说 JobManager 是 master 的话,那么 TaskManager 就是 worker 用于执行任务。每个 TaskManager 像是一个容器,包含一个或者多个 Slot。
  • Task:Task 是在 operators 的 subtask 进行链化之后形成的,具体 Flink job 中有多少 task 和 operator 的并行度和链化的策略有关
  • Slot:Slot 是 TaskManager 资源粒度的划分,每个 Slot 都有自己独立的内存。所有 Slot 平均分配 TaskManager 的内存,值得注意的是,Slot 仅划分内存,不涉及 CPU 的划分,即 CPU 是共享使用。每个 Slot 可以运行多个 task。Slot 的个数就代表了一个程序的最高并行度。

source:大数据 Hadoop 之 —— 实时计算流计算引擎 Flink(Flink 环境部署)

# Apache Flink 的 OLAP 场景面临的问题及优化思路

# OLAP 业务场景

OLAP(On-Line Analytical Processing),在线分析处理,是数据仓库系统最主要的应用,专门用于支持复杂的分析操作,可以根据分析人员的要求快速、灵活地进行大数据量的复杂查询处理。

OLAP 按数据存储格式可分类为:ROLAP、MOLAP、HOLAP

  • ROLAP (Relational OLAP) 基于关系数据库的 OLAP 实现关系型数据库关系型数据库
  • MOLAP (Multidimensional OLAP) 基于多维数据组织的 OLAP 实现多维数据库数据立方体 -
  • HOLAP (Hybrid OLAP) 基于混合数据组织的 OLAP 实现关系型数据库数据立方体
名称场景干什么代表
离线批处理用于复杂的 ETL、数据挖掘等延时要求不高的场景。处理的数据规模大、灵活性高,但查询延时差。Hive,Spark
MPP 大规模并行处理(Massively Parallel Processor)有很好的数据规模和灵活性支持,但是对响应时间是没有保证的。当数据量(达 PB 以上)和计算复杂度增加后,响应时间会变慢,从秒级到分钟级,甚至小时级都有可能。MPP 架构是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果。Greenplum,Presto,Impala,ClickHouse
预计算架构侧重数据规模、查询延时,灵活性差。在入库时对数据进行预聚合,通过 keyvalue 存储结果集。进一步牺牲灵活性换取性能,以实现对超大数据集的秒级响应。Druid,Kylin
搜索引擎架构侧重数据规模和灵活性,查询延迟较差,特别是涉及 join 操作基本思路是在入库时创建索引,基于各自的存储模型进行优化,查询时做并行计算。Elasticsearch

属于 Flink on Yarn 模式,依靠 YARN 来调度 flink 任务,好处是可以充分利用集群资源,提高集群机器的利用率,基于 Hadoop 集群,就可以执行 MapReduce,Spark 和 Flink 任务,操作方便,运维轻松。

在 YARN 中提前初始化一个 Flink 集群 (称为 Flinkyarn-session),开辟指定的资源,以后的 Flink 任务都提交到这里。这个 Flink 集群会常驻在 YARN 集群中,除非手工停止。这种方式创建的 Flink 集群会独占资源,不管有没有 Flink 任务在执行,YARN 上面的其他任务都无法使用这些资源。

2022-07-25T15:55:47.png

有空动手搭一下