71、Flink 的 Hybrid Source 详解

Hybrid Source
1.概述

Hybrid Source 解决了从异构数据源顺序读取输入以生成单个输入流的问题。

示例:从 S3 读取前几天的有界输入,然后使用 Kafka 的最新无界输入,当有界文件输入完成而不中断应用程序时 Hybrid Source 会从 FileSource 切换到 KafkaSource。

在 Hybrid Source 出现之前,需要创建一个具有多个源的拓扑结构,并由用户定义切换机制;使用 HybridSource 之后,从 DataStream API 的角度看,多个源在 Flink 作业图中显示为单个源。

需要依赖如下:

复制代码
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-base</artifactId>
    <version>1.19.0</version>
</dependency>
2.下一个源的起始位置

要在一个 Hybrid Source 中排列多个源,除最后一个源外的所有源都需要有界;因此通常需要为源分配一个开始和结束位置。

a)固定起始位置

示例:从文件中读取到预先确定的切换时间,然后继续从 Kafka 中读取,每个源都覆盖了预先已知的范围,可以像直接使用一样预先创建包含的源。

复制代码
long switchTimestamp = ...; // derive from file input paths

FileSource<String> fileSource =
  FileSource.forRecordStreamFormat(new TextLineInputFormat(), Path.fromLocalFile(testDir)).build();

KafkaSource<String> kafkaSource =
          KafkaSource.<String>builder()
                  .setStartingOffsets(OffsetsInitializer.timestamp(switchTimestamp + 1))
                  .build();

HybridSource<String> hybridSource =
          HybridSource.builder(fileSource)
                  .addSource(kafkaSource)
                  .build();
b)动态其实位置

示例:文件源需要读取的数据量很大,可能比下一个源可用的保留时间更长,切换需要在 "当前时间-X" 发生。

因此要将下一个源的启动时间设置为切换时间,需要从以前的文件枚举器中转移结束位置,以便通过实现 SourceFactory 来延迟构建KafkaSource。

注意:枚举器需要支持获取结束时间戳。

复制代码
FileSource<String> fileSource = CustomFileSource.readTillOneDayFromLatest();

HybridSource<String> hybridSource =
    HybridSource.<String, CustomFileSplitEnumerator>builder(fileSource)
        .addSource(
            switchContext -> {
              CustomFileSplitEnumerator previousEnumerator =
                  switchContext.getPreviousEnumerator();
              
              // how to get timestamp depends on specific enumerator
              long switchTimestamp = previousEnumerator.getEndTimestamp();
              
              KafkaSource<String> kafkaSource =
                  KafkaSource.<String>builder()
                      .setStartingOffsets(OffsetsInitializer.timestamp(switchTimestamp + 1))
                      .build();
              
              return kafkaSource;
            },
            Boundedness.CONTINUOUS_UNBOUNDED)
        .build();
相关推荐
Tob管理笔记12 分钟前
建筑业如何精准开拓优质客户?技术驱动下的方法论与实践
大数据·云计算·数据库开发
MM_MS14 分钟前
Halcon控制语句
java·大数据·前端·数据库·人工智能·算法·视觉检测
JZC_xiaozhong1 小时前
主数据同步失效引发的业务风险与集成架构治理
大数据·架构·数据一致性·mdm·主数据管理·数据孤岛解决方案·数据集成与应用集成
T06205141 小时前
【数据集】全国各地区教育139个相关指标数据集(2000-2024年)
大数据
故乡de云1 小时前
Vertex AI 企业账号体系,Google Cloud 才能完整支撑
大数据·人工智能
汽车仪器仪表相关领域2 小时前
AI赋能智能检测,引领灯光检测新高度——NHD-6109智能全自动远近光检测仪项目实战分享
大数据·人工智能·功能测试·机器学习·汽车·可用性测试·安全性测试
木头程序员2 小时前
大模型边缘部署突破:动态推理技术与精度-延迟-能耗帕累托优化
大数据·人工智能·计算机视觉·自然语言处理·智能手机·数据挖掘
DX_水位流量监测2 小时前
无人机测流之雷达流速仪监测技术分析
大数据·网络·人工智能·数据分析·自动化·无人机
鹿衔`2 小时前
Hadoop HDFS 核心机制与设计理念浅析文档
大数据·hadoop·hdfs
萤丰信息2 小时前
开启园区“生命体”时代——智慧园区系统,定义未来的办公与生活
java·大数据·运维·数据库·人工智能·生活·智慧园区