flink1.14的混合源

1、DataStream 和 Table/SQL 混合应用的批执行模式
在 Flink 1.14 中,有界的批执行模式的 SQL/Table 应用可将其中间数据表转换成数据流,经过由 DataStream API 定义的算子处理,再转换回数据表。其内部原理是,Flink 构建了一个由优化的声明式 SQL执行和 DataStream 批执行混合而成的数据流 DAG
//创建流执行环境 和 表执行环境 
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

//创建一个数据流
DataStream<String> dataStream = env.fromElements("Alice", "Bob", "John");

//将仅插入流解释为表
Table inputTable = tableEnv.fromDataStream(dataStream);

//将表对象注册为视图并查询它
tableEnv.createTemporaryView("InputTable", inputTable);
Table resultTable = tableEnv.sqlQuery("SELECT UPPER(f0) FROM InputTable");

//再次将仅插入表解释为数据流(DataStream)
DataStream<Row> resultStream = tableEnv.toDataStream(resultTable);

//接收打印接收器并在DataStream API中执行
resultStream.print();
env.execute();
2、混合Source
	全新的Source能够依次地从多个数据源读取数据,在不同数据源之间无缝切换,产出一条由来自多条数据源的数据合并而成的数据流
	例如:
	引导用例可能需要从 S3 读取几天的有界输入,
	然后才能继续读取来自 Kafka 的最新无界输入。
	当有界文件输入完成而不中断应用程序时,HybridSource 从 FileSource 切换到 KafkaSource。
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-base</artifactId>
    <version>1.14.0</version>
</dependency>
2.1 固定起始位置
/*背景:
	先从文件中读取有界流数据,到指定时间点之后,再切入到kafka源
*/
// 切换时间戳
long switchTimestamp = ...; 
//读取文件数据,有界流
FileSource<String> fileSource = FileSource.forRecordStreamFormat(new TextLineFormat(), Path.fromLocalFile(testDir)).build();
//读取kafka数据,从指定时间开始消费
KafkaSource<String> kafkaSource =
          KafkaSource.<String>builder()
                  .setStartingOffsets(OffsetsInitializer.timestamp(switchTimestamp + 1))
                  .build();
//混合源 构建 文件源 添加kafka源 
HybridSource<String> hybridSource =
          HybridSource.builder(fileSource)
                  .addSource(kafkaSource)
                  .build();
2.2 动态切换位置
/*
示例:文件源读取非常大的积压,可能比下一个源可用的保留时间更长。切换需要发生在“当前时间 - X”。这需要在切换时间设置下一个源的开始时间。这里我们需要从之前的文件枚举器中传输结束位置,以便通过实现 SourceFactory 来延迟构建 KafkaSource。

请注意,枚举器需要支持获取结束时间戳。这当前可能需要源自定义。在 FLINK-23633 中跟踪向 FileSource 添加对动态结束位置的支持。
*/

//自定义文件源
FileSource<String> fileSource = CustomFileSource.readTillOneDayFromLatest();
HybridSource<String> hybridSource =
    HybridSource.<String, CustomFileSplitEnumerator>builder(fileSource) //给这个文件源添加枚举类
        .addSource(
            switchContext -> { //上下文
            //自定义文件拆分枚举器
    		CustomFileSplitEnumerator previousEnumerator =  //获取以前的枚举器
                  switchContext.getPreviousEnumerator(); //从上下文总获取上一个枚举器
              //如何获取时间戳取决于特定的枚举器
              long switchTimestamp = previousEnumerator.getEndTimestamp(); //从以前的枚举器获取结束时间戳当做 不同数据源的切换时间戳
              //根据切换时间戳读取kafka数据源数据
              KafkaSource<String> kafkaSource =
                  KafkaSource.<String>builder()
                  	  //设置开始偏移量  偏移量初始化程序的时间戳为切换时间戳 +1 
                      .setStartingOffsets(OffsetsInitializer.timestamp(switchTimestamp + 1))
                      .build();
              return kafkaSource;
            },
            Boundedness.CONTINUOUS_UNBOUNDED)
        .build();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值