开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

在使用 Flink CDC 从 Kafka 读取数据,怎么操作广播?

在使用 Flink CDC 从 Kafka 读取数据,并与两个仅在任务启动时读取一次的维度表进行内连接(inner join)时,如果没有匹配到的数据会被直接丢弃还是会被存储在内存中?我遇到的情况是 Flink 的内存占用不断增加,最终导致内存溢出和 TaskManager 崩溃。此外,我不太清楚广播(broadcast)的具体操作,因为我遇到了一些相关的问题,尽管我的维度表数据量很小(只有几十条),但 Kafka 上的数据量很大。

展开
收起
小小鹿鹿鹿 2024-03-20 08:01:38 69 0
2 条回答
写回答
取消 提交回答
  • 维表数据异步内存管理。可以研究下这个算子 withBroadcastSet。此回答来自钉群Flink CDC 社区。

    2024-03-20 11:23:08
    赞同 1 展开评论 打赏
  • 在Flink中,对于小的维度表(lookup table)与流数据进行join时,通常会使用广播模式(Broadcast Join)。当使用broadcast join时,Flink会将小的维度表广播到所有参与join的TaskManager上,然后每个TaskManager都会存储一份维度表的完整副本。这样,在处理流数据时,可以直接从本地内存查找匹配项,而不需要通过网络传输维度表的数据。

    对于您提到的情况,如果两个维度表非常小(几十条数据),并且任务启动时仅读取一次,那么这些数据应该会被广播到所有执行join任务的TaskManager并存储在内存中。

    内存溢出的问题可能是因为:

    • 广播表的存储策略:

    虽然维度表本身很小,但是如果每条记录占用的空间较大(比如包含大字段或数组、对象等复杂类型),累积起来可能导致内存占用过高。
    如果Flink没有正确地管理广播表的生命周期和内存分配,可能会导致内存泄露。

    • 流数据处理中的内存问题:

    在处理Kafka中的大量流数据时,即使不考虑广播表的影响,Flink作业也可能因为state backend(状态后端)或者操作符内部的数据缓存等原因导致内存持续增长。

    • 资源配置不足:

    TaskManager的内存配置可能不足以同时容纳广播表数据以及处理流数据所需的状态空间。

    • 其他内存开销:

    Flink作业运行时还会有其他方面的内存消耗,如:网络缓冲、序列化、反序列化、算子中间结果暂存等。
    解决这个问题的方法可以包括:

    • 优化维度表大小:确保维度表数据经过合理压缩或结构优化,降低单条记录的内存占用。
    • 检查并调整Flink作业的内存配置:增大TaskManager的内存分配,或者根据实际需求优化状态后端和其他内存相关配置。
    • 监控和清理机制:定期检查是否有未释放的内存资源,并确保Flink作业在完成对维度表数据的处理后能够及时释放内存。
    • 开启checkpoint和state ttl:设置合理的checkpoint间隔和状态过期时间,以清除不再需要的历史状态数据。
    2024-03-20 09:58:07
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载