---- Flink四大基石 Flink之所以能这么流行,离不开它最重要的四个基石:Checkpoint、State、Time、Window。 Checkpoint 这是Flink最重要的一个特性。 Flink基于Chandy-Lamport算法实现了一个分布式的一致性的快照,从而提供了一致性的语义。 Chandy-Lamport算法实际上在1985年的时候已经被提出来,但并没有被很广泛的应用,而Flink则把这个算法发扬光大了。 Time 除此之外,Flink还实现了Watermark的机制,能够支持基于事件的时间的处理,能够容忍迟到/乱序的数据。 Window 另外流计算中一般在对流数据进行操作之前都会先进行开窗,即基于一个什么样的窗口上做这个计算。Flink提供了开箱即用的各种窗口,比如滑动窗口、滚动窗口、会话窗口以及非常灵活的自定义的窗口。
,DataSetAPI已经不推荐使用了,后续其他案例都会优先使用DataStream流式API,既支持无界数据处理/流处理,也支持有界数据处理/批处理! * 编码步骤 * 1.准备环境-env * 2.准备数据-source * 3.处理数据-transformation * 4.输出结果-sink * 5.触发执行-execute//如果有 ; /** * Author lanson * Desc * 需求:使用Flink完成WordCount-DataStream * 编码步骤 * 1.准备环境-env * 2.准备数据-source 表达式 * 编码步骤 * 1.准备环境-env * 2.准备数据-source * 3.处理数据-transformation * 4.输出结果-sink * 5.触发执行-execute 需求:使用Flink完成WordCount-DataStream--使用lambda表达式--修改代码使适合在Yarn上运行 * 编码步骤 * 1.准备环境-env * 2.准备数据-source
、SubTask、Parallelism 1.Dataflow:Flink程序在执行的时候会被映射成一个数据流模型 2.Operator:数据流模型中的每一个操作被称作Operator,Operator .One to One模式: 两个operator用此模式传递的时候,会保持数据的分区数和数据的排序;如上图中的Source1到Map1,它就保留的Source的分区特性,以及分区元素处理的有序性。 Flink执行图(ExecutionGraph) 由Flink程序直接映射成的数据流图是StreamGraph,也被称为逻辑流图,因为它们表示的是计算逻辑的高级视图。 为了执行一个流处理程序,Flink需要将逻辑流图转换为物理数据流图(也叫执行图),详细说明程序的执行方式。 原理介绍 Flink执行executor会自动根据程序代码生成DAG数据流图 Flink 中的执行图可以分成四层:StreamGraph -> JobGraph -> ExecutionGraph ->
---- Flink-Window操作 为什么需要Window 在流处理应用中,数据是连续不断的,有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的网页。 在这种情况下,我们必须定义一个窗口(window),用来收集最近1分钟内的数据,并对这个窗口内的数据进行计算。 window 中, Flink提供了很多各种场景用的WindowAssigner: 如果需要自己定制数据分发策略,则可以实现一个 class,继承自 WindowAssigner。 evictor--了解 evictor 主要用于做一些数据的自定义操作,可以在执行用户代码之前,也可以在执行 用户代码之后,更详细的描述可以参考org.apache.flink.streaming.api.windowing.evictors.Evictor Flink 提供了如下三种通用的 evictor: * CountEvictor 保留指定数量的元素 * TimeEvictor 设定一个阈值 interval,删除所有不再 max_ts - interval
---- Flink On Yarn模式 原理 为什么使用Flink On Yarn? 在实际开发中,使用Flink时,更多的使用方式是Flink On Yarn模式,原因如下: -1.Yarn的资源可以按需使用,提高集群的资源利用率 -2.Yarn的任务有优先级,根据优先级运行作业 -3 此外,AppMaster容器也提供了Flink的web服务接口。 run(提交任务) 1.在yarn上启动一个Flink会话,node1上执行以下命令 /export/server/flink/bin/yarn-session.sh -n 2 -tm 800 -s run提交任务: /flink/bin/flink run /export/server/flink/examples/batch/WordCount.jar run /export/server
今天给大家分享9大常见数据平滑方法:移动平均Moving Average指数平滑Exponential Smoothing低通滤波器多项式拟合贝塞尔曲线拟合局部加权散点平滑LoessKalman滤波小波变换 它对最近的数据点给予较高的权重,而对较早的数据点给予较低的权重。这使得EMA更适合用于追踪快速变化的数据。 指数平滑的主要特点包括:加权平滑:指数平滑使用指数权重来平滑数据。较新的数据点获得更高的权重,而较旧的数据点获得较低的权重。这意味着它对最近的数据更为敏感,从而更好地捕获了数据的最新趋势。 7, 8, 9])y = np.array([10, 8, 7, 6, 5, 4, 3, 2, 1])# 三阶多项式拟合degree = 3coefficients = np.polyfit(x, y 数据平滑:Savitzky-Golay滤波器旨在平滑数据,减小数据中的高频噪声和突发波动。它保留了数据中的趋势和主要特征,同时去除了噪声。
目录 Flink模拟双十一实时大屏统计 需求 数据 编码步骤: 1.env 2.source 3.transformation 4.使用上面聚合的结果,实现业务需求: 5.execute 参考代码 实现代码 (基于上面参考代码重新写一套) 实现效果 ---- Flink模拟双十一实时大屏统计 需求 在大数据的实时处理中,实时的大屏展示已经成了一个很重要的展示项,比如最有名的双十一大屏实时销售总价展示。 今天我们就做一个最简单的模拟电商统计大屏的小例子, 需求如下: 1.实时计算出当天零点截止到当前时间的销售总额 2.计算出各个分类的销售top3 3.每秒钟更新一次统计结果 数据 首先我们通过自定义source 模拟订单的生成,生成了一个Tuple2,第一个元素是分类,第二个元素表示这个分类下产生的订单金额,金额我们通过随机生成. /** * 自定义数据源实时产生订单数据Tuple2<分类, 金额> */ Exception { Double totalAmount = 0d;//用来记录销售总额 //用大小顶堆来计算TopN //用大顶堆(大的数据在堆顶
---- Flink用武之地 http://www.liaojiayi.com/flink-IoT/ https://flink.apache.org/zh/usecases.html 从很多公司的应用案例发现 ,其实Flink主要用在如下三大场景: Event-driven Applications【事件驱动】 事件驱动型应用是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算 比如Flink应用凌晨从Recorded Events中读取昨天的数据,然后做周期查询运算,最后将数据写入Database或者HDFS,或者直接将数据生成报表供公司上层领导决策使用。 Periodic ETL:比如每天凌晨周期性的启动一个Flink ETL Job,读取传统数据库中的数据,然后做ETL,最后写入数据库和文件系统。 Data Pipeline:比如启动一个Flink 实时应用,数据源(比如数据库、Kafka)中的数据不断的通过Flink Data Pipeline流入或者追加到数据仓库(数据库或者文件系统),或者Kafka
连续写了几天的flink StreamGraph的代码,今天闲来说一下flink的启动,今天主要说的是本地模式(LocalStreamEnvironment)启动 下面先上传一张启动流程的顺序图 ? 这个环境让我们可以配置参数来控制如何运行Flink任务。 addSource方法用来添加一个数据源到计算任务中。 SourceContext发送生成的数据。 Flink支持两种执行模式,LAZY_FROM_SOURCE模式只有在一个Operator的输入数据就绪时才初始化该节点,EAGER模式会在一开始就按拓扑顺序加载计算图中的所有节点。
一、Table API 和 Flink SQL 是什么? • Flink 对批处理和流处理,提供了统一的上层 API • Table API 是一套内嵌在 Java 和 Scala 语言中的查询API,它允许以非常直观的方式组合来自一些关系运算符的查询 • Flink (database)名和对象名; 表可以是常规的,也可以是虚拟的(视图,View); 常规表(Table)一般可以用来描述外部数据,比如文件、数据库表或消息队列的数据,也可以直接从 DataStream 得到的数据会增加一个 Boolean 类型的标识位(返回的第一个字段),用它来表示到底是新增的数据(Insert),还是被删除的数据(Delete) val aggResultStream: DataStream 这样即使在有乱序事件或者延迟事件时,也可以获得正确的结果; 为了处理无序事件,并区分流中的准时和迟到事件;Flink 需要从事件数据中,提取时间戳,并用来推进事件时间的进展; 定义事件时间,同样有三种方法
---- Flink-状态管理 Flink中的有状态计算 注意: Flink中已经对需要进行有状态计算的API,做了封装,底层已经维护好了状态! 为什么 Flink 知道之前已经处理过一次 hello world,这就是 state 发挥作用了,这里是被称为 keyed state 存储了之前需要统计的数据,所以 Flink 知道 hello 和 ,Managed State 由 Flink Runtime 管理,自动存储,自动恢复,在内存管理上有优化;而 Raw State 需要用户自己管理,需要自己序列化,Flink 不知道 State 中存入的数据是什么结构 Operator State 可以用于所有算子,但一般常用于 Source 存储State的数据结构/API介绍 前面说过有状态计算其实就是需要考虑历史数据 而历史数据需要搞个地方存储起来 Flink为了方便不同分类的 保存Operator state的数据结构: ListState<T> BroadcastState<K,V> 举例来说,Flink中的FlinkKafkaConsumer,就使用了operator state
早期, Flink 是做 Batch 计算的,但是在 2014 年, StratoSphere 里面的核心成员孵化出 Flink,同年将 Flink 捐赠 Apache,并在后来成为 Apache 的顶级大数据项目 ,同时 Flink 计算的主流方向被定位为 Streaming, 即用流式计算来做所有大数据的计算,这就是 Flink 技术诞生的背景。 2014 年 Flink 作为主攻流计算的大数据引擎开始在开源大数据行业内崭露头角。 比如它提供了有状态的计算,支持状态管理,支持强一致性的数据语义以及支持 基于Event Time的WaterMark对延迟或乱序的数据进行处理等 富二代Flink https://blog.csdn.net 这样在各种不同的场景下,不管是全量数据还是增量数据,亦或者实时处理,一套方案即可全部支持,这就是阿里选择 Flink 的背景和初衷。
/dev/table/ Flink的Table模块包括 Table API 和 SQL: Table API 是一种类SQL的API,通过Table API,用户可以像操作表一样操作数据,非常直观和方便 SQL作为一种声明式语言,有着标准的语法和规范,用户可以不用关心底层实现即可进行数据的处理,非常易于上手 Flink Table API 和 SQL 的实现上有80%左右的代码是公用的。 标准稳定:语义遵循SQL标准,非常稳定,在数据库 30 多年的历史中,SQL 本身变化较少; 5. 在 Flink 1.9 中,Table 模块迎来了核心架构的升级,引入了阿里巴巴Blink团队贡献的诸多功能 在Flink 1.9 之前,Flink API 层 一直分为DataStream API 了解-Blink planner和Flink Planner具体区别如下: https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev
戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Flink中的窗口 9-Flink中的Time 1时间类型 Flink中的时间与现实世界中的时间是不一致的,在flink中被划分为**事件时间,摄入时间,处理时间**三种。 例如,如果应用程序在上午 9:15 开始运行,则第一个每小时 Processing Time 窗口将包括在上午 9:15 到上午 10:00 之间处理的事件,下一个窗口将包括在上午 10:00 到 11 **Event Time** Event Time 是事件发生的时间,一般就是数据本身携带的时间。这个时间通常是在事件到达 Flink 之前就确定的,并且可以从每个事件中获取到事件时间戳。 假设所有数据都已到达, Event Time 操作将按照预期运行,即使在处理无序事件、延迟事件、重新处理历史数据时也会产生正确且一致的结果。
Java的堆内存中/TaskManage节点的内存中 State可以被记录,在失败的情况下数据还可以恢复 Checkpoint: 某一时刻,Flink中所有的Operator的当前State的全局快照, 一般存在磁盘上 表示了一个Flink Job在一个特定时刻的一份全局状态快照,即包含了所有Operator的状态 可以理解为Checkpoint是把State数据定时持久化存储了 比如KafkaConsumer 算子中维护的Offset状态,当任务重新恢复的时候可以从Checkpoint中获取 注意: Flink中的Checkpoint底层使用了Chandy-Lamport algorithm分布式快照算法可以保证数据的在分布式环境下的一致性 (为了提高效率) 2.分布式快照执行时的数据一致性由Chandy-Lamport algorithm分布式快照算法保证! 因为如果某个算子在节点A上失败,在节点B上恢复,使用本地文件时,在B上无法读取节点 A上的数据,导致状态恢复失败。
---- Flink安装部署 Flink支持多种安装模式 - Local—本地单机模式,学习测试时使用 - Standalone—独立集群模式,Flink自带集群,开发测试环境使用 - StandaloneHA —独立集群高可用模式,Flink自带集群,开发测试环境使用 - On Yarn—计算资源统一由Hadoop YARN管理,生产环境使用 Local本地模式 原理 Flink程序由JobClient进行提交 作业执行完成后,结果将发送回客户端(JobClient) 操作 1.下载安装包 https://archive.apache.org/dist/flink/ 2.上传flink-1.12.0-bin-scala root /export/server/flink-1.12.0 5.改名或创建软链接 mv flink-1.12.0 flink ln -s /export/server/flink-1.12.0 /flink/bin/flink run /export/server/flink/examples/batch/WordCount.jar --input /root/words.txt --output
Savepoint VS Checkpoint Savepoint演示 # 启动yarn session /export/server/flink/bin/yarn-session.sh -n 2 -tm 800 -s 1 -d # 运行job-会自动执行Checkpoint /export/server/flink/bin/flink run --class cn.itcast.checkpoint.CheckpointDemo01 /root/ckp.jar # 手动创建savepoint--相当于手动做了一次Checkpoint /export/server/flink/bin/flink savepoint 702b872ef80f08854c946a544f2ee1a5 hdfs://node1:8020/flink-checkpoint/savepoint/ # 停止job /export/server/flink/bin/flink cancel 702b872ef80f08854c946a544f2ee1a5 # 重新启动job,手动加载savepoint数据 /export/server/flink/bin/flink run -s hdfs://node1:8020/flink-checkpoint
参数总结 [root@node1 bin]# /export/server/flink/bin/flink --help . /flink <ACTION> [OPTIONS] [ARGUMENTS] The following actions are available: Action "run" compiles The available options can be found at https://ci.apache.org/projects/flink /flink- docs-stable/ops/config.html -m,--jobmanager <arg> -j,--jarfile <jarfile> Flink program JAR file.
---- Flink实现订单自动好评 需求 在电商领域会有这么一个场景,如果用户买了商品,在订单完成之后,一定时间之内没有做出评价,系统自动给与五星好评,我们今天主要使用Flink的定时器来简单实现这一功能 数据 自定义source模拟生成一些订单数据. ; import org.apache.flink.api.java.tuple.Tuple3; import org.apache.flink.configuration.Configuration; ; import org.apache.flink.api.java.tuple.Tuple3; import org.apache.flink.configuration.Configuration; ) * 我们今天主要使用Flink的定时器来简单实现这一功能。
Broadcast State 是 Flink 1.5 引入的新特性。 下游的 task 接收这些配置、规则并保存为 BroadcastState, 将这些配置应用到另一个数据流的计算中 。 ()方法处理后输出结果数据记录的类型。 org.apache.flink.api.java.tuple.Tuple4; import org.apache.flink.api.java.tuple.Tuple6; import org.apache.flink.configuration.Configuration broadcastState.clear(); //最后将最新的广播流数据放到state中(更新状态数据) Tuple2<String, Integer>>> broadcastState = ctx.getBroadcastState(descriptor); //清理广播数据后再重新广播新数据