开发者学堂课程【Apache Flink 入门到实战 - Flink 开源社区出品 :为什么要学习 Apache Flink】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/632/detail/10036
为什么要学习 Apache Flink
内容简介:
一、课程介绍;为什么会开设系列课程
二、Apache Flink:定义/架构/原理
三、高效学习:学前准备以及学习方法
一、课程介绍;为什么会开设系列课程?(导论)
1、Flink 在中国的采用情况
整个 Flink 在中国的使用程度或在线部署普及率较高,基本上中国较大的互联网公司都在使用 Flink 在生产中去部署去解决计算或者风控的问题等等。Flink 在全球的热度情况中国是属于一枝独秀。包括多种原因:社区不遗余力的去推广,整个中国的互联网公司在采纳新技术整个中国的互联网行业在采纳新技术这一方面的大胆尝试。
2、Flink社区希望解决的问题
(1)丰富需求端:
扩大整个IT行业对于 Flink技术栈的述求或者采纳度,让大量公司基于Flink Stack 构建完整大数据体系。(需求端)
(2)赋能供应链:
扩大整个IT从业人员对于 Flink 熟悉掌控程度,让大量从业人员成为 Flink 深度开发者。(人才供应端)
(3)搭建供需桥梁:
搭建企业与员工的桥梁,让更多使用 Flink Stack 公司接触更多 Flink 专业人员,为公司找到更多的 Flink 的爱好者技术专家,为 Flink 粉丝找到一个更好的发展通道。
以上三个方面是 Flink 社区在职业发展或者是公司供需关系所需要完成的事情。
3、系列课程目标
(1)面向人群:
对于Flink或者Bigdata感兴趣的IT初学者、在校大学生。(第一季度)
在后续还会有深入的课程包括运维、架构等会后续开展。
(2)前置知识:
熟悉基本的编程语言(Java、Python)大数据、数据处理有基本的了解(操作过一些相关的数据库,比如 Seiko 数据库)。
(3)课程目标:
(第一季)课程能够初步了解 Flink 技术栈(从 Flink 的使用到部署到运维完成)、初步掌握 Flink API,简单生产业务开发。
(4)后续规划:
前期面向 Flink 开发者,后期面向构架师推出业务架构等大型架构的课程。
二、Apache Flink:定义/架构/原理
1、Apache Flink:定义/原理/应用
(1)定义:
Apache Flink Definition:Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data steams.
(2)首先 Flink 是一个 framework,属于一个框架。按照定义,只需要编写业务逻辑这一部分,然后把它扔给框架,接下来框架会代为执行整个业务的处理。解决了很多分布式计的问题。有状态和有界无界的数据流.同时,它也是一个分布式的数据处理引擎。
(3)一般情况下,在解决单机问题时都是非常简单,一旦把单机的问题 scale 到分布式的问题就会变得异常复杂,这就是为什么 Apache Flink 存在的一个价值,因为 Flink 会把这些底层涉及到分布式处理的各个难题所屏蔽,能够让大家更加专注于业务的一个开发。
(4)stateful computations,包括一个状态计算,Flink 计算的很大一部分可以支持一个有界的数据运算,类似于 spark,同时也很好的支持无界的数据运算。
2、Flink Application:Flink 应用开发相关知识
(1)基础处理语义(steams\state\time):
steams 基础的概念是on bondy data string和bondy的data streams是一个数据流、数据集合,接下来讲解状态(有状态,无状态的一个计算)、第三个是时间(Time),时间处理对于一个实时流计算处理来说非常重要,因为它能够表征当前它是构建了整个实时计算处理的一个基础。
(2)Data streams
概念:指最基础的一个概念(数据处理的集合),在流式处理系统里面,对于数据更愿意把它抽象成一个数据的流。
假定数据是其实在真实场景中,数据也是在不停的产生的,它像一个数据流,不停的在产生,不停的传输,然后不停的进入计算系统,整个过程像一条河流一样连续不断,这是流计算对于我们数据产生源的一个抽象,因为数据不停的产生,所以把这些合成或者是抽象成一个数据流,而不是一个静态的数据集,他出现流时,就会面临着两个概念。概念分别是 bonded Streams(有界)和 unbonded Streams(无界).
那么什么是 bonded Streams和unbonded Streams 呢?(如下图)
bonded Streams 就是有始有终。之前处理的类似于像批处理,或者是数据库处理的数据,本质上都是一个 bonded,属于有始有终的一个数据的集合,这个数据集有大小,有限定。
举例来说 mapreduce 或者 spark,写作业处理 1TB 的数据要多少时间处理1TB的数据,那1TB的数据其实就是 bonded。但是很少用“处理1TB”的方式去表达。
这无界的数据流在当前的数据存储里面有存了1GB,有始无终。那么,无终代表是数据随着时间的推移会一直增加,所以不能说有1TB大小。这是两个非常大的一个区别点,一个是 unbonded stream,是静态的数据集,而数据库系统更多的面临的是 bonded Streams 或者数据集这个概念,它是大小固定、有限定的,但是对于无限的数据流,它是一个有始但是无终,没有结束点。
那么这两个概念很重要?
对于一个数据库的系统,任何计算实际上会产生结果,产生结果慢,因为数据库的数据大,算的时间长或者计算逻辑非常复杂,计算时间长。
那么这个时候最终一定会有一个结果,但是对于一个没有终止当地时间时,很难产生一个结果,或者系统无法知道什么时候产生结果,因为数据不停的再进来,不停的产生结果,导致无法产生一个最终结果。
(3)State
翻译过来是状态。它是一个有状态的计算引擎,对于流计算来说,是属于不带状的计算,另外一个是又状态的计算。类似于数据来一条处理一条,不需要留在系统中(无状态)。那么什么叫Apple计算呢?
Java应用里面带有数据,或带有计算,那么对于Frank也是这样。如果要做聚合的操作,如其他的一些计算,当这些计算在处理数据过程中,需要keep之前的数据。举例来说要算最近一个小时内的总PV(页面点击率、独立访的用户数),那么必须要把最近一小时数据缓存。
Flink 会在系统内部会把这个 count 值保存成状态,一直累加或删除。状态就像记忆,而且这个份记忆是保存在自身的,这些数据就是 State.
要做到精确的处理,需要把数据通过状态能够写入持续化的存储,保证在整个分布式情况运行失败或者非 over 的情况,能够做到 exactly once。这是 state 的另外一个价值。
(4)Time
Event Time:事件发生的时间。
它表征了数据或者一个事件所真正发生的。在浏览网站时,会有点击的行为,这些行为在网站上面会产生日志,最开始注意日志的最头部会产生一些时间,这些时间就是 event。
Ingestion time :数据进入 flink 的那一刻的一个时间。
Processing Time:每个数据在处理这一个数据时达到每个算子的时间。
Flink 提供了丰富的时间语义支持。
事件时间模式使用事件时间语义的流处理应用根据事件本身自带的时间戳进行结果的计算。
因此,无论处理的是历史记录的事件还是实时的事件,事件时间模式的处理总能保证结果的准确性和一致性。
Watermark 支持 Flink 引入了 watermark 的概念,用以衡量事件时间进展。
Watermark 也是一种平衡处理延时和完整性的灵活机制。
迟到数据处理:
当以带有 watermark 的事件时间模式处理数据流时,在计算完成之后仍会有相关数据到达。这样的事件被称为迟到事件。
Flink 提供了多种处理迟到数据的选项,例如将这些数据重定向到旁路输出(side output)或者更新之前完成计算的结果。
处理时间模式: 除了事件时间模式,Flink 还支持处理时间语义。处理时间模式根据处理引擎的机器时钟触发计算,一般适用于有着严格的低延迟需求,并且能够容忍近似结果的流处理应用。
3、FlinkApplication-API
(1)Flink 根据抽象程度分层了三层,提供了三种不同的 API。每一种 API 在简洁性和表达力上有着不同的侧重,并且针对不同的应用场景。
(2)越往下的API表示处理越强,表达灵活。当表达能力非常灵活、强大的时候,处理的方便程度,业务的抽象能力越小,那么这两个因素。一个表达能力,一个是方便程度。越往上走是增大,一个增小表达能力会逐步的弱,但是业务抽象能力会更好,到最上层,那么这个时候更多的是关系性API。或者数据库的结构类似,不需要关心底层的处理,可以更多的面向业务去处理相关问题。
4、Flink Architecture(Flink 基本架构原理以及核心逻辑)
(1)有界和无界数据流:Flink 具备一套框架处理两种数据集合
(2)部署灵活:Flink 支持多种部署方式,包括 Yam,KBS
(3)极高可伸缩性:峰值达17亿条/s,无需任何业务语义调整
(4)极致流式处理性能:本地状态存取、极致性能优化
关于 stateful 的一个架构,如果不在我们的框架内置,支持 stable communication的话,需要提供在应用层或者外部提供一个数据读写,或者是存储系统。
业务处理逻辑里面,它会读取状态,当如果没有提供内置状态的时候,实际上内置的状态方法的时候,需要跨网络读取,此时会降低性能。这个时候需要对状态进行远程备份,本机的一个状态、本机的磁盘出现情况时,需要在远程进行状态恢复,那个状态不归档到远程存储的话,有可能在本地或者本机,当出现时,实际上状态就会丢失,所以stateful在定期会把本地的状态会归档或者是写入到外置一个分布式的存储,或者一个持久化存储里面,保证出现整个机器或者整个磁盘出现问题时,在另外一台机器能够进行恢复。
5、Flink Operation(Flink 运维管理相关内容)
7x24小时高可用:一致性 Checkpoint
业务应用监控运维有状态 Flink 应用程序针对本地状态访问进行了优化。Flink 通过定期和异步地将本地状态检查为持久状态来保证在发生故障时的一次状态一致性。
6、Flink Scenario 应用场景
(1)Data Pipeline(实时 build 搜索引擎,实时数仓)
提取-转换-加载(ETL)是在存储系统之间转换和移动数据的常见方法。Flink 数据管道以连续流模式运行,而不是周期性地触发。
(2)Data Analytics(大屏)
分析工作从原始数据中提取信息和洞察力。右边就是一个实时的生成报表,类似于大屏,申报表大屏都是类似的一个业务处理领域。
(3)Data Driven (复杂规则的风控)
事件驱动的应用程序是一个有状态的应用程序,它从一个或多个事件流中摄取事件,并通过触发计算、状态更新或外部操作来响应传入的事件。
实时的数据处理都属于这个分类,流计算本身都是一个 data driven 计算,所以这个用在构建风控系统,当风控系统需要处理各种复杂的规则时,它会把处理的逻辑写到 data stlink 的 API,当外面的数据流进来时就会触发相应的规则,进行预警。
三、高效学习:学前准备以及学习方法
1、学习准备:
(1)环境条件:Linux,MacOS,Windows
JDK 版本:8.K以上
Flink 本地环境搭建
下载地址:https://flink.apache.org/downloads.html
(2)搭建方法:
https://ci.apache.org/projects/flink/flink-docs-release-1.7/tutorials / local setup . html
演示:
下载 flink、进入 flink 目录启动、没有修改参数的端口是8081。
首先起一个监听端口,主要是后续产生数据使用,然后当启动监听端口之后,提交一个任务,注意NC起端口时,这边端口是9000。
那么取一个指定,当取任务时,配的一个参数port,参数也要是有限,这两个端口一定要一致,如果是直接copy官网命令时,保持端口完全一致。
2、学习建议
(1)实践再理论。先学习应用,尝试构建复杂的 Flink Application
(2)横向扩展。在构建复杂 Flink 生产业务后,横向使用学习Storm\Spaek\dataFlow 等系统,知识是演化过来的,必有前置和铺垫。多横向看看,打开视野,
(3)关注下 Apache Flink 以及 FlinkChina 社区,多交流、多提问、多输出。