Flink生产环境相关问题

01-Flink Metrics简介 Flink Metrics简介 阅读详情

1. Flink+Kafka保证精确一次消费相关问题?

Fink的检查点和恢复机制和可以重置读位置的source连接器结合使用,比如kafka,可以保证应用程序不会丢失数据。尽管如此,应用程序可能会发出两次计算结果,因为从上一次检查点恢复的应用程序所计算的结果将会被重新发送一次(一些结果已经发送出去了,这时任务故障,然后从上一次检查点恢复,这些结果将被重新计算一次然后发送出去)。这个时候需要下层sink做到幂等性或者事务。

所以

·   souce:使用执行ExactlyOnce的数据源,比如kafka等

·   内部使用FlinkKafakConsumer,并开启CheckPoint,偏移量会保存到StateBackend中,并且默认会将偏移量写入到topic中去,即_consumer_offsets Flink设置CheckepointingModel.EXACTLY_ONCE

·   sink:

存储系统支持覆盖也即幂等性:如Redis,Hbase,ES等

存储系统不支持覆:需要支持事务(预写式日志或者两阶段提交),两阶段提交可参考Flink集成的kafka sink的实现。

2. 你们的Flink怎么提交的?使用的per-job模式吗?

模式

生命周期

资源隔离

优点

缺点

main方法

Session

关闭会话,才会停止

共用JM和TM

预先启动,启动作业不再启动。资源充分共享

资源隔离比较差,TM不容易扩展

在客户端执行

Per-job

Job停止,集群停止

单个Job独享JM和TM

充分隔离,资源根据job按需申请

job启动慢,每个job需要启动一个JobManager

在客户端执行

Application

当Application全部执行完,集群才会停止

Application使用一套JM和TM

Client负载低,Application之间实现资源隔离,Application内实现资源共享

对per-job模式和session模式的优化部署模式(优点)

在Cluster中

欢迎关注,一起学习

3. 了解过Flink的两阶段提交策略吗?讲讲详细过程。如果第一阶段宕机了会怎么办?第二阶段呢?

顾名思义,2PC将分布式事务分成了两个阶段,两个阶段分别为提交请求和提交。协调者根据参与者的响应来决定是否需要真正地执行事务

提交请求阶段

·   协调者向所有参与者发送prepare请求与事务内容,询问是否可以准备事务提交,并等待参与者的响应。

·   参与者执行事务中包含的操作,并记录undo日志(用于回滚)和redo日志(用于重放),但不真正提交。

·   参与者向协调者返回事务操作的执行结果,执行成功返回yes,否则返回no

提交执行阶段

分为成功与失败两种情况。

若所有参与者都返回yes,说明事务可以提交:

·   协调者向所有参与者发送commit请求。

·   参与者收到commit请求后,将事务真正地提交上去,并释放占用的事务资源,并向协调者返回ack。

·   协调者收到所有参与者的ack消息,事务成功完成。

若有参与者返回no或者超时未返回,说明事务中断,需要回滚:

·   协调者向所有参与者发送rollback请求

·   参与者收到rollback请求后,根据undo日志回滚到事务执行前的状态,释放占用的事务资源,并向协调者返回ack

·   协调者收到所有参与者的ack消息,事务回滚完成

对于Flink sink是kafka为例:

每当需要做checkpoint时,JobManager就在数据流中打入一个屏障(barrier),作为检查点的界限。屏障随着算子链向下游传递,每到达一个算子都会触发将状态快照写入状态后端(state BackEnd)的动作。当屏障到达Kafka sink后,触发preCommit(实际上是KafkaProducer.flush())方法刷写消息数据,但还未真正提交。接下来还是需要通过检查点来触发提交阶段。

第一阶段宕机,这个时候offset没有提交,重新启动会按offset继续消费和从状态中恢复状态值。

第二阶段宕机,分两种情况,在提交阶段后宕机,因为这个链路已经处理完,重新启动会按offset继续消费。在checkpint完成后宕机,还没有来得及触发提交阶段,这个时候可能会出现丢数据情况,这个时候有学者提出了三阶段提交。

4. 你是如何通过Flink实现uv的?

用户id刚好是数字,可以使用bitmap去重,简单原理是:把 user_id 作为 bit 的偏移量 offset,设置为 1 表示有访问,使用 1 MB的空间就可以存放 800 多万用户的一天访问计数情况。

val bloomFilter = new Bloom(1<<29) 
// 先定义redis中存储位图的key    
val storedBitMapKey = "xxxxx" 
// 去重:判断当前userId的hash值对应的位图位置,是否为0    
val userId = elements.last._2.toString    
// 计算hash值,就对应着位图中的偏移量    
val offset = bloomFilter.hash(userId, 61)    
val isExist = jedis.getbit(storedBitMapKey, offset) 


class Bloom(size: Long) extends Serializable{  
  private val cap = size    // 默认cap应该是2的整次幂   

  //hash函数 value即userid,seed随机数种子  
  def hash(value: String, seed: Int): Long = {    
    var result = 0    
    //遍历userid,对每一位进行随机数种子的处理    
    for( i <- 0 until value.length ){      
      result = result * seed + value.charAt(i)    
    }     
    // 返回hash值,要映射到cap范围内    
    (cap - 1) & result  
  }
}

