
Flink
文章平均质量分 93
Flink笔记
-代号9527
逢山开路,遇水搭桥!纸上得来终觉浅,绝知此事要躬行。
展开
-
【SQL篇】一、Flink动态表与流的关系以及DDL语法
和MySQL等关系型表不同的是,无限流下,会有源源不断的数据过来进入表中,即动态表,来一条数据,往表中插入一条数据。修改查询SQL,使用TUMBLE加一个开窗,每个窗口触发时,输出结果,此时对结果表就只有insert追加数据,没有update,即追加查询。此时,结果表(动态),可能是简单的insert,如Bob这条数据,也可能是对旧数据的更新update,如Alice,这就是。动态表仅仅通过insert来修改,转为流时,对应一个仅追加的流,流中的每条数据,就是动态表的每行数据。原创 2023-11-06 15:11:35 · 937 阅读 · 0 评论 -
【开发篇】一、处理函数:定时器与定时服务
在Flink底层,可以不定义具体是什么算子,而只是,里面可以自定义逻辑。即图中底层的处理函数层。从下到上,封装越来越重,使用越来越简单。前面用的map等都是Flink封装好的,底层则是process。当现有的算子无法实现需求时,直接用process就行,最底层,最灵活,逻辑你自己开发就行,!!!处理函数的使用和前面的转换算子一样,基于DataStream对象调用即可:ProcessFun原创 2023-10-26 20:40:16 · 480 阅读 · 0 评论 -
【API篇】十二、Flink基于时间的合流:窗口联结和间隔联结
前面的分流合流篇中,使用connect实现了两个元组流中元素的f0的匹配。如果改为统计两条流数据的匹配情况,固定时间内 ⇒ 窗口,为了更方便地实现基于时间的合流操作,Flink的DataStrema API提供了内置的join算子,即基于时间的双流联结Join。原创 2023-10-26 09:21:27 · 340 阅读 · 0 评论 -
【API篇】十一、Flink水位线传递与迟到数据处理
(本来8.30上课,老师等等家远的学生,说8.40开始讲课,结果你却9.00才到,那就门口站着取,别听了,类比数据不会再被对应窗口统计)如果过了推迟时间,你仍没有到,那就窗口关闭,教室关门,你去网吧游荡吧。在上面的延迟关窗与允许迟到的基础上,肯定还是不能囊括所有数据,因为乱序程度理论上可以无限大,如上的例子,对于等了10分钟才开课,且到了关教室门的时间还没到的学生,让去网吧游荡也不合理(类比流中直接丢弃这个数据),可以考虑把严重迟到的学生领到保安室,对应到Flink,那就是把乱序极大的数据使用侧流输出。原创 2023-10-25 17:38:23 · 836 阅读 · 0 评论 -
【API篇】十、生成Flink水位线
上面只是定义了时间戳的提取逻辑,水位线的生成采用的默认内置策略。接下来自定义水位线生成器:周期性水位生成器。周期性生成器是通过onEvent()观察判断输入的事件,而在onPeriodicEmit()里发射生成的水位线// 自定义水位线的产生// 定义Watermark策略// 1.1 指定watermark生成器// 1.2 指定时间戳分配器,从数据中提取// 返回的时间戳,要 毫秒。原创 2023-10-25 13:42:13 · 861 阅读 · 0 评论 -
【API篇】九、Flink的水位线
像图中的11和12这两条数据(橙色),该是第二个桶的还是会去第二个桶,每个窗口都是一个个独立的桶,每个数据都会分发到对应的桶中,当到达窗口结束时间时,对每个桶中收集的数据进行计算处理。有个0-10秒的窗口,乱序数据下,有个10s的数据先到了,如果按正常逻辑,水位线就会被推进到10s的时刻,10s > 10s-1ms ,此时就会触发窗口关闭和输出,但这个输出可能还有迟到的数据未统计到。08:59:59的数据到了,逻辑时钟才认为时间到了08:59:59,没有数据来,逻辑时钟就不会推进。原创 2023-10-24 20:43:33 · 620 阅读 · 3 评论 -
【API篇】八、Flink窗口函数
上一节的窗口分配器,指明了窗口类型,知道了数据属于哪个窗口并收集。而窗口函数,则是定义如何对这些数据做计算操作。运行,输入数据,查看控制台:上面使用ReduceFunction的限制是,输入数据的类型、聚合中间状态的类型、输出结果的类型必须一致,AggregateFunction则没有这个限制。AggregateFunction接口有四个方法:运行,输入数据,查看控制台:全窗口函数,即数据来了不计算,存起来,窗口触发的时候,计算并输出计算结果Flink全窗口函数有两种,第一种为apply方法下的:传入原创 2023-10-24 17:57:40 · 783 阅读 · 0 评论 -
【API篇】七、Flink窗口
在批处理统计中,可以等待一批数据都到齐后,统一处理。但是在无界流的实时处理统计中,是来一条就得处理一条,那么如何统计最近一段时间内的数据呢?⇒ 窗口的概念:将无限数据切割成一个个的"数据块"原创 2023-10-23 21:16:31 · 615 阅读 · 0 评论 -
【API篇】六、Flink输出算子Sink
现有的Flink连接器不能满足需求时,需要自定义连接器进行输出。与Source类似,Flink提供了通用的接口和对应的RichSinkDunction抽象类,实现这个接口,就可通过DataStream的.addSink()方法自定义写入任何的外部存储。@Override//输出逻辑//value即流中的数据,来一条数据,invoke方法就被调用一次(所以不要在这里创建连接对象)//如果你的外部存储必须先创建连接对象,那就用富函数的生命周期方法去创建连接对象@Overrdie。原创 2023-10-23 19:26:34 · 1019 阅读 · 0 评论 -
【API篇】五、Flink分流合流API
分流,很形象的一个词,就像一条大河,遇到岸边有分叉的,而形成了主流和测流。对于数据流也一样,不过是一个个水滴替换成了一条条数据。将一条数据流拆分成完全独立的两条、甚至多条流。也就是基于一个DataStream,定义一些筛选条件,将符合条件的数据拣选出来放到对应的流里。原创 2023-10-18 19:16:58 · 911 阅读 · 4 评论 -
【API篇】四、Flink物理分区算子API
Override//numPartitions 下游算子并行度//这里的分区策略,简单写个key除以算子并行度取余//该方法返回的是分区索引自定义分区用的api是partitionCustompartitionCustom方法第一个参数是自定义的分区器对象第二个参数是key的选择器对象KeySelector,和keyBy方法一样,value -> value即以输入数据为key到此,就实现了数据往下游算子的子任务分配时,按什么规则来分。原创 2023-10-16 21:20:48 · 327 阅读 · 0 评论 -
【API篇】三、Flink转换算子API
自定义函数,即用户根据自己的需求,重新实现算子的逻辑。Flink暴露了所有UDF函数的接口,具体实现方式为接口或者抽象类,例如MapFunction、FilterFunction、ReduceFunction等。所以用户可以自定义一个函数类,实现对应的接口。//new对象的时候传入str,通过构造方法赋值给了id属性this.id=id;@Override//当前对象的id属性。原创 2023-10-16 20:02:33 · 422 阅读 · 0 评论 -
【API篇】二、Flink源算子API
Flink还具有一个类型提取系统,可以分析函数的输入和返回类型,自动获取类型信息,从而获得对应的序列化器和反序列化器。但是,由于Java中泛型擦除的存在,在某些特殊情况下(比如Lambda表达式中),自动提取的信息是不够精细的,需要我们手动显示提供类型信息。Flink会把泛型类型当作黑盒,无法获取它们内部的属性,它们也不是由Flink本身序列化的,而是由Kryo序列化的。Flink1.12以前,添加数据源的方式是,调用执行环境对象的addSource方法。来统一表示数据类型。原创 2023-10-14 23:21:40 · 218 阅读 · 0 评论 -
【API篇】一、Flink执行环境API
写完输出(sink)操作并不代表程序已经结束,因为当main()方法被调用时,其实只是定义了作业的每个执行操作,然后添加到数据流图中,这时并没有真正处理数据,因为数据可能还没来。Flink是由事件驱动的,只有等到数据到来,才会触发真正的计算,这也被称为。Flink的程序可以在各种上下文环境中运行,比如本地JVM中执行,也可以提交到远程集群中运行,分别对应着不同的Flink的运行环境,获取这个执行环境,也就是StreamExecutionEnvironment类的对象。前者用的更多,不推荐硬编码。原创 2023-10-13 10:01:57 · 536 阅读 · 0 评论 -
【基础篇】七、Flink核心概念
但每个TaskManager总的计算资源有限,并行任务越多,每个线程能分到的可用资源就越少,为了限制TaskManager能并行处理的最大任务数,提出任务槽(task slots)的概念,对TaskManager上对每个任务运行所占用的资源做出明确的划分。也就是每一个算子的子任务task,会根据某些规则,把数据发送到不同的下游task,从而引起了数据重分区。map 算子的子任务,看到的元素个数和顺序跟source 算子的子任务产生的完全一样,即一对一,一个算子的task和一个算子的task数据一样。原创 2023-10-13 09:57:22 · 1016 阅读 · 1 评论 -
【基础篇】四、本地部署Flink
独立部署就是独立运行,即Flink自己管理Flink资源,不依靠任何外部的资源管理平台,比如K8S或者Hadoop的Yarn,当然,独立部署的代价就是:如果资源不足,或者出现故障,没有自动扩展或重分配资源的保证,必须手动处理,生产环境或者作业量大的场景下不建议采用独立部署。应用模式与单作业模式,都是提交作业之后才创建集群,不同的时,单作业模式是通过客户端来提交的,客户端解析出的每一个作业对应一个集群,而应用模式下,是直接由JobManaget执行应用程序的。原创 2023-10-12 16:52:12 · 2536 阅读 · 0 评论 -
【基础篇】三、Flink集群角色、系统架构以及作业提交流程
TaskManager是Flink中的工作进程,数据流的具体计算就是它来做的。需要注意在早期版本的Flink中,没有JobMaster的概念,而JobManager的概念范围较小,实际指的就是现在所说的JobMaster。这里的ResourceManager是Flink内置的资源管理组件,和其他资源管理平台(比如YARN)的ResourceManager不是一个东西。在执行过程中,TaskManager可以缓冲数据,还可以跟其他运行同一应用的TaskManager交换数据。的核心,是控制应用执行的主进程。原创 2023-10-12 16:51:24 · 1535 阅读 · 0 评论 -
【基础篇】二、Flink的批处理和流处理API
但是,由于Java中泛型擦除的存在,在某些特殊情况下(比如Lambda表达式中),自动提取的信息是不够精细的——只告诉Flink当前的元素由“船头、船身、船尾”构成,根本无法重建出“大船”的模样;flatMap方法的形参是一个FlatMapFunction类型的对象,FlatMapFunction是一个接口,new接口的对象得实现它的方法flatMap,该方法两个形参,第一个即进入Flink的源数据,demo中是String,第二个参数是Collector类型的收集器,向下游发送数据。原创 2023-10-11 10:05:51 · 690 阅读 · 0 评论 -
【基础篇】一、什么是Flink
DaaStream API(流处理)和DataSet API(批处理)封装了底层处理函数,提供了通用的模块,比如转换 (tansformations,包括map、flatmap等),连接(joins),聚合 (aggregations),窗口(windows)操作等。再举个有界流的例子,水桶下面钻个孔,让水往外流,桶里的流光了,就停了,不会无休止的流,这就是一个有界流。状态既指数据结果本身,也指一些中间数据,比如你蹲马路边上,数过往的车辆,过一辆你就在纸上记个1,再过一辆你就记2,1和2就是一个状态。原创 2023-10-10 08:57:14 · 1493 阅读 · 0 评论