Apache kafka Flink:binlog到多DTO的转换及Flink中的转换方法

Apache kafka Flink:binlog到多DTO的转换及Flink中的转换方法,apache-kafka,flink-streaming,real-time-data,tidb,Apache Kafka,Flink Streaming,Real Time Data,Tidb,卡夫卡、弗林克和蒂布的新版本。 假设我有三个MySql源表s_a,s_b,和s_c,并希望实时收集记录到目标TiDb表t_a和t_b。 映射规则是 `s_a` --> `t_a` `s_b` union `s_c` ---> `t_b` with some transformation (e.g., field remapping). 我采用的解决方案是kafka+Flink和Tidb sink,其中binlog更改订阅到kafka主题

卡夫卡、弗林克和蒂布的新版本。 假设我有三个MySql源表
s_a
s_b
,和
s_c
,并希望实时收集记录到目标TiDb表
t_a
t_b
。 映射规则是

`s_a`  --> `t_a`                   
`s_b` union `s_c`   ---> `t_b`  with some transformation (e.g., field remapping).
我采用的解决方案是kafka+Flink和Tidb sink,其中binlog更改订阅到kafka主题;Flink使用主题并将转换后的结果写入Tidb。我在flink代码部分遇到的问题是:

  • 如何轻松地将从kafka轮询的json字符串(包含运算符、表的信息)恢复为不同类型的DTO操作(例如,插入/创建
    t_a
    t_b
    )。我发现了一个名为
    Debezium
    的工具,名为Kafka&Flink connector,但它似乎需要源表和目标表之间的相等性

  • 如果我有多个目标表,如何编写转换
    VKDataMapper
    。我很难定义
    T
    ,因为它可以是
    T_a
    DTO(数据传输对象)或
    T_b
    DTO

  • 我现有的示例代码如下所示:

    //主要的例行公事

       StreamExecutionEnvironment environment =
                    StreamExecutionEnvironment.getExecutionEnvironment();
           //consume is FlinkkafkaConsumer. TopicFilter returns true. 
            environment.addSource(consumer).filter(new TopicFilter()).map(new VKDataMapper())
                    .addSink(new TidbSink());
    
            try {
                environment.execute();
            } catch (Exception e) {
                log.error("exception {}", e);
            }
     
     
     public class VKDataMapper implements MapFunction<String, T> {
    
        @Override
        public T map(String value) throws Exception {
            //How T can represents both `T_a data DTO` `T_b`...., 
            return null;
        }
    
    }
    
    StreamExecutionEnvironment环境=
    StreamExecutionEnvironment.getExecutionEnvironment();
    //消费就是消费。TopicFilter返回true。
    environment.addSource(consumer).filter(新的TopicFilter()).map(新的VKDataMapper())
    .addSink(新的TidbSink());
    试一试{
    execute();
    }捕获(例外e){
    log.error(“异常{}”,e);
    }
    公共类VKDataMapper实现映射函数{
    @凌驾
    公共T映射(字符串值)引发异常{
    //如何将'T_a data DTO'表示为'T_b'。。。。,
    返回null;
    }
    }
    
    为什么不试试Flink SQL?这样,您只需在Flink中创建一些表,然后通过sql定义任务,如:

    insert into t_a select * from s_a;
    insert into t_b select * from s_b union select * from s_c;
    

    请参阅中的一些示例,可以随意询问任何让您感到困惑的问题。

    您看过吗?也许这会简化事情。欢迎加入TiDB社区Slack频道,与TiDB社区互动并获得更快的回复~Thank@Littlefall。我看到了flink tidb rdw,但我会检查它。你介意添加一个微信吗(我想我以前给你发过邮件)?是的!很抱歉这么晚才见到你,我刚刚给你发了一个朋友请求。