- 博客(74)
- 收藏
- 关注
原创 Flink广播状态中使用非基本类型
在Flink状态编程中,经常会用到状态编程,其中也包括广播状态。在这次的项目中,基本类型已无法满足业务场景,经过研究,可以在广播状态中使用其他的类型,比如HashMap,定义广播变量的时候,只需要在类型声明出做出调整。
2023-04-11 21:31:39
319
原创 Flink RocketMQ Connector实现
Public可以看到,自定义的Source,只需要实现SourceFunction。创建FlinkRocketMQConsumer,实现SourceFunction,重写run()和cancel()方法@Override@Override这样,在FlinkRocketMQConsumer类加载的时候,就会初始化一个consumer。另外,还需要对consumer进行初始化,需要知道nameSrvAddr和topic,所以添加一个构造方法,对consumer进行初始化。
2023-03-21 11:44:45
2635
原创 Flink窗口机制
文章目录(一)窗口分类(二)一、窗口分类键控窗口 和 非键控窗口 时间窗口 和 计数窗口 滑动窗口 和 滚动窗口 会话窗口根据窗口不同的分类规则,大致可以分为上面几种。从上至下,更加具体。比如,键控窗口和非键控窗口都可以调定义时间窗口和计数窗口;而时间窗口和计数窗口,都可以定义滑动窗口和滚动窗口;另外,在时间窗口中,还有一个特例,就是会话窗口。二、键控窗口 和 非键控窗口根据在开窗之前,是否执行了 keyBy() 操作,分为 键控窗口 和 非键控窗口。顾名思义,键控窗口,
2022-05-26 15:22:07
1781
原创 Flink优化04---数据倾斜
一、数据倾斜定位通过 Web UI 各个 SubTask 的 Records Sent 和 Records Received 来确认,另外,还可以通过 Checkpoint detail 里不同的 SubTask 的 State Size 来判断是否数据倾斜。例如上图,节点 2 的数据量明显高于其他节点的数据量,数据发生了很严重的倾斜问题。二、数据倾斜的解决办法2.1 keyBy 前的数据倾斜这种情况,需要视数据来源而定。比如从 kafka 读取数据,根据可能存在的不同场景,采取不同
2022-04-08 11:35:48
2875
1
原创 Flink优化03---反压处理
一、概述1.1 反压的理解简单来说,数据在 flink 拓扑中多个节点自上而下流动,下游处理数据较慢,导致上游数据发送阻塞,最终导致数据源的获取也被阻塞。也就是说,下游处理数据的速度跟不上数据流入的速度,会导致数据流入阻塞,并反馈到上游,使上游数据的发送也产生阻塞。通常情况下,大促销、秒杀活动导致流量激增,会导致反压的产生。1.2 反压的危害反压的出现,会影响到 checkpoint 时长和 state 大小,进而可能导致资源耗尽甚至系统奔溃。1)影响 checkpoint 时长
2022-04-07 20:23:12
6931
原创 Flink优化02--状态及Checkpoint调优
一、状态简述Flink的状态分为三种:MemoryStateBackend:默认的方式,即基于JVM的堆内存进行存储,主要适用于本地开发和调试;FsStateBackend:基于文件系统进行存储,可以是本地文件系统,也可以是HDFS等分布式文件凶系统。需要注意,虽然选择使用 FsStateBackend,但是正在进行的数据仍然存储在 TaskManager的内存中,只有在 checkpoint 时,才会将状态快照写入到指定文件系统上;RocksDBStateBackend:Flink内置的第三方状
2022-04-07 14:24:20
3956
原创 Flink广播状态清理
在Flink实时计算的实际项目中,广播中的状态,可能并不是需要一直存在,只需要当天存在,之后不再会用到。这种情况下,如果状态数据一直不清理,量会越来越庞大,占用内存,时间长,甚至会导致内存溢出。所以需要对过期的广播状态进行清理。但是状态过期清理的机制,目前仅是对keyed state来说的有效,对广播状态不起作用。因此,需要自己手动去处理。按照flink keyed state过期处理的思想,手动实现对过期的广播状态的清理;主要逻辑如下:(1)广播状态设置一个状态,专门存储一个时间戳毫秒值,通
2022-04-06 17:00:26
2090
原创 Flink优化01---资源配置调优
1、Flink内存模型(TaskManager)从上面的内存模型图可以看出内存结构:1) Flink使用了JVM Heap(堆内内存)和Off-Heap Memory(堆外内存);2)JVM Heap(堆内内存)包含Framework Heap(框架内存)和Task Heap(Task堆内内存);3)Off-Heap Memory(堆外内存)包含Managed Memory(管理内存)、Direct Memory(直接内存)和JVM特有内存(JVM Metaspace + JVM Ove
2022-02-28 16:36:34
2735
原创 Flink timer定时器使用
窗口函数的问题工作中使用到了窗口,进行阶段数据的统计。对于大部分场景是能够满足的,但是还是发现了一些问题。比如,窗口内有数据,却无法触发计算。此处以翻滚时间窗口,事件时间取处理时间为例进行说明,窗口触发的条件都是:①water_mark时间 >= window_end_time;② 窗口内有数据;首先确定窗口内有数据,第②个条件满足。但是需要格外注意第①个条件,就是water_mark时间。water_mark时间的更新,需要后续有数据进来。如果后续没有数据进行,water_mark就.
2022-01-26 16:08:07
3942
原创 Flink POJO类状态使用注意事项
Flink 基于下面的规则来支持 POJO 类型状态数据结构的升级:可以删除字段。一旦删除,被删除字段的前值将会在将来的 checkpoints 以及 savepoints 中删除。可以添加字段。新字段会使用类型对应的默认值进行初始化,比如 Java 类型。不可以修改字段的声明类型。不可以改变 POJO 类型的类名,包括类的命名空间。需要注意,只有从 1.8.0 及以上版本的 Flink 生产的 savepoint 进行恢复时,POJO 类型的状态才可以进行升级。 对 1.8.0 版
2021-11-03 19:33:12
1464
原创 Java基础03--非阻塞队列
我们知道,队列加锁会影响到性能,但是加锁的方式可以实现队列有界。不加锁的方式实现的队列,由于无法保证队列的长度在确定的范围内,所以队列是无界的。ConcurrentLinkedQueue就是一个典型的非阻塞、无边界的线程安全队列,基于链接节点,采用CAS算法实现。CoucurrentLinkedQueue规定了如下几个不变形: 1. 在入队的最后一个元素的next为null; 2. 队列中所有未删除的节点的item都不能为null且都能从head节点遍历到;...
2021-09-27 17:45:41
1532
原创 Java基础02---集合详解
本文分为List、Set两大部分,从底层逻辑,对List和Set进行分析。一、ListList继承自Collection集合,排列有序且可重复,有索引,可以根据索引检索。1. LinkedList基于链表实现,线程不安全;可以在任意位置高效插入和删除一个有序序列。1.1 容量和扩容没有初始容量,也没有扩容机制。1.2 创建// 创建一个双向链表,每个节点含有一个数据,并包含上一个节点对象的引用和下一个节点对象的引用LinkedList<String> link
2021-09-10 17:48:53
356
原创 Flink1.13---给事件分配水印
在flink1.13版本中,给事件分配水印,直接在流上,调用时间戳和水印分配策略,传入WatermarkStrategy。参考官网:WatermarkStrategy .<Tuple2<Long, String>>forBoundedOutOfOrderness(Duration.ofSeconds(20)) .withTimestampAssigner((event, timestamp) -> event.f0);其中,<
2021-07-05 17:19:47
619
原创 Flink---记一次窗口无法触发计算的问题
最近,在协助其他同事测试flink消费kafka数据,窗口计算的准确性问题。1、现象 同事往kafka发送数据,结果窗口一直无法触发计算。但是使用我的mock代码,往kafka发送数据时,窗口计算正常触发。2、问题 经过排查,同事的代码把所有的数据发往kafka的一个分区;我的代码会负载均衡,发到所有分区。3、分析 kafka有三个分区,flink程序会读取到来自三个分区的数据,并取每个分区的最新时间作为水位线,然后取三个分区的水位线最低的,...
2021-07-05 17:06:59
1506
原创 Flink本地运行webUI无法访问显示{“errors“:[“Not found.“]} 解决办法
一、问题描述在本地运行flink程序,希望可以通过webUI界面查看作业运行情况。pom文件(局部)<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://m
2021-05-13 14:10:31
4617
1
原创 Flink 容错详解
一、背景Flink的容错机制,就是checkpoint;把状态保存起来,用于容错;否则,状态就失去了存在的意义。二、checkpoint详解1)概念①一种连续周期性绘制数据流状态的机制。这种机制确保即使程序出现故障,也可以顺利恢复到故障之前的状态,确保exactly once语义的保证。 注意:这种保证,只能在flink内部系统做保证,对于外部的source和sink,需要外部主键一同保证②全局快照,持久化保存所有的task和operator的state③可以通过配置,使用a..
2021-02-05 14:30:19
576
1
原创 Spark Streaming消费kafka数据
Spark Streaming消费kafka数据有两种方式,一种是基于接收器消费kafka数据,使用Kafka的高级API;另一种是直接消费方式,使用Kafka的低级API。下面,详细说明、对比下这两种方式的优缺点。一、Receiver-based Approach这种方式,采用Kafka的高级API,使用接收器接收kafka的消息。接收器在接收到kafka数据后,把数据保存在Spark executor中,然后Spark Streaming任务再从中获取数据。采用这种方式,默认配置情况下,
2021-01-22 18:13:51
1368
1
原创 org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException
问题SparkStreaming实时消费kafka数据,数据聚合后重分区,每个分区内部,写hive表;写文件的过程中,文件名具体到批次时间。通过executor的日志,发现偶尔会有下面的报错21/01/06 13:44:00 WARN DFSClient: DataStreamer Exceptionorg.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException)
2021-01-06 16:37:46
944
原创 SparkStreaming executor异常dead
问题SparkStreaming实时消费kafka数据,程序正常运行,数据正常写入数据库,但是executor大量异常dead。问题排查经过排查,在每个dead的executor中的日志中,都会有一个报错:ERROR executor.CoarseGrainedExecutorBackend: RECEIVED SIGNAL TERM,其他没有任何报错信息;查阅大量资料,发现可能是因为spark的动态executor分配导致;在${SPARK_HOME}/con/spark-defaul
2020-12-22 11:37:06
746
1
原创 Subline Text3 中文插件安装
首次启动应用程序,是英文版的,如下图所示按照以下步骤,安装中文插件1、Shift + Ctrl + p,打开搜索框,搜索 install,点击绿框中的选项2、点击之后,开始安装安装包,可能需要等一会;可以看左下角安装进程,是否在安装中;安装完成后,显示如下:3、在搜索框中,搜索Chinese,在下拉选择框中,选择 ChineseLocalizations观察左下角安装进度,安装完成后,退出重新打开4、Help -> Language -> 简体中文至此
2020-11-16 17:16:06
247
原创 Kafka生产者拦截器
一、简介kafka生产者拦截器主要用于在消息发送前对消息内容进行定制化修改,以便满足相应的业务需求,也可用于在消息发送后获取消息的发送状态,所在分区和偏移量等信息。同事,用户可以在生产者中指定多个拦截器形成一个拦截器链,生产者会根据指定顺序先后调用。Kafka生产者拦截器的访问流程如下:这里的拦截器为两个拦截器组成的一个拦截器链。第一个拦截器为时间拦截器,作用是在消息发送之前修改消息的内容,在消息最前面加入当前时间戳;第二个拦截器为消息发送状态拦截器,作用是统计消息发送成功和失败的数量。.
2020-11-02 16:57:39
710
原创 sbt初始之版本冲突
使用sbt架构,在本地测试Scala编写的spark程序的时候,报错如下:Exception in thread "main" java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package参考网络上的资料,可能是Hadoop-common版本
2020-10-19 10:52:51
279
原创 SparkStreaming性能调优
一、数据接收并行度调优——创建更多的输入DStream和Receiver通过网络接收数据时(比如Kafka,Flume),会将数据反序列化,并存储在Spark的内存中。如果数据接收成为系统的瓶颈,可以考虑并行化数据接收。每个输入DStream都会在某个Worker的Executor上启动一个Receiver,该Receiver接收一个数据流。因此可以通过创建多个输入DStream,并配置它们接...
2019-04-25 19:37:55
1829
原创 SparkSQL性能优化
一、设置Shuffle过程中的并行度设置参数:SQLContext.setConf("spark.sql.shuffle.prititions",xxx);二、设置合理的数据类型在Hive数据仓库建设过程中,合理设置数据类型,比如能设置为IINT的,就不要设置成BIGINT,减少数据类型导致的不必要的内存开销。三、明确列名编写SQL是,尽量给出明确的列明,比如sel...
2019-04-25 17:49:09
694
原创 Spark streaming实时计算程序的性能优化
一、并行化数据接收这个 方法在处理多个topic的数据是比较有效。 int numStreams = 5; List<JavaPairDStream<String, String>> kafkaStreams = new ArrayList<JavaPairDStream<String, String>>(numStreams)...
2019-03-11 21:30:52
513
原创 Spark streaming实时计算程序的HA高可用
一、设置checkpoint目录在程序中,如果用到了updateStateByKey、window等有状态的操作,自动进行checkpoint,必须设置checkpoint目录。checkpoint目录:容错的文件系统的目录,比如说,HDFSjssc.checkpoint("xxxxxxx");设置完这个目录之后,有些会自动进行checkpoint操作的DStream,就实现了HA...
2019-03-11 20:07:06
403
原创 Spark SQL数据倾斜解决方案
由于Spark都是基于RDD的特性,所以可以用纯RDD的方法,实现和Spark SQL一模一样的功能。之前在Spark Core中的数据倾斜的七种解决方案,全部都可以直接套用在Spark SQL上。Spark SQL的数据倾斜解决方案:聚合源数据:Spark Core和Spark SQL没有任何区别 过滤导致倾斜的key:在sql中用where条件 提高shuffle并行度:gro...
2019-03-10 20:24:38
3039
原创 数据倾斜解决方案之原理以及现象分析
一、什么是数据倾斜数据倾斜是大数据类型项目中最棘手的性能问题。数据倾斜一般会有两种表现: 大部分task执行很快,只有极少数的task执行得特别慢,可能耗费数个小时。 大部分task很快执行完,但有的task会突然报OOM内存溢出,导致task fail、task lost、resubmitting task,反复执行几次,特定的task还是跑不通,最后挂掉。可能是因为这个ta...
2019-03-10 18:33:48
718
原创 troubleshooting---线上问题解决
一、控制shuffle reduce端缓冲大小以避免OOMreduce端的task读取数据时,并不是等到map端task将属于自己的那份数据全部写入磁盘文件之后再去拉取,而是先把数据拉取进缓冲区,然后才用后面的executor分配的堆内存占比(比如0.2)来进行后续的聚合、函数的执行。reduce端缓存默认是48M。①减小reduce端缓冲大小当map端数据量比较大,并且写出的速度很快...
2019-03-10 18:16:25
468
原创 Spark性能调优---算子调优
一、MapPartitions提升Map类型操作性能Spark中,每个task处理一个RDD的partition。①MapPartitions的优点如果是普通的map,比如一个partition中有一万条数据,那么function需要执行和计算一万次。如果使用了MapPartitions,一个task只执行一次function,function一次接受所有的partition数据。只要...
2019-03-05 22:07:46
327
原创 Spark性能调优---JVM调优之原理概述及降低cache操作的内存占比
一、原理概述①理论Spark是用Scala开发的。Spark的Scala代码调用了很多java api。Scala也是运行在JVM中的,所以Spark也是运行在JVM中的。②JVM可能会产生什么样的问题?内存不足——RDD的缓存、task运行定义的算子函数,可能会创建很多对象,占用大量的内存。处理不当,可能导致JVM出问题。③堆内存作用:存放项目中创建的对象。 划分:新生...
2019-02-28 21:22:57
283
原创 Spark性能调优---JVM调优之调节executor堆外内存与连接等待时长
一、executor堆外内存①理论在实际项目中,有时候需要处理大量的数据,比如上亿、数十亿条数据,发现项目时不时地报错:shuffle file not found,executor lost,task lost,out of memory等等。之所以出现上述问题,可能是因为executor的堆外内存不足,导致executor在运行的过程中,内存溢出。后续stage的task在运行的时...
2019-02-28 21:22:02
388
原创 shuffle原理及调优
一、原理概述①什么是shuffle?以reduceByKey为例,要把分布在集群各个节点上的数据中的同一个key对应的values集中到一块,集中到集群中同一个节点上。更严格地说,集中到同一个节点的同一个executor的task中。集中同一个key对应的values之后,数据变成<key,Iterable<value>>,算子函数对values进行reduce...
2019-02-25 21:26:32
601
原创 Spark性能调优(四)---其他几个性能调优策略
一、广播大变量被大量task使用的变量,使用广播。被广播的变量,在Driver中存在一个初始副本。这样,就不需要每个task都拥有一个变量的副本,节省网络传输的资源和内存的资源;每一个BlockManager有一个变量的副本,BlockManager中没有变量的时候,可以去Driver中获取,也可以从距离最近的其他BlockManager中获取。设置广播变量:sc.broadcast();...
2019-02-18 14:57:22
228
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人