当然还有:Flink自带BloomFilter, google现成的布隆过滤器。

5. Flink中的双流join怎么实现?

Flink双流JOIN主要分为两大类。一类是基于原生State的Connect算子操作,另一类是基于窗口的JOIN操作。其中基于窗口的JOIN可细分为window join和interval join两种。

实现原理:底层原理依赖Flink的State状态存储,通过将数据存储到State中进行关联join, 最终输出结果。

Window join

将两条实时流中元素分配到同一个时间窗口中完成Join。底层原理: 两条实时流数据缓存在Window State中,当窗口触发计算时,执行join操作。

源码核心总结:windows窗口 + state存储 + 双层for循环执行join()

join+where+equalTo 算子实现inner join
coGroup+where+equalTo 可算子实现left/right join

这个时候有个问题,某流数据可能晚到,导致窗口关闭了都没有join上

Interval Join的双流JOIN实现机制

Interval Join根据右流相对左流偏移的时间区间(interval)作为关联窗口,在偏移区间窗口中完成join操作。满足数据流stream2在数据流stream1的 interval(low, high)偏移区间内关联join。interval越大,关联上的数据就越多,超出interval的数据不再关联。

实现原理:interval join也是利用Flink的state存储数据,不过此时存在state失效机制ttl,触发数据清理操作。比如:

orderStream.keyBy(_.1)
    // 调用intervalJoin关联
    .intervalJoin(orderDetailStream._2)
    // 设定时间上限和下限
    .between(Time.milliseconds(-30), Time.milliseconds(30))  
    .process(new ProcessWindowFunction())
 
class ProcessWindowFunction extends ProcessJoinFunction...{
   override def processElement(...) {
      collector.collect((r1, r2) => r1 + " : " + r2)
   }
}

基于Connect的双流JOIN实现机制

对两个DataStream执行connect操作,将其转化为ConnectedStreams, 生成的Streams可以调用不同方法在两个实时流上执行,且双流之间可以共享状态。这个时候结合状态,如果某流数据没有过来先存状态,后流过来去状态去找,没有再存状态。

orderStream.connect(orderDetailStream)
  .keyBy("orderId", "orderId")
  .process(new orderProcessFunc());

6. Flink的checkpoint文件是保存在哪里, 可以选择哪些?

MemoryStateBackend

在 CheckPoint 时,State Backend 对状态进行快照,并将快照信息作为 CheckPoint 应答消息的一部分发送给 JobManager(master),同时 JobManager 也将快照信息存储在堆内存中。

FsStateBackend

FsStateBackend 将正在运行中的状态数据保存在 TaskManager 的内存中。CheckPoint 时,将状态快照写入到配置的文件系统目录中。少量的元数据信息存储到 JobManager 的内存中

RocksDBStateBackend

RocksDBStateBackend 将正在运行中的状态数据保存在 RocksDB 数据库中,RocksDB 数据库默认将数据存储在 TaskManager 的数据目录。CheckPoint 时,整个 RocksDB 数据库被 checkpoint 到配置的文件系统目录中。

7. Flink 维表关联怎么做的(应该是开发必做,建议提前准备)

(1) 查找关联(同步,异步)

(2) 状态编程,预加载数据到状态中,按需取

(3) 冷热数据

(4) 广播维表

(5) Temporal Table Join

8. Flink 数据倾斜是怎么解决的?

(1)定位反压

Flink Web UI 自带的反压监控(直接方式)、Flink Task Metrics(间接方式)。通过监控反压的信息,可以获取到数据处理瓶颈的 Subtask。

(2)确定数据倾斜

Flink Web UI 自带Subtask 接收和发送的数据量。当 Subtasks 之间处理的数据量有较大的差距,则该 Subtask 出现数据倾斜。

解决

(1)数据源 source 消费不均匀

通过调整Flink并行度,解决数据源消费不均匀或者数据源反压的情况。我们常常例如kafka数据源,调整并行度的原则:Source并行度与 kafka分区数是一样的,或者 kafka 分区数是KafkaSource 并发度的整数倍。建议是并行度等于分区数。

(2)key 分布不均匀

上游数据分布不均匀,使用keyBy来打散数据的时候出现倾斜。通过添加随机前缀,打散 key 的分布,使得数据不会集中在几个 Subtask。

两阶段聚合解决 KeyBy(加盐局部聚合+去盐全局聚合)

预聚合:加盐局部聚合,在原来的 key 上加随机的前缀或者后缀。

聚合:去盐全局聚合,删除预聚合添加的前缀或者后缀,然后进行聚合统计。

8.Flink如何处理乱序数据?

比如我们现在设置了每5秒一次的滚动窗口,比如我们从Kafka中的读取到的第一个事件时间为10:00:00

以此从kafka读取数据如下

A(10:00:00),B(10:00:01),C(10:00:05),D(10:00:06),E(10:00:03),F(10:00:04)

