Flume - 有没有办法将 avro 事件 (header & body) 存储到 hdfs 中?
Flume - Is there a way to store avro event (header & body) into hdfs?
新 flume...
我正在接收 avro 事件并将它们存储到 HDFS 中。
我了解默认情况下只有事件的 body 存储在 HDFS 中。我也知道有一个avro_event serializer。但是我不知道这个序列化器到底在做什么?它如何影响接收器的最终输出?
此外,我不知道如何将事件转储到 HDFS 中以保留其 header 信息。我需要编写自己的序列化程序吗?
事实证明,序列化程序 avro_event
确实在文件中存储了 header 和 body。
这是我设置水槽的方法:
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
选项注入 headers。
header文件的内容:
machine=localhost
user=myName
最终使用我从这个 posting:
中窃取的一个简单的 java 应用程序测试了结果
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();
果然我看到了每条记录的 headers,这是一行:
value = {"headers": {"machine": "localhost", "user": "myName"}, "body": {"bytes": "set -x"}}
还有一个序列化程序也发出 headers,那就是 header_and_text 序列化程序生成的文件是 human-readable 文本文件。这是一个示例行:
{machine=localhost, user=userName} set -x
最后在 Apache Flume - Hadoop 的分布式日志 Collection 中,提到了 header_and_text
序列化程序,但我无法让它工作。
新 flume...
我正在接收 avro 事件并将它们存储到 HDFS 中。
我了解默认情况下只有事件的 body 存储在 HDFS 中。我也知道有一个avro_event serializer。但是我不知道这个序列化器到底在做什么?它如何影响接收器的最终输出?
此外,我不知道如何将事件转储到 HDFS 中以保留其 header 信息。我需要编写自己的序列化程序吗?
事实证明,序列化程序 avro_event
确实在文件中存储了 header 和 body。
这是我设置水槽的方法:
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
选项注入 headers。
header文件的内容:
machine=localhost
user=myName
最终使用我从这个 posting:
中窃取的一个简单的 java 应用程序测试了结果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();
果然我看到了每条记录的 headers,这是一行:
value = {"headers": {"machine": "localhost", "user": "myName"}, "body": {"bytes": "set -x"}}
还有一个序列化程序也发出 headers,那就是 header_and_text 序列化程序生成的文件是 human-readable 文本文件。这是一个示例行:
{machine=localhost, user=userName} set -x
最后在 Apache Flume - Hadoop 的分布式日志 Collection 中,提到了 header_and_text
序列化程序,但我无法让它工作。