首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flume:目录到Avro -> Avro到HDFS -传输后无效

Flume:目录到Avro -> Avro到HDFS -传输后无效
EN

Stack Overflow用户
提问于 2014-02-07 00:29:33
回答 1查看 4.8K关注 0票数 5

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

在客户端上,我安装了flume,并有一个SpoolDir源代码和Avro接收器,如下所示:

代码语言:javascript
复制
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接收器:

代码语言:javascript
复制
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,由于某些原因,这些文件无效。

有什么想法吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-02 17:40:02

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

代码语言:javascript
复制
a1.sinks.sink1.serializer = avro_event

这应该会写入有效的avro文件,但是使用默认模式。

但是,由于您使用avro文件作为输入,您可能希望使用相同的模式编写avro文件。为此,您可以使用来自[医] cloudera's[医] cloudera's。假设您构建了代码并将jar放置在flume的lib目录中,那么现在可以在属性文件中定义序列化程序:

代码语言:javascript
复制
a1.sinks.sink1.serializer = org.apache.flume.serialization.AvroEventSerializer$Builder

序列化程序假定avro模式以URL或文字的形式呈现每个事件的标头。要使用后一种方法(效率较低,但可能更容易尝试),必须通过添加以下属性告诉客户端的源将模式文字添加到每个事件:

代码语言:javascript
复制
a1.sources.src1.deserializer.schemaType = LITERAL
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21617025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档