当D(10:00:06)时间到了,就会触发【10:00:00-10:00:05)窗口(只是简单举个例子,没有严格意义上的按照源码公式去划分窗口),后续的E,F数据就会被抛弃,会被忽略计算。

为了解决根据事件时间计算可能会产生这种问题,Flink 提供了WaterMarker机制,利用一定的延迟容忍,可一定程度上避免因消息乱序导致的错误计算或者数据丢失。

单数据流情况(并行度=1):WaterMarker=当前数据流中当前元素最大事件时间 - 最大允许的延迟时间或乱序时间。

对于多流而言(并行度>1的source task),它每个独立的subtask都会生成各自的watermark。这些watermark会随着流数据一起分发到下游算子,并覆盖掉之前的watermark。当有多个watermark同时到达下游算子的时候,flink会选择较小的watermark进行更新。当一个task的watermark大于窗口结束时间时,就会立马触发窗口操作。

watermark可以在一定程度上解决事件乱序问题,但严重的乱序问题依然无法解决!我们可以结合侧位输出来收集更为延迟的数据,避免延迟数据丢失。所以,不可过度依赖WaterMarker帮助我们解决乱序问题,如果发生过多乱序问题应注重检查生产数据的生产端问题。还有一点要注意的:watermark是一个全局的值,不是某一个key下的值,所以即使不是同一个key的数据,其watermark也会不断增加。

9. Flink内存溢出怎么办?

当Flink程序在运行过程中发生内存溢出,一种可能的原因是任务需要处理的数据量超过了可以保存在内存中的数据,导致运算符将部分数据溢出到磁盘。对于这种情况,我们可以尝试以下几种解决方法:

  1. 优化程序逻辑,减小数据的处理量。例如,我们可以使用更高效的算法或者对数据进行预处理来减少数据的复杂性。
  2. 调整Flink程序的并行度。根据具体的问题和硬件环境,增加或减少并行度可能会带来更好的性能。
  3. 调整Flink程序的内存配置。我们可以根据程序的实际需求和系统资源情况,提高或降低Flink程序可以使用的内存量。
  4. 如果上述方法都无法解决问题,那么可能需要考虑升级硬件资源,增加服务器的内存。

10. Flink试过哪些优化?

优化的话:可以参考下面几点

  1. GC的配置
    (1)调整老年代与新生代的比值 或者 更换垃圾收集器
    (2)增加JVM内存
  2. 数据倾斜
    (1)需要重新设计key,以更小粒度的key使得task大小合理化。

(2)当分区导致数据倾斜时,需要考虑优化分区。避免非并行度操作,有些对DataStream的操作会导致无法并行,例如WindowAll。

(3)调用rebalance操作,使数据分区均匀。

(4)自定义分区:使用一个用户自定义的Partitioner对每一个元素选择目标task,由于用户对自己的数据更加熟悉,可以按照某个特征进行分区,从而优化任务执行。
3. checkpoint
(1)频率不宜过高
(2)超时时间不要过长,一般在频率一半
(3)使用异步

4.其他配置
(1)配置JobManager内存
(2)配置TaskManager个数
(3)配置TaskManager Slot数

5.其他

(1)背压的时候大家往往忽略了数据的序列化和反序列化,过程所造成的性能问题。

(2) 一些数据结构 ,比如 HashMap 和 HashSet 这种 key 需要经过 hash 计算的数据结构,在数据量大的时候使用 keyby 进行操作, 造成的性能影响是非常大的。

(3) 如果我们的下游是 MySQL,HBase这种,我们都会进行一个批处理的操作,就是让数据存储到一个 buffer 里面,在达到某些条件的时候再进行发送,这样做的目的就是减少和外部系统的交互,降低网络开销的成本。

(4) 频繁GC ,无论是 CMS 也好,G1也好,在进行 GC 的时候,都会停止整个作业的运行,GC 时间较长还会导致 JobManager 和 TaskManager 没有办法准时发送心跳,此时 JobManager 就会认为此 TaskManager 失联,它就会另外开启一个新的 TaskManager。

6. 场景
产生背压的时候如果定位下游计算不过来,导致上游挤压严重,这个时候想着怎么去增加并行度也好或者利用多线程也好,目的就是增加计算能力。如果多线程计算,这个时候更多关注cpu核数,来分配更多的时间片,提高计算能力。

11. Flink的重启策略怎么设置的?

如果启用了checkpoint并且没有显式配置重启策略,会默认使用fixeddelay策略,最大重试次数为Integer.MAX_VALUE。

固定延迟重启策略

固定延迟重启策略是尝试给定次数重新启动作业。如果超过最大尝试次数,则作业失败。在两次连续重启尝试之间,会有一个固定的延迟等待时间

// 配置文件设置
restart-strategy: fixed-delay # fixed-delay:固定延迟策略

restart-strategy.fixed-delay.attempts: 5 # 尝试5次,默认Integer.MAX_VALUE

restart-strategy.fixed-delay.delay: 10s # 设置延迟时间10s,默认为 akka.ask.timeout时间


// 代码设置固定延迟重启策略
env.setRestartStrategy(RestartStrategies
.fixedDelayRestart(3,Time.seconds(3)));

