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

Flink CDC中一张流表去关联多张维表的这效率太差,几分钟才跑了几千条,这怎么优化呀?

"问题1:Flink CDC中一张流表去关联多张维表的这效率太差,几分钟才跑了几千条,这怎么优化呀?
0ca5f75bd05facb7e9cf14c08f69cdff.jpg
其实我一张流表关联六张维表,而且数据都是一对一的,设置缓存也没用,全当流表效率很高,但是内存不够。当维表效率太差了。每张表都是一千万数据。我本来都是流表,只是流表join会全部加载到内存里,内存不够用。所以就改成流表关联维表。七张表各有一千万数据,都是一对一关联的,从MySQL库同步到starrocks的一张宽表里。如果是增量数据flink好像没问题。主要就是刚启动时全量同步存量数据内存不够用。
问题2:这种咋处理数据库数据延迟问题呢?flink流表对维表不就是这种逻辑吗?流表拿到数据他自己去查维表去了。你说自己在代码里写自己去查寻吗?"

展开
收起
十一0204 2023-07-26 08:33:04 277 0
4 条回答
写回答
取消 提交回答
  • 如果 Flink CDC 中一张流表关联多张维表的效率较低,导致每分钟只能处理几千条记录,可以考虑以下几种优化策略:

    1. 批量加载和缓存维表数据:尽量减少对维表的查询次数。可以通过批量加载维表数据,将其缓存在内存中,并使用合适的数据结构(如哈希表或红黑树)进行索引,以提高查询效率。

    2. 异步请求和回调机制:使用异步方式进行维表查询,避免主要数据流被阻塞。可以利用 Flink 的 AsyncFunctionRichAsyncFunction 接口,并利用回调机制在查询完成后处理结果。

    3. 并行度调整:根据机器资源和任务需求,适当调整 Flink CDC 任务的并行度。增加并行度可以并行处理更多的记录,提高吞吐量。但要注意平衡计算资源和网络资源的分配。

    4. 数据本地性优化:如果维表数据相对较小,可以尝试将维表数据广播到每个任务并作为广播变量使用,而不是每个任务都独立查询维表数据。这样可以减少网络开销和查询负载。

    5. 冗余存储副本:如果某些维表数据更新频率较低,可以考虑在 Flink CDC 中将这些数据做冗余存储,以减少查询外部系统的次数。更新频率较低的数据可以通过定期或触发条件进行刷新。

    6. 缓存策略优化:根据业务需求和维表数据的特性,尝试优化缓存策略。可以考虑使用 TTL 缓存、LRU(最近最少使用)缓存等算法,以提高缓存的命中率和性能。

    7. 硬件资源优化:检查任务运行所在的计算集群是否具有足够的硬件资源(如 CPU、内存)来支持大规模处理。确保集群的性能和可用性符合任务的需求。

    请注意,这些是一些常见的优化策略,具体的优化方案需要根据实际情况进行调整。建议先分析任务的瓶颈,并根据具体的问题确定优化的方向。

    2023-07-31 22:28:11
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    在 Flink CDC 中,如果一张流表需要关联多张维表,可能会导致查询效率较低,从而影响任务的性能。为了提高查询效率,可以考虑以下几种优化方法:
    使用布隆过滤器:如果您的维表比较大,那么每次查询时需要遍历整个维表,这会导致查询效率较低。您可以使用布隆过滤器来过滤掉不可能匹配的数据,从而减少查询的数据量,提高查询效率。
    使用缓存:如果您的维表数据不经常变化,那么可以使用缓存来缓存维表数据,从而避免每次查询都需要扫描整个维表的问题。您可以使用 Flink 的状态后端来实现维表数据的缓存。
    数据预处理:如果您的维表数据比较复杂,查询效率较低,可以考虑对维表数据进行预处理,例如将维表数据进行拆分、归并等操作,从而减少查询的数据量,提高查询效率。
    数据分区:如果您的维表数据比较大,可以考虑对维表数据进行分区,从而将查询的数据量分散到多个节点上,提高查询效率。

    2023-07-29 14:04:46
    赞同 展开评论 打赏
  • 存在即是合理

    问题1:

    1. 优化维表查询:可以尝试优化维表的查询性能。使用索引、优化查询语句、减少不必要的查询
    2. 分批加载维表数据:如果维表数据量比较大,可以尝试将维表数据分批加载到内存中,而不是一次性加载所有数据。
    3. 使用物化维表:考虑将维表物化,即将维表数据缓存到磁盘或其他存储介质上,而不是每次都从数据库中查询。可以在内存中缓存维表数据,减少对数据库的查询次数,提高关联效率。
    4. 调整Flink任务并行度:根据实际硬件环境和数据量大小,合理调整Flink任务的并行度,以便更好地利用计算资源,提高任务的处理效率。

    问题2:

    可以在 Flink 中使用 Watermark 机制来解决。Watermark机制可以为每个事件设置一个时间戳,用于标识该事件生成的时间点。在 Flink CDC 中,可以通过设置 Watermark时间间隔和最大等待时间来控制数据的延迟情况。也可以在代码中自己去查询维表,以便更好地控制数据的延迟情况。

    2023-07-27 14:04:55
    赞同 展开评论 打赏
  • 意中人就是我呀!

    "回答1:数据离散好的话加索引,流量不大,单表查应该没啥问题,流数据量大可能不太行。你不如7张表都同步到starrocks,然后用starrocks写个view来组合你的结果,或者异步物化视图。where尽量放外层。多流数据利用pk来打宽也是可以的。或者用canal或者flinkcdc拿到变更的数据,拿其中的有索引的字段,类似订单编号或者其他业务主键,其他表都有的字段,然后去数据库反查出你宽表的所有数据,mysql里面七张表关联,走索引查也是毫秒级别的。
    回答2:主要是7个表相当于流表有可能,数据库ER模型,字段分开存,不太可能就一个流表更新,其他表才会更新,任何表都可能单独更新。此回答整理至钉群“Flink CDC 社区”。"

    2023-07-26 12:22:01
    赞同 展开评论 打赏

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

相关产品

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

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