2015-10-27 8 views
0

Новинка для ...Flume - есть способ сохранить событие avro (header & body) в hdfs?

Я получаю события avro и сохраняю их в HDFS.

Я понимаю, что по умолчанию только тело события хранится в HDFS. Я также знаю, что есть avro_event serializer. Но я не знаю, что делает этот сериализатор на самом деле? Как это влияет на окончательный вывод раковины?

Кроме того, я не могу понять, как просто выгрузить событие в HDFS, сохраняя информацию заголовка. Нужно ли писать собственный сериализатор?

ответ

0

Как оказалось, сериализатор avro_event хранит как заголовок & тело в файле.

Вот как я настроил свою мойку:

a1.sinks.i1.type=hdfs 
a1.sinks.i1.hdfs.path=hdfs://localhost:8020/user/my-name 
a1.sinks.i1.hdfs.rollInterval=0 
a1.sinks.i1.hdfs.rollSize=1024 
a1.sinks.i1.hdfs.rollCount=0 
a1.sinks.i1.serializer=avro_event 
a1.sinks.i1.hdfs.fileType=DataStream 

Я послал событие с помощью упакованного агента avro-client, впрыскиваюсь заголовки с помощью опции -R headerFile.

содержания headerFile:

machine=localhost 
user=myName 

Наконец проверил результаты с помощью простого Java приложения, которое я украл из этого posting:

final FileSystem fs = FileSystem.get(getConf()); 
     final Path path = new Path(fs.getHomeDirectory(), "FlumeData.1446072877536"); 

     printWriter.write(path + "-exists: " + fs.exists(path)); 

     final SeekableInput input = new FsInput(path, getConf()); 
     final DatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>(); 
     final FileReader<GenericRecord> fileReader = DataFileReader.openReader(input, reader); 

     for (final GenericRecord datum : fileReader) { 
      printWriter.write("value = " + datum); 
     } 

     fileReader.close(); 

И точно я вижу, мои заголовки для каждой записи, здесь одна строка:

value = {"headers": {"machine": "localhost", "user": "myName"}, "body": {"bytes": "set -x"}} 

Существует еще один сериализатор, который также испускает заголовки, и это header_and_text serializer Результирующий файл является текстовым файлом, доступным для человека. Вот пример строки:

{machine=localhost, user=userName} set -x 

Наконец, в Apache Flume - Distributed Log Collection для Hadoop, есть упоминание о header_and_text serialzer, но я не мог получить, чтобы работать.