故障率重启策略

故障率重启策略在故障后重新作业,当设置的故障率(failure rate)(每个时间间隔内发生故障的次数)超过设定的限制时,作业最终失败。在两次连续重启尝试之间,重启策略延迟等待一段时间。

restart-strategy: failure-rate # 设置重启策略为failure-rate

restart-strategy.failure-rate.max-failures-per-interval: 3 # 失败作业之前的给定时间间隔内的最大重启次数,默认1

restart-strategy.failure-rate.failure-rate-interval: 5min # 测量故障率的时间间隔。默认1min

restart-strategy.failure-rate.delay: 10s # 两次连续重启尝试之间的延迟,默认akka.ask.timeout时间

失败后,5分钟内重启3次(每次重启间隔10s),如果第3次还是失败,则任务最终是失败,不再重启

无重启策略

restart-strategy: none

12. Flink重大版本差别?

Flink 1.9

阿里内部版本Blink首次合并入Flink

重构 Flink WebUI
Flink 1.10

原生 Kubernetes 的初步集成(beta 版本)以及对 Python 支持(PyFlink)的重大优化。

Flink 1.11

非对齐的 Checkpoint 机制。这一机制是对 Flink 容错机制的一个重要改进,它可以提高严重反压作业的 Checkpoint 速度。

Flink SQL 引入了对 CDC
PyFlink 优化了多个部分的性能,包括对向量化的用户自定义函数(Python UDF)的支持。

Application 部署模式

Flink 1.12

DataStream API 上添加了高效的批执行模式的支持。这是批处理和流处理实现真正统一的运行时的一个重要里程碑。

扩展了 Kafka SQL connector,使其可以在 upsert 模式下工作。

SQL 中 支持 Temporal Table Join

剩下的版本在原有的基础上优化等等。

13. Flink的怎么和RocksDB交互的。怎样一个流程?

Flink和RocksDB的交互主要通过Java Native接口(JNI)实现。具体来说,Flink作业运行时,RocksDB会被内嵌到TaskManager进程中,并以本地线程方式运行来读写本地文件。

14. Flink topN的实现?

统计最近10 秒钟内最热门的两个 url 链接,并且每 5 秒钟更新一次

stream.map(data -> data.getUserName())
.windowAll(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5)))
.aggregate(new UserHashMapCountAgg(), new UserCountWindowResult())
.print();

public static class UserHashMapCountAgg implements AggregateFunction<String, HashMap<String, Long>, List<Tuple2<String, Long>>>{
        @Override
        public HashMap<String, Long> createAccumulator() {
            return new HashMap<>();
        }

        @Override
        public HashMap<String, Long> add(String value, HashMap<String, Long> accumulator) {
            if (accumulator.containsKey(value)){
                accumulator.put(value, accumulator.get(value) + 1L);
            }else{
                accumulator.put(value, 1L);
            }
            return accumulator;
        }

        @Override
        public List<Tuple2<String, Long>> getResult(HashMap<String, Long> accumulator) {
            List<Tuple2<String, Long>> resultList = new ArrayList<>();
            accumulator.forEach((key, count) -> {
                resultList.add(Tuple2.of(key, count));
            });

            //排序
            resultList.sort(new Comparator<Tuple2<String, Long>>() {
                @Override
                public int compare(Tuple2<String, Long> o1, Tuple2<String, Long> o2) {
                    return o2.f1.intValue() - o1.f1.intValue();
                }
            });
//            resultList.sort(Comparator.comparing((key_1, key_2) -> key_1.f1.compareTo(key_1.f1)));
//            Collections.sort(resultList, Comparator.comparing(key -> key.f1));
            return resultList;
        }

        @Override
        public HashMap<String, Long> merge(HashMap<String, Long> a, HashMap<String, Long> b) {
            //do nothing
            return null;
        }
    }

15. Flink监控怎么做的?

Web UI方式: Flink提供了一个web UI来观察、监视和调试正在运行的应用服务。并且还可以执行或取消组件或任务的执行。

Prometheus + Grafana:Flink提供了一个复杂的度量系统来收集和报告系统和用户定义的度量指标信息。flink-metrics-prometheus 的相关jar放到lib下,然后在fink-conf中配置相关信息即可。然后配置相关的指标信息和报警即可。

16. Flink关闭后状态端数据恢复得慢怎么办?

(1)选用合理的state数据结构和 statebackend
(2)并行度合理设置

17. Flink的序列化讲讲呢?

目前,绝大多数的大数据计算框架都是基于JVM实现的,为了快速地计算数据,需要将数据加载到内存中进行处理。当大量数据需要加载到内存中时,如果使用Java序列化方式来存储对象,占用的空间会较大降低存储传输效率。

例如:一个只包含布尔类型的对象需要占用16个字节的内存:对象头要占8个字节、boolean属性占用1个字节、对齐填充还要占用7个字节。

Java序列化方式存储对象存储密度是很低的。也是基于此,Flink框架实现了自己的内存管理系统,在Flink自定义内存池分配和回收内存,然后将自己实现的序列化对象存储在内存块中。

所谓序列化和反序列化的含义:

序列化:就是将一个内存对象转换成二进制串,形成网络传输或者持久化的数据流。

反序列化:将二进制串转换为内存对。

TypeInformation 是 Flink 类型系统的核心类 

在Flink中,当数据需要进行序列化时,会使用TypeInformation的生成序列化器接口调用一个 createSerialize() 方法,创建出TypeSerializer,TypeSerializer提供了序列化和反序列化能力。如下图所示:Flink 的序列化过程

对于大多数数据类型 Flink 可以自动生成对应的序列化器,能非常高效地对数据集进行序列化和反序列化 ,如下图:

比如,BasicTypeInfo、WritableTypeIno ,但针对 GenericTypeInfo 类型,Flink 会使用 Kyro 进行序列化和反序列化。其中,Tuple、Pojo 和 CaseClass 类型是复合类型,它们可能嵌套一个或者多个数据类型。在这种情况下,它们的序列化器同样是复合的。它们会将内嵌类型的序列化委托给对应类型的序列化器。

通过一个案例介绍Flink序列化和反序列化:

如上图所示,当创建一个Tuple 3 对象时,包含三个层面,一是 int 类型,一是 double 类型,还有一个是 Person。Person对象包含两个字段,一是 int 型的 ID,另一个是 String 类型的 name,

(1)在序列化操作时,会委托相应具体序列化的序列化器进行相应的序列化操作。从图中可以看到 Tuple 3 会把 int 类型通过 IntSerializer 进行序列化操作,此时 int 只需要占用四个字节。

(2)Person 类会被当成一个 Pojo 对象来进行处理,PojoSerializer 序列化器会把一些属性信息使用一个字节存储起来。同样,其字段则采取相对应的序列化器进行相应序列化,在序列化完的结果中,可以看到所有的数据都是由 MemorySegment 去支持。 

MemorySegment 具有什么作用呢?

MemorySegment 在 Flink 中会将对象序列化到预分配的内存块上,它代表 1 个固定长度的内存,默认大小为 32 kb。MemorySegment 代表 Flink 中的一个最小的内存分配单元,相当于是 Java 的一个 byte 数组。每条记录都会以序列化的形式存储在一个或多个 MemorySegment 中。

18. Flink的异步有了解吗?

// 创建一个原始的流
val stream: DataStream[String] = ...

// 添加一个 async I/O 
val resultStream: DataStream[(String, String)] =
    AsyncDataStream.(un)orderedWait(
      stream, new AsyncDatabaseRequest(),
      500, TimeUnit.MILLISECONDS, // 超时时间
      120)  // 进行中的异步请求的最大数量

无序模式: 异步请求一结束就立刻发出结果记录。 流中记录的顺序在经过异步 I/O 算子之后发生了改变。 当使用 处理时间 作为基本时间特征时,这个模式具有最低的延迟和最少的开销。 此模式使用 AsyncDataStream.unorderedWait(...) 方法。

有序模式: 这种模式保持了流的顺序。发出结果记录的顺序与触发异步请求的顺序(记录输入算子的顺序)相同。

19. Flink的boardcast join 的原理是什么?

利用 broadcast State 将维度数据流广播到下游所有 task 中。这个 broadcast 的流可以与我们的事件流进行 connect,然后在后续的 process 算子中进行关联操作即可。

当维度信息修改后,flink 的 broadcast 流实时消费 MQ 中数据,就可以实时读取到维表的更新,然后配置就会在 Flink 任务生效,通过这种方法及时的修改了维度信息。broadcast 可以动态实时更新配置。

20. 你们有用过Flink的背压吗,怎么做优化和调整?

简单来说就是下游处理速率 跟不上 上游发送数据的速率,下游来不及消费,导致队列被占满后,上游的生产会被阻塞,最终导致数据源的摄入被阻塞。

反压会影响到两项指标: checkpoint 时长和 state 大小

(1)前者是因为 checkpoint barrier 是不会越过普通数据的,数据处理被阻塞也会导致 checkpoint barrier 流经整个数据管道的时长变长,因而 checkpoint 总体时间(End to End Duration)变长。

(2)后者是因为为保证 EOS(Exactly-Once-Semantics,准确一次),对于有两个以上输入管道的 Operator,checkpoint barrier 需要对齐(Alignment),接受到较快的输入管道的 barrier 后,它后面数据会被缓存起来但不处理,直到较慢的输入管道的 barrier 也到达,这些被缓存的数据会被放到state 里面,导致 checkpoint 变大。

Flink反压如何解决?

(1)定位反压节点

要解决反压首先要做的是定位到造成反压的节点,这主要有两种办法:

1.  通过 Flink Web UI 自带的反压监控面板;

2.  通过 Flink Task Metrics。

(1)反压监控面板

Flink Web UI 的反压监控提供了 SubTask 级别的反压监控,原理是通过周期性对 Task 线程的栈信息采样,得到线程被阻塞在请求 Buffer(意味着被下游队列阻塞)的频率来判断该节点是否处于反压状态。默认配置下,这个频率在 0.1 以下则为 OK,0.1 至 0.5 为 LOW,而超过 0.5 则为 HIGH。

