本文介绍Kafka输入插件基本使用方法。
01—
概述
Kafka输入插件从kafka接受各种格式的字符串类型消息,进行加工处理、流计算后,通过输出插件输出结果数据,对应的插件配置类:
Kafka2InputConfig,可以配置kafka消费端参数,包括kafka服务器地址、消费组id、自动提交机制、offset机制、消费线程数量、消息处理工作线程数、线程队列长度、topic、消息序列化机制等。
02—
插件配置案例
直接看kafka输入插件的配置案例:
// kafka服务器参数配置
// kafka 2x 客户端参数项及说明类:org.apache.kafka.clients.consumer.ConsumerConfig
Kafka2InputConfig 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_TEXT
CODEC_TEXT_SPLIT
CODEC_JSON
CODEC_LONG
CODEC_INTEGER
CODEC_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消息,然后将处理后的数据通过各种输出插件进行输出,从而实现海量数据的实时高效流处理作业。