flink从kafka读取数据写入clickhouse本地表的实现

实现功能

因为直接写clickhouse的分布式表在数据量比较大的时候会有各种问题,所以做了一个flink读取kafka数据然后路由写入到相应的本地表节点,并且关于不同的表的配置信息可以随时更改并设置生效时间。

实现流程

  1. 首先从kafka将数据读取过来
  2. 然后进行相应的处理及逻辑判断写入到对应的clickhouse表格中
  3. 最后根据CDC读取来的配置信息进行相应节点的hash路由,直接写入本地表

读取kafka数据

定义kafka工具类,实现kafka的source获取函数

public static FlinkKafkaConsumer getKafkaSource(String topic, String groupId) {
        Properties prop = new Properties();
        prop.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_SERVER);
        prop.setProperty(ConsumerConfig.GROUP_ID_CONFIG, groupId);
        return new FlinkKafkaConsumer<>(topic, new SimpleStringSchema(), prop);
    }

之后在主程序中获取环境,并读取数据

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();


env.addSource(KafkaUtils.getKafkaSource(topic,groupId).setStartFromGroupOffsets()).setParallelism(4)

flinkCDC获取配置信息并进行广播

这里将clickhouse的分布式表的配置信息存储在MySQL中,利用CDC进行一个实时的监控和更改

在配置流没有到达之前,将采用代码中的默认配置进行处理,同时将默认配置的数据存储在Redis中,也可以做到很方便的修改。

//flinkcdc 读取配置
DebeziumSourceFunction configSource = MySQLSource.builder()
       .hostname("******")
       .port(3306)
       .databaseList("test_config")
       .t

你可能感兴趣的:(kafka,flink,分布式,大数据)