kafka connnect知识解析和相关连接操作

一、基础知识

1.Connectors 和Tasks

 首先Connectors分为两类:SourceConnectors 和  SinkConnectors。SourceConnectors就是从其他系统导入数据到Kafka上,而SinkConnectors就是将Kafka上的数据导出到其他系统。例如,JDBCSourceConnector就是将关系型数据库中的数据导入到Kafka上,HDFSSinkConnector就是将Kafka上的数据导出到HDFS上。

Connectors类的实现本身不执行数据复制:Connector class的配置描述了要复制的数据集,Connector负责将该作业分解成一组Tasks,这些Tasks可以分发给Kafka Connect workers。

其次Tasks也分为两类:SourceTask 和 SinkTask。对于要分配的数据每一个Task都会复制数据的子集到Kafka(或从kafka复制数据)。connector复制的数据表示为一个分区流,类似于Kafka topic的模型,其中每一个分区都是带有偏移量的有序记录序列。每个task被分配到要处理的分区的一个子集。

下图是source connector的实例,它创建了两个tasks,tasks从输入分区(Stream中)拷贝数据并且将数据写到Kafka中

下图是数据通过连接source task进入Kafka的高级表示.

2.Partitions and Records

每个分区都是key-value记录的有序序列。keys和values可以有复杂的结构,由org.apache.kafka.connect中的数据结构表示包数据。支持许多基本类型以及数组、结构和嵌套数据结构。

下图是一个分区流,这是分区流数据模型用connectors对所有source和sink进行映射。每个记录包含keys和values(带有schemas)、分区ID和该分区内的偏移量(offsets)。

二、具体操作

1.配置

用Kafka connect连接其他系统时,需要根据传输的数据指定序列化数据的格式。在<Confluent-Path>etc/schema-registry/connect-distributed.properties 配置文件中修改。 现有的数据格式有JSON、AVRO、Protobuf等。

若是AVRO:(注:此处用的是Confluent5.5.1)

key.converter=io.confluent.connect.avro.AvroConverter
key.converter.schema.registry.url=http://localhost:8081
value.converter=io.confluent.connect.avro.AvroConverter
value.converter.schema.registry.url=http://localhost:8081

若是JSON:

key.converter=io.confluent.connect.json.JsonSchemaConverter
key.converter.schema.registry.url=http://localhost:8081
value.converter=io.confluent.connect.json.JsonSchemaConverter
value.converter.schema.registry.url=http://localhost:8081

2.启动

1)kafka connect(distributed模式)启动命令:

①bin/connect-distributed.sh -daemon config/connect-distributed.properties 

②bin/connect-distributed.sh  config/connect-distributed.properties 

启动后验证网址:http://主机IP:8083/connector-plugins 

2)通过curl命令连接(可以是别的方式我选择的是curl)

以连接mqtt为例,

curl -s -X POST -H 'Content-Type: application/json' http://主机IP:8083/connectors -d '{
    "name" : "连接名",
"config" : {
    "connector.class" : "io.confluent.connect.mqtt.MqttSourceConnector",
    "tasks.max" : "1",
    "mqtt.server.uri" : "tcp://mqtt服务器IP:1883",
    "mqtt.topics" : "mqtt的主题",
    "kafka.topic" : "kafka的主题",
    "confluent.topic.bootstrap.servers": "主机ip:9092",
    "confluent.topic.replication.factor": "3",
    "value.converter" :
     "org.apache.kafka.connect.converters.ByteArrayConverter"
    }
}'

3)查看连接其运行状态

http://主机IP:8083/connector-plugins/连接器名/status

3.其余操作

若采用JSON格式传输数据的话,kafka consumer会收到如下的数据:

其中只有key为“payload”对应的value是我们传输的真实数据,所以我们可以利用Kafka consumer的API操作过滤的其余数据,只获取“payload”对应的数据。

  while (true) {

            //拉取数据
            ConsumerRecords<String, String> consumerRecords = 
                          consumer.poll(Duration.ofMillis(100));
            //解析并打印consumerRecords
            for (ConsumerRecord<String,String> record : consumerRecords) {
                JSONObject jo= JSON.parseObject(record.value()); //解析JSON对象
                String val=jo.getString("payload");   //获取payload对应的value
                System.out.println(val);

                ProducerRecord<String,String> message=new ProducerRecord<>("test1",
                        val);       //将获取的value发送到新的kafka topic 
                producer.send(message);


            }

猜你喜欢

转载自blog.csdn.net/weixin_42070473/article/details/108076190