我有用户编写AVRO文件,我想使用Flume使用Flume将所有这些文件移动到HDFS中。因此,以后我可以使用Hive或Pig来查询/分析数据。
在客户端上,我安装了flume,并有一个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文件!每当文件是有效的AVRO文件时,我就使用hue UI进行检查。如果我将我在pc上生成的AVRO I文件上传到集群,我可以很好地看到它的内容。但是flume的文件不是有效的AVRO文件。
我尝试了flume,该客户端包含在flume中,但没有工作,因为它每一行发送一个flume事件,破坏avro文件,这是使用spooldir源代码使用deserializer = avro进行修正的。因此,我认为问题在于当编写文件时,HDFS接收器上。
使用hdfs.fileType = DataStream,它会从avro字段写入值,而不是整个avro文件,从而丢失所有的架构信息。如果我使用hdfs.fileType = SequenceFile,由于某些原因,这些文件无效。
有什么想法吗?
谢谢
发布于 2014-09-02 17:40:02
您必须将其添加到hdfs接收器配置中(此属性的值默认为TEXT):
a1.sinks.sink1.serializer = avro_event这应该会写入有效的avro文件,但是使用默认模式。
但是,由于您使用avro文件作为输入,您可能希望使用相同的模式编写avro文件。为此,您可以使用来自[医] cloudera's的[医] cloudera's。假设您构建了代码并将jar放置在flume的lib目录中,那么现在可以在属性文件中定义序列化程序:
a1.sinks.sink1.serializer = org.apache.flume.serialization.AvroEventSerializer$Builder序列化程序假定avro模式以URL或文字的形式呈现每个事件的标头。要使用后一种方法(效率较低,但可能更容易尝试),必须通过添加以下属性告诉客户端的源将模式文字添加到每个事件:
a1.sources.src1.deserializer.schemaType = LITERALhttps://stackoverflow.com/questions/21617025
复制相似问题