0
新的水槽...Flume - 有没有办法将avro事件(标题和正文)存储到hdfs中?
我收到avro事件并将它们存储到HDFS中。
我明白,默认情况下,只有事件的主体存储在HDFS中。我也知道有一个。但是我不知道这个串行器实际上在做什么?它如何影响水槽的最终产量?
此外,我不知道如何将事件转储到保存其头信息的HDFS。我是否需要编写自己的序列化程序?
新的水槽...Flume - 有没有办法将avro事件(标题和正文)存储到hdfs中?
我收到avro事件并将它们存储到HDFS中。
我明白,默认情况下,只有事件的主体存储在HDFS中。我也知道有一个。但是我不知道这个串行器实际上在做什么?它如何影响水槽的最终产量?
此外,我不知道如何将事件转储到保存其头信息的HDFS。我是否需要编写自己的序列化程序?
事实证明,串行器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序列化程序生成的文件是一个人类可读的文本文件。下面是一个示例行:
{machine=localhost, user=userName} set -x
最后在Apache水槽 - 分布式日志收集Hadoop的,有header_and_text
serialzer一提,但我无法得到那个工作。