flume消费kafka数据获取元数据信息
在使用flume消费kafka的时候,在有些业务场景中,我们需要获取kafka的元数据信息来满足业务需求,文章将从flume的连接器kafkaSource的源码分析,flume在消费kafka数据时,如何获取kafka中的元数据信息。
KafkaSource 源码
我们知道,flume中数据是以Event进行传输的,Event在源码中是一个顶层接口,我们来看一下Event的一个实现类SimpleEvent,源码如下:
public class SimpleEvent implements Event {
private Map<String, String> headers;
private byte[] body;
public SimpleEvent() {
headers = new HashMap<String, String>();
body = new byte[0];
}
@Override
public Map<String, String> getHeaders() {
return headers;
}
@Override
public void setHeaders(Map<String, String> headers) {
this.headers = headers;
}
@Override
public byte[] getBody() {
return body;
}
@Override
public void setBody(byte[] body) {
if (body == null) {
body = new byte[0];
}
this.body = body;
}
@Override
public String toString() {
Integer bodyLen = null;
if (body != null) bodyLen = body.length;
return "[Event headers = " + headers + ", body.length = " + bodyLen + " ]";
}
}
可以看到,SimpleEvent 的成员变量有两个:headers和body。headers就是一个HashMap,body是一个byte数组。我们接着看KafkaSource中的源码,由于源码较长,篇幅原因,我们截取其中的片段来看。
// get next message
ConsumerRecord<String, byte[]> message = it.next();
kafkaKey = message.key();
if (useAvroEventFormat) {
//Assume the event is in Avro format using the AvroFlumeEvent schema
//Will need to catch the exception if it is not
ByteArrayInputStream in =
new ByteArrayInputStream(message.value())