关于flume Header头信息乱码解析问题

在生产环境消费kafka传输过来的flume的采集信息的时候,发现flume的header的头信息有乱码现象出现,例如<0x04><0x10>hostname<0x1a>wangdong-test<0x10>filename<0x1a>test-log.....

这种现象导致我们在写消费者程序的时候,无法通过正常格式化json的方式或者字符串切割的方式去做解析,经查找,发现flume内部采用了apache的消息格式中间件avro,数据被source采集上来的时候直接序列化成了AvroFlumeEvent对象,在sink的时候可以直接通过getHeaders的方式获取头信息,于是,在消费者端,如果想要精准的解析头信息的话,需要先反序列化AvroFlumeEvent对象,再从中拿出header信息和body信息,下面贴一下代码:

import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.DecoderFactory;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.flume.source.avro.AvroFlumeEvent;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Map;


public void getHeaders(String stream)
{
    AvroFlumeEvent result = null;
    ByteBuffer data = null;
    Map<CharSequence, CharSequence> map = null;

    byte[] bytes = stream.getBytes();
    /**解码还原为flumeEvent**/
    SpecificDatumReader<AvroFlumeEvent> reader = new SpecificDatumReader<AvroFlumeEvent>(AvroFlumeEvent.class);

    BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(bytes, null);
    try{
        result = reader.read(null, decoder);
        map = result.getHeaders();
        data = result.getBody();
    }catch (IOException e){
        e.printStackTrace();
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return;
    }
    /**输出header信息和body信息**/
    System.out.println("header: ");
    for (Map.Entry<CharSequence, CharSequence>entry: map.entrySet()){
        System.out.println(entry.getKey() + " : " + entry.getValue());
    }
    String bodyData = new String(data.array());
    System.out.println("body: " + bodyData);
}

这里我的pom依赖是

<dependency>
    <groupId>org.apache.flume</groupId>
    <artifactId>flume-ng-sdk</artifactId>
    <version>1.8.0</version>
</dependency>

<dependency>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro</artifactId>
  <version>1.8.1</version>
</dependency>

请各位用java开发flume日志消费的小伙伴了解一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值