ETL系列 | Kafka输入插件使用指南

本文介绍Kafka输入插件基本使用方法。

01—

概述

Kafka输入插件从kafka接受各种格式的字符串类型消息,进行加工处理、流计算后,通过输出插件输出结果数据,对应的插件配置类:

Kafka2InputConfig,可以配置kafka消费端参数,包括kafka服务器地址、消费组id、自动提交机制、offset机制、消费线程数量、消息处理工作线程数、线程队列长度、topic、消息序列化机制等。

02—

插件配置案例

直接看kafka输入插件的配置案例:

// kafka服务器参数配置// kafka 2x 客户端参数项及说明类:org.apache.kafka.clients.consumer.ConsumerConfigKafka2InputConfig kafka2InputConfig = new Kafka2InputConfig();kafka2InputConfig//.addKafkaConfig("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer")  //.addKafkaConfig("key.deserializer","org.apache.kafka.common.serialization.LongDeserializer")  .addKafkaConfig("group.id","trandbtest") // 消费组ID  .addKafkaConfig("session.timeout.ms","30000")  .addKafkaConfig("auto.commit.interval.ms","5000")  .addKafkaConfig("auto.offset.reset","latest")//          .addKafkaConfig("bootstrap.servers","192.168.137.133:9093")  .addKafkaConfig("bootstrap.servers","127.0.0.1:9092")  .addKafkaConfig("enable.auto.commit","false")//一般不要开启自动提交  .addKafkaConfig("max.poll.records","500") // The maximum number of records returned in a single call to poll().  .setKafkaTopic("xinkonglog") // kafka topic  .setConsumerThreads(5) // 并行消费线程数,建议与topic partitions数一致  .setKafkaWorkQueue(10)//每个消费线程对应的工作等待队列长度  .setKafkaWorkThreads(2)//每个消费线程对应的工作线程数量
  .setPollTimeOut(1000) // 从kafka consumer poll(timeout)参数  .setValueCodec(CODEC_JSON)  .setKeyCodec(CODEC_LONG);importBuilder.setInputConfig(kafka2InputConfig);

关键配置说明:

kafka2InputConfig.setValueCodec(CODEC_JSON) json消息反序列化,将kafka中json字符串自动转换为map对象,如果消息是json格式,可以指定这个解码器,如果不指定默认就是String解码器

kafka2InputConfig.setKeyCodec(CODEC_LONG) 如果key是long类型,采用long反序列化消息key,这是一个可选配置。

Codec目录可以支持以下类型:

CODEC_TEXTCODEC_TEXT_SPLITCODEC_JSONCODEC_LONGCODEC_INTEGERCODEC_BYTE(byte数组)

如果配置了value.deserializer,那么setValueCodec将不起作用;

如果配置了key.deserializer,那么setKeyCodec将不起作用;

如果消息是其他格式,则可以设置CODEC_TEXT 类型,然后自行在datarefactor中进行处理,亦可以按照分割字符进行解析,然后进行字段映射处理。

03—

自定义消息转换处理

非格式化的字符串消息,可以自行在datarefactor中进行灵活的转换处理:

kafka2InputConfig.setValueCodec(CODEC_TEXT );importBuilder.setDataRefactor(new DataRefactor() {  public void refactor(Context context) throws Exception  {
     // 获取原始的Kafka记录     KafkaStringRecord record = (KafkaStringRecord) context.getCurrentRecord();     if(record.getKey() == null)       System.out.println("key is null!");     String message = (String)record.getData();     String[] datas = message.split("|");//举个简单的处理实例:按指定消息字段分割符,将消息切割为字符串数组    //指定数组元素与字段名称的映射配置    context.addFieldValue("logOperTime",datas[0]);    context.addFieldValue("operModule",datas[1]);    context.addFieldValue("logOperuser",datas[2]);  }});

如果消息是按照特定分割字符拼接而成,那么可以直接按照特定分隔符进行解析,然后进行字段映射处理,valuecodec必须设置为

CODEC_TEXT_SPLIT

kafka2InputConfig .setValueCodec(CODEC_TEXT_SPLIT);
Kafka2InputConfig kafka2InputConfig = new Kafka2InputConfig();kafka2InputConfig.setFieldSplit(";");//指定消息字段分割符,按照分隔符将消息切割为字符串数组//指定数组元素与字段名称的映射配置,kafka2InputConfig.addCellMapping(0, "logOperTime");kafka2InputConfig.addCellMapping(1, "operModule");kafka2InputConfig.addCellMapping(2, "logOperuser");

采用上面两种kafka消息自定义处理方法,可以满足各种不同格式的字符串kafka消息的处理需求

04—

 kafka输入插件拦截器设置

kafka输入插件作为事件监听型插件,在通过拦截器收集作业metrics信息时,需定时记录和统计插件消费kafka数据记录情况,然后调用任务拦截器的aftercall方法输出统计jobMetrics信息,因此一般指定统计时间间隔:

//300秒做一次任务拦截调用,默认值kafka2InputConfig.setMetricsInterval(300 * 1000L);

05—

 结束语

通过kafka输入插件,可以非常灵活地处理各种格式的字符串kafka消息,然后将处理后的数据通过各种输出插件进行输出,从而实现海量数据的实时高效流处理作业。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章