flink sql cdc并行度问题

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

flink sql cdc并行度问题

casel.chen
flink sql作业:消费mysql binlog将数据同步到 mongodb
问题:
1. mysql-cdc connector只能设置成一个并行度吗?
2. 可以增大mongodb的sink并行度吗?可以的话,要如何设置?它保证主键相同的记录会发到同一个分区sink吗?
Reply | Threaded
Open this post in threaded view
|

Re: flink sql cdc并行度问题

Zorro
mysql-cdc connector只能设置一个并行度,主要可能有这些原因:
1. mysql binlog本质上是一个文件,多个并行度消费需要避免重复
2. 多个并行度消费难以保证顺序

sink可以设为多个并行度,但是顺序不一定,如果需要主键相同的记录发到同一个sink线程可以先做一个keyby,并且保证keyby并行度与sink并行度相同,这样基本上能够保证数据forward传输,不过也不能100%保证有序。

如果需要保证有序还是建议sink并行度为1



--
Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re:Re: flink sql cdc并行度问题

casel.chen
我的作业是用flink sql消费mysql cdc binlog并实时同步到mongodb。如果只开一个并行度的话,mongodb的写入速度可能追不上mysql的写入。所以我需要在sink端开大并行度。
我不清楚用sql怎么写keyBy,是不是要group by pk呢?我原来的想法是在MongoDBSinkFunction中开一个线程池,每个线程对应下游sink的一个并行度,每个线程带一个queue,MongoDBSinkFunction根据数据PK往对应的queue发数据,每个消费者线程从自己的queue pull数据再进行批量插入。不知道这样可不可行?

















在 2021-05-26 14:22:11,"Zorro" <[hidden email]> 写道:

>mysql-cdc connector只能设置一个并行度,主要可能有这些原因:
>1. mysql binlog本质上是一个文件,多个并行度消费需要避免重复
>2. 多个并行度消费难以保证顺序
>
>sink可以设为多个并行度,但是顺序不一定,如果需要主键相同的记录发到同一个sink线程可以先做一个keyby,并且保证keyby并行度与sink并行度相同,这样基本上能够保证数据forward传输,不过也不能100%保证有序。
>
>如果需要保证有序还是建议sink并行度为1
>
>
>
>--
>Sent from: http://apache-flink.147419.n8.nabble.com/
Reply | Threaded
Open this post in threaded view
|

Re: Re:Re: flink sql cdc并行度问题

Zorro
如果你是自己实现MongoDB sink的话,你描述的方法看起来是可行的,不过这种实现方式相对比较复杂。

sql keyby可以考虑使用flink提供的 Deduplication
<https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/dev/table/sql/queries/deduplication/>
功能。这样的话MongoDB sink就可以开多个并行度,而不用考虑不同key的顺序问题了



--
Sent from: http://apache-flink.147419.n8.nabble.com/