(2)Task Metrics

Flink 提供的 Task Metrics 是更好的反压监控手段

如果一个 Subtask 的发送端 Buffer 占用率很高,则表明它被下游反压限速了;

如果一个 Subtask 的接受端 Buffer 占用很高,则表明它将反压传导至上游。

21. Flink的CBO,物理执行计划和逻辑执行计划?

Flink的优化执行其实是借鉴的数据库的优化器来生成的执行计划。

CBO,成本优化器,代价最小的执行计划就是最好的执行计划。传统的数据库,成本优化器做出最优化的执行计划是依据统计信息来计算的。Flink 的成本优化器也一样。Flink 在提供最终执行前,优化每个查询的执行逻辑和物理执行计划。这些优化工作是交给底层来完成的。根据查询成本执行进一步的优化,从而产生潜在的不同决策:如何排序连接,执行哪种类型的连接,并行度等等。

22. 你们用Flink怎么去开发一些checkpoint的超时问题?

Flink 的 Checkpoint 包括如下几个部分:

● JM trigger checkpoint

● Source 收到 trigger checkpoint 的 PRC,自己开始做 snapshot,并往下游发送 barrier

● 下游接收 barrier(需要 barrier 都到齐才会开始做 checkpoint)

● Task 开始同步阶段 snapshot

● Task 开始异步阶段 snapshot

● Task snapshot 完成,汇报给 JM

上面的任何一个步骤不成功,整个 checkpoint 都会失败。

从webui上可以看到,Acknowledged 一列表示有多少个 subtask 对这个 Checkpoint 进行了 ack,失败的情况大多数总有几个subtask 失败。

(1)Checkpoint Decline

当前 Flink 中如果较小的 Checkpoint 还没有对齐的情况下,收到了更大的 Checkpoint,则会把较小的 Checkpoint 给取消掉。

(2)Checkpoint Expire

Checkpoint 做的非常慢,超过了 timeout 还没有完成,则整个 Checkpoint 也会失败。

生产比如:

(1)采用短连接方式获取数据库连接,每次来一波数据都创建连接,发送完断开连接。因此很容易因为获取不到连接而使得processElement方法处于阻塞状态。而processElement方法阻塞进而影响Barrier的流动,所以导致了Checkpoint发生超时。

(2)Checkpoint状态比较大,增 量 Checkpoint, 则 只 备 份 上 一 次 Checkpoint 中 不 存 在 的 state。

(3)作业存在反压或者数据倾斜,barrier 发送慢,从而整体影响 Checkpoint 的时间。

(4)主线程太忙,导致没机会做 snapshot。

在 task 端,所有的处理都是单线程的,数据处理和 barrier 处理都由主线程处理,如果主线程在处理太慢,也会影响整体 Checkpoint 的进度。

Flink源码系列——指标监测 1、Metric简介 Flink对于指标监测有一套自己的实现,指标的统计方式有四种,这些指标都实现了Metric这个接口,而Metric这个接口只是一个标识,本身并没有定义如何方法接口,部分子类的继承关系如下所示。 从图中可以看出,Metric这个接口有四个直接子类,分别是: Gauge —— 最简单的度量指标,只是简单的返回一个值,比如返回一个队列中当前元素的个数; Cou... 阅读详情

相关推荐

Flink在k8s生产环境高可用部署

Flink在k8s生产环境高可用部署 flink: 1.10.1 kubernetes: 1.18.8 1 前言 目前参与的项目基本开发完成,打算开发的微服务和Flink任务统一部署到k8s上。之前几个项目都是跑在YARN上,Flink on YARN的部署模式是在生产中比较常见,YARN的稳定性和资源调度能力也是有目共睹的,依托Hadoop生态Flink高可用也很容易实现。关于On YARN 还是On K8S之前文章都有介绍,《Flink Cluster On YARN部署》和《Flink Clust

shirukai 8868

Flink(二十七)—— Flink Metrics 原理与监控实战

什么是 Metrics? Flink 提供的 Metrics 可以在 Flink 内部收集一些指标,通过这些指标让开发人员更好地理解作业或集群的状态。由于集群运行后很难发现内部的实际状况,跑得慢或快,是否异常等,开发人员无法实时查看所有的 Task 日志,比如作业很大或者有很多作业的情况下,该如何处理?此时 Metrics 可以很好的帮助开发人员了解作业的当前状况。 Metric Types Metrics 的类型如下: 首先,常用的如 Counter,写过 mapreduce 作业的开发人员就应该

weixin_42073629的博客 1544

Flink高手之路:Flink的环境搭建

Flink高手之路:Flink的环境搭建

weixin_46490924的博客 1万+

mybatisplus代码生成覆盖

com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine - 文件[*]已存在,且未开启文件覆盖配置,需要开启配置可到策略配置中设置!然后去StrategyConfig使用fileOverride()方法,但是不存在,3.5.3把fileOverride()移到了每个类里。,要配就要如下图所示,分别设置,但是.3.5.3提示该方法后续会删除,建议使用enableFileOverride(),然后OK。

