flink从1.10.0升级到1.12遇到的问题

1、No ExecutorFactory found to execute the application

java.lang.IllegalStateException: No ExecutorFactory found to execute the application.
	at org.apache.flink.core.execution.DefaultExecutorServiceLoader.getExecutorFactory(DefaultExecutorServiceLoader.java:84)
	at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.executeAsync(StreamExecutionEnvironment.java:1931)
	at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.java:1836)
	at org.apache.flink.streaming.api.environment.LocalStreamEnvironment.execute(LocalStreamEnvironment.java:70)
	at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.execute(StreamExecutionEnvironment.java:1822)
	at org.eb.alert.app.AlertOperator.main(AlertOperator.java:101)

官网Release Notes - Flink 1.11

所以需要增加flink-clients的依赖。

<dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-clients_2.11</artifactId>
      <version>${flink.version}</version>
    </dependency>

2、时间语义

从flink 1.12.0开始默认的时间语义为event-time。所以不需要再调用:

StreamExecutionEnvironment.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

来指定时间语义了。

3、批流一体

在 Flink 1.12.0 中,默认执行模式为 STREAMING,要将作业配置为以 BATCH 模式运行,可以在提交作业的时候,设置参数 execution.runtime-mode:

$ bin/flink run -Dexecution.runtime-mode=BATCH examples/batch/WordCount.jar

或者在代码中指定:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setRuntimeMode(RuntimeMode.BATCH);

官网建议使用参数设置的方法,提高代码灵活性。

4、assignTimestampsAndWatermarks(AssignerWithPeriodicWatermarks<T> timestampAndWatermarkAssigner) 被标记为deprecated了。

因为该方法中用到的watermark生成器接口也被标记为deprecated了。推荐使用新的接口:

assignTimestampsAndWatermarks(WatermarkStrategy)

新的接口支持watermark空闲,并且不再区别periodic和punctuated。

例如:

/**
 * 当没有新数据到达时,WatermarkGenerator是无法生成watermark的,这会导致任务无法继续运行。
 * 例如kafka topic有2个partition,
 * 其中一个partition数据量比较少,可能存在长时间没有新数据的情况,这就导致该watermark一直是
 * 较早数据产生的。即使另一个partition始终有新数据,那么任务也不会往下运行,
 * 因为水印对齐取的是最小值。为了解决这个问题,WatermarkStrategy提供了withIdleness方法,
 * 允许传入一个timeout的时间。
*/
WatermarkStrategy
        .<Tuple2<Long, String>>forBoundedOutOfOrderness(Duration.ofSeconds(20))
        .withIdleness(Duration.ofMinutes(1));


WatermarkStrategy接口定义了如何在流数据中生成watermark。WatermarkStrategy是
WatermarkGenerator和TimestampAssigner的构造器,前者用于生成watermark,
后者用于指定一条记录的内部时间戳。
WatermarkStrategy接口包含三个部分:
1)需要实现的方法
/**
* 实例化一个根据此策略生成watermark的WatermarkGenerator。
* Instantiates a WatermarkGenerator that generates watermarks according to this strategy.
*/
@Override
WatermarkGenerator<T> createWatermarkGenerator(WatermarkGeneratorSupplier.Context context);
关于该方法的实现可以查看源码,例如:
WatermarkStrategyWithTimestampAssigner,这是一个final class,实现了WatermarkStrategy接口,并且
重写了TimestampAssigner。
2)WatermarkStrategy基本构造方法
3)WatermarkStrategy普通的内置构造方法以及基于WatermarkGeneratorSupplier的构造方法


/**
 * 为乱序的情况创建watermark strategy,设置一个最大延迟时间。
 * Creates a watermark strategy for situations where records are out of order, but you can place
 * an upper bound on how far the events are out of order. An out-of-order bound B means that
 * once the an event with timestamp T was encountered, no events older than {@code T - B} will
 * follow any more.
 *
 * <p>The watermarks are generated periodically. The delay introduced by this watermark
 * strategy is the periodic interval length, plus the out of orderness bound.
 *
 * @see BoundedOutOfOrdernessWatermarks
 */
static <T> WatermarkStrategy<T> forBoundedOutOfOrderness(Duration maxOutOfOrderness) {
	return (ctx) -> new BoundedOutOfOrdernessWatermarks<>(maxOutOfOrderness);
}

5、关于WatermarkGenerator

5.1 Periodic WatermarkGenerator

这种方式就是定期生成watermark。时间间隔是通过

ExecutionConfig.setAutoWatermarkInterval(Long l)

定义的。周期性的调用onPeriodicEmit()方法,如果新的watermark不为null,并且大于之前的watermark,则发出。

env.getConfig().setAutoWatermarkInterval(0)

表示禁用watermark。

5.2 内置的watermark Generators

如果不存在乱序的情况,即event的时间戳是单调递增的,则

WatermarkStrategy.forMonotonousTimestamps();

如果存在乱序,则设置延迟时间。

WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(10));

例如:

dsOperator.assignTimestampsAndWatermarks(
                WatermarkStrategy.<Map<String,Object>>forBoundedOutOfOrderness(
                        Duration.ofSeconds(jobConfig.getFlinkJobConfigs().getWindowMaxOutOfOrderness()))
                        .withTimestampAssigner(new MyTimeAssigner(task.getTimestamp())))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于Flink从入门到精通的学习路径可以分为以下几个步骤: 1. 学习Flink的基本概念和原理:了解Flink的核心概念,如数据流、转换操作、窗口、状态管理等。可以通过官方文档、教程和书籍进行学习。 2. 安装和配置Flink环境:学习如何在本地或集群环境中安装和配置Flink,并了解各种配置选项和参数的含义和用法。 3. 编写和运行Flink应用程序:学习如何使用Flink的API编写和提交Flink应用程序,包括数据流的处理逻辑、转换操作和窗口计算等。 4. 理解Flink的核心特性和功能:深入学习Flink的一些核心特性和功能,如事件时间处理、容错机制、状态管理和水位线等。 5. 优化和调优Flink应用程序:学习如何优化和调优Flink应用程序,包括调整并行度、内存管理、网络通信和容错机制等方面的优化。 6. 实践应用场景和案例:通过实践应用场景和案例,如流式处理、实时数据分析和机器学习等,来巩固和应用所学的知识。 7. 探索Flink的高级特性和扩展:了解Flink的高级特性和扩展功能,如CEP(复杂事件处理)、表格API、图处理等,并根据需求选择合适的扩展。 总结来说,从入门到精通Flink需要学习基本概念和原理、掌握环境配置和应用开发、理解核心特性和功能、进行优化和调优、实践应用场景和案例,并深入探索高级特性和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值