我有以下内容: 来源 - kafka主题(反式) 频道 - 记忆 接收器 - Hdfs(avro_event)
kafka topic trans中的数据是使用c#producer编写的,有数千条avro记录。当我运行我的水槽消费者时,它开始将数据下沉到hdfs。问题是数据格式为:schema 数据 模式 数据
而不是:
架构 数据 数据
我猜这是因为flume期待带有{header} {body}的记录类型,而来自kafka的数据只是{body} 我知道有一种方法可以将avro数据包装在avroFlumeEvent中写入主题但是它似乎不再是真正的avro记录,也许火花消费者或风暴将更喜欢真正的avro数据下线。有没有办法处理这个主题,所以每当水槽将数据滚动到hdfs时,数据都是在没有多个模式的情况下编写的?
答案 0 :(得分:0)
我们最终实现了这项工作。我们在C#生产者中使用microsoft .NET avro库而不是apache avro库。这意味着avro记录已正确序列化。我还需要更改flume接收器以使用“org.apache.flume.sink.hdfs.AvroEventSerializer $ Builder”作为接收器序列化器而不是“avro_event”。我还需要包含一个连接到kafka源的水槽拦截器,它将变量“flume.avro.schema.url”推入水槽标头,稍后由hdfs sink序列化器使用。
我看了一下camus但是对于我们试图实现的东西似乎有点过分了,这是一个连接到kafka主题的基本水槽通道,它将avro数据汇入hdfs。
我刚刚从我的java应用程序中删除了拦截器位,该应用程序构建了水槽配置,希望它可以帮助遇到此问题的其他人:
_flumeFileConfigProperties.put(_agentId+".sources." + _sourceId +".interceptors",_interceptorId);
_flumeFileConfigProperties.put(_agentId+".sources." + _sourceId + ".interceptors." + _interceptorId + ".type","static");
_flumeFileConfigProperties.put(_agentId+".sources." + _sourceId + ".interceptors." + _interceptorId + ".key","flume.avro.schema.url");
_flumeFileConfigProperties.put(_agentId+".sources." + _sourceId + ".interceptors." + _interceptorId + ".value",_avroProdSchemaLocation +_databaseName + "/" + _topic + "/record/" + _schemaVersion + "/" + _topicName + ".avsc");
答案 1 :(得分:-1)
你有没有考虑过使用来自LinkedIn的Camus,一旦你将数据放在kafka上。它将运行mapreduce作业,但您应该获得所需的架构数据数据布局。您还应该查看Confluent的kafka堆栈,尤其是它提供的架构注册表以及它提供的其余API。