qq_26949717的博客 3476

Flink CDC 生产环境常用参数总结

这些参数用于定优化数据处理的性能,减少对生产数据库的影响。

别这么骄傲 1938

【Flink】Metrics运作机制

1.概述 转载并且补充:Flink源码剖析:Metrics运作机制 1. Metrics简介 1.1 什么是 Metrics? Flink 提供的 Metrics 可以在 Flink 内部收集一些指标,通过这些指标让开发人员更好地理解作业或集群的状态。由于集群运行后很难发现内部的实际状况,跑得慢或快,是否异常等,开发人员无法实时查看所有的 Task 日志,比如作业很大或者有很多作业的情况下,该如何处理?此时 Metrics 可以很好的帮助开发人员了解作业的当前状况。 1.2 Metric Types Met

九师兄 1008

Flink 内容分享(九):Flink生产环境相关问题

如上图所示,当创建一个Tuple 3 对象时,包含三个层面,一是 int 类型,一是 double 类型,还有一个是 Person。Person对象包含两个字段,一是 int 型的 ID,另一个是 String 类型的 name。

之乎者也·的博客 1290

【Flink】Flink session模式 Completed Job List 不显示历史job列表

有一个Flink session任务,开始能这里看不到失败或者取消的任务,具体如下。之前测试集群也出现这个状况,重启后解决。但是这个是生产集群有任务在跑不能随便重启。后来找到原因了,之前删除了linux的tmp下的文件和文件夹导致的。

九师兄 1120

生产环境开箱即用的“Flink + Iceberg 数据湖容器搭建”(Docker)

本文介绍了两种在Flink+Iceberg数据湖运行时容器中处理JAR包的方法。方法一通过挂载本地JAR目录到容器,但需注意JAR冲突问题;方法二推荐使用Dockerfile将JAR包直接构建到镜像中。详细说明了两种方式的docker-compose.yml配置、目录结构、验证方法和操作流程,包括如何启动服务、验证挂载、处理JAR冲突等步骤。重点强调了生产环境下推荐使用运行时添加JAR的方式,并提供了完整的操作命令和注意事项。

. 1674

【kafka】Timeout expired before the position for partition could be determined

因为这个环境是已经存在的,以前的kafka容器是1.0版本,但是现在要验证一个新的环境kafka 3.6.0。我不想重新做,然后我想直接在flink1里面直接安装kafka 3.6版本。然后把kafka的端口映射打开,将kafka内部的9194端口,映射到外面的19194端口,然后在宿主机上查看端口。可以看到kafka端口是通的,zk端口也是通的,但是生产的时候报错,而且一直没找到解决方案。发现端口映射已经正常了。然后写了一个代码进行验证。然后进行消费,可以看到可以正常的进行消费。首先说一下这个环境特征。

九师兄 1168

【深度学习】基于BERT模型的情感分析(附实战完整代码+数据集)

情感分类是一个快速发展的研究领域,尽管众多模型和数据集在二分类任务中显示出很高的准确性,但细粒度的情感分类任务仍然是一个很大改进空间的领域。分析SST-5数据集,Munikar等人的先前工作表明,嵌入工具BERT允许使用简单的模型来实现最新的准确性。

aaaa_hsjsueu的博客 2万+

Kafka与Flink结合使用

