Flume:目录到Avro - > Avro到HDFS - 转移后无效avro

时间:2014-02-07 00:29:34

标签: hadoop hdfs flume avro

我有用户编写AVRO文件,我想使用Flume使用Flume将所有这些文件移动到HDFS中。所以我以后可以使用Hive或Pig来查询/分析数据。

在客户端我安装了水槽并有一个SpoolDir源和AVRO接收器如下:

a1.sources = src1
a1.sinks = sink1
a1.channels = c1

a1.channels.c1.type = memory

a1.sources.src1.type = spooldir
a1.sources.src1.channels = c1
a1.sources.src1.spoolDir = {directory}
a1.sources.src1.fileHeader = true
a1.sources.src1.deserializer = avro

a1.sinks.sink1.type = avro
a1.sinks.sink1.channel = c1
a1.sinks.sink1.hostname = {IP}
a1.sinks.sink1.port = 41414

在hadoop集群上,我有这个AVRO源和HDFS接收器:

a1.sources = avro1
a1.sinks = sink1
a1.channels = c1

a1.channels.c1.type = memory

a1.sources.avro1.type = avro
a1.sources.avro1.channels = c1
a1.sources.avro1.bind = 0.0.0.0
a1.sources.avro1.port = 41414

a1.sinks.sink1.type = hdfs
a1.sinks.sink1.channel = c1
a1.sinks.sink1.hdfs.path = {hdfs dir}
a1.sinks.sink1.hdfs.fileSuffix = .avro
a1.sinks.sink1.hdfs.rollSize = 67108864
a1.sinks.sink1.hdfs.fileType = DataStream

问题是HDFS上的文件不是有效的AVRO文件!我正在使用hue UI检查文件是否是有效的AVRO文件。如果我将我在电脑上生成的AVRO I文件上传到集群,我可以看到它的内容很好。但来自水槽的文件不是有效的AVRO文件。

我尝试了包含在水槽中的水槽avro客户端但是没有工作,因为它发送了每行打破avro文件的水槽事件,这是使用spooldirdeserializer = avro来解决的。所以我认为在编写文件时问题出现在HDFS接收器上。

使用hdfs.fileType = DataStream它会从avro字段而不是整个avro文件中写入值,从而丢失所有架构信息。如果我使用hdfs.fileType = SequenceFile,则文件由于某种原因无效。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:7)

您必须将此添加到您的hdfs接收器配置中(默认情况下此属性的值为TEXT):

a1.sinks.sink1.serializer = avro_event

这应该写有效的avro文件,但是使用默认架构。

但是,由于您使用avro文件作为输入,因此您可能希望编写具有相同模式的avro文件。为此,您可以使用AvroEventSerializer中的cloudera's cdk。假设您构建了代码并将jar放在了flume的lib目录中,您现在可以在属性文件中定义Serializer:

a1.sinks.sink1.serializer = org.apache.flume.serialization.AvroEventSerializer$Builder

序列化程序假定avro架构出现在每个事件的标题中,可以是URL,也可以是LITERAL。要使用后一种方法(效率较低,但可能更容易尝试),您必须通过添加此属性告诉客户端的源代码将模式文字添加到每个事件:

a1.sources.src1.deserializer.schemaType = LITERAL