Kafka与Flink结合使用 本地连接kafka 首先可以先以本地模式来对kafka进行操作。 当我们在系统(可以是windows,尽量linux)上部署好了Zookeeper和kafka集群,值得注意的是单机也可以部署一个假集群来对实际生产环境做一个模拟(参考:https://blog.youkuaiyun.com/weixin_40366684/article/details/106258816),接下来我们可以启动zookeeper集群。 # bin/zkServer.sh start conf/zoo-1.c

weixin_40366684的博客 1万+

大众点评商家及评分数据(2012-2025)

大众点评及商家评分数据库全面覆盖全国范围内多个城市的商户信息,涵盖餐饮、购物、休闲娱乐等多个消费领域,包含商家基础信息、地理坐标、分类体系、经营状态、用户评价、消费水平及服务设施等共计28个字段。

Sunny9qx的博客 2705

5分钟掌握Flink SQL多表插入:从INSERT ALL到智能路由

你是否还在为实时数据分流烦恼?订单数据需同时写入报表库、审计库和实时大屏?传统ETL流程需要编写多份SQL或复杂代码,维护成本高且易出错。本文将带你一文掌握Apache Flink SQL的多表插入技术,通过INSERT ALL语法和条件路由实现数据的高效分发,让数据流向它该去的地方。 读完本文你将获得: - 3种多表插入方案的优缺点对比 - INSERT ALL语法的实战案例(附完整代码) -...

gitblog_00422的博客 883

VI恒流源原理详细分析(0~10V转0/4~20mA)

但是此电阻也不能无限增加,首先我们所列方程均是基于运放虚短虚断的假设,此假设又是基于运放输入阻抗无穷大,输出阻抗无穷小的前提条件,然而实际的运放并非理想运放,对于TL082IDR这款运放,其Rid(Common-mode input resistance)典型值为1TΩ,以此来看感觉1MΩ确实还不是很大,但是还有另一个影响因素需要考虑,那就是电路的抗干扰能力,原则上,电阻越大受到外部干扰的可能性越大。也就是实现Uin 0~10V变化时对应Iout 0~20mA的一个线性对应关系。

IOTBOT的博客 2902

视频帧插学习(三):ema-vfi代码拆解和分析

video interp EMA-VFI

mikhailbran的博客 712

面试复盘,数据湖部分面试官关注什么?

其次在引擎侧,很多公司和云平台上的产品会针对性的做一些优化,例如:产生回撤信息最根本的一个原因是不断地向下游多次发送更新结果,所以为了减少更新的频率并降低并发,可以把更新结果累计一部分之后再发送出去;最后,给自己打个广告。我们拿Paimon举例,这个组件有自己的特性,例如支持流批读写,分钟级的数据新鲜度,主键和非主键表,此外Paimon还有维度表能力,列更细能力等。因此在大多数的场景中,我们都强烈建议在ODS做好数据的乱序处理,尤其是下游是主键表的情况,如果不做这种处理很容易导致最终的结果是错误的。

微信搜:import_bigdata,大数据领域硬核原创作者 615

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

为了能把之前在基础篇中学习到的Skynet的各种知识结合起来,所以在实战篇中,我们准备开发一个完整的游戏案例《球球大作战》,介绍分布式游戏服务端的实现方法。

我是一条寻水的鱼 2983

FlinkCDC 2.1.1记录

Mysql MySqlSource<String> mySqlSource = MySqlSource.<String>builder() .hostname("localhost") .port(3306) .databaseList("test") // monitor all tables under inventory database .table

qq_15138049的博客 1692

10分钟极速SpringBoot项目搭建:OpenClaw AI实战攻略

OpenClaw,作为一款革命性的 AI 工具,凭借其强大的智能体能力,能够在短短 10 分钟内,帮助开发者从零构建一个完整的 SpringBoot 项目,实现真正的极速开发。它不仅极大地提高了开发效率,还降低了开发门槛,让更多的开发者能够专注于业务逻辑的实现,而无需被繁琐的配置工作所困扰

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 299

[RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生

有数据的地方就有存储, 内存是谁都离不开的产品。而动态随机存取存储器(DRAM)作为一种常见的内存。本博客将介绍DRAM的基本概念、工作原理、优缺点以及应用领域等方面。

串起点滴 3921

Flink连接器依赖冲突的SPI机制深度解析:从报错到解决方案的完整指南

本文深入解析Flink连接器依赖冲突的SPI机制,从报错分析到解决方案提供完整指南。详细介绍了SPI机制在Flink连接器加载中的原理,常见依赖冲突场景及解决方案,包括使用ServicesResourceTransformer和依赖隔离方案,帮助开发者有效解决连接器加载问题。

weixin_29088655的博客 267

制作你自己的yolov5数据集并进行训练

项目地址:make-your-yolov5_dataset 一、数据集标注软件 labelImg labelMe 精灵标注助手 更多的标注工具你可以去看:深度学习图像标注工具汇总 、 十个最常用深度学习图像/视频数据标注工具 、 百度一下 在这里我选择使用labelImg 二、数据集标注 下载labelImg 解压,直接打开labelimg.exe labelImg标注数据 标注完成后即可获得VOC格式(生成.xml文件)的数据 目录结构: dataset │ ├─Annotations .

年少的勇气已经用完,剩下的就是三思而后行 1万+

Flink SQL CDC 上线!我们总结了 13 条生产实践经验

摘要:7月,Flink 1.11 新版发布,在生态及易用性上有大幅提升,其中 Table & SQL 开始支持 Change Data Capture(CDC)。CDC 被广泛使...

Ververica的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Zeppelin社区给力支持下,解决Zeppelin上的Flink生产环境运行问题

背景: Zeppelin一个强大的可视化数据分析工具。它是基于Web的笔记本,可通过SQL,Scala等实现数据驱动的交互式数据分析和协作文档。功能及其强大,可以快速接入Spark,Python,R等数据分析语言工具。数据源可以接入MySQL,Kylin,Hive等几十种数据源。 在现在实时处理神器Flink如火如荼的当下,将Zeppelin接入Flink,实现实时,批数据处理,报表生成,对数据开发分析人员,无疑是一个有力的助力。 现在Flink接入阿里开源生态后,版本迭代的非常迅速,功能也提升的比较

joomlaer的专栏 1371

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Flink-生产环境问题集锦

项目场景: 平台初始搭建,在项目开发过程中遇到的问题. 问题描述及解决方案 1.在程序中将状态后端保存到HDFS,运行程序时报错失败 Caused by: java.lang.RuntimeException: Error while waiting for job to be initialized … Caused by: org.apache.flink.runtime.rest.util.RestClientException: [org.apache.flink.runtime.rest.No

weixin_45943866的博客 5408

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: python基础语法
下一篇: Doris 与 Clickhouse 对比(一)
大数据左右手
博客等级 码龄9年 475粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值