使用Flume Avro的日志数据未正确存储在Hive中

时间:2014-07-17 07:41:28

标签: logging hadoop hive flume avro

我使用Flume 1.5.0从应用程序服务器收集日志。 假设我有三个App服务器,App-A,App-B,App-C。一个正在运行配置单元的HDFS服务器。 现在,flume代理正在所有3 App服务器上运行,并将日志消息从app服务器传递到Hdfs服务器,其中另一个flume代理正在运行,并且finaaly日志存储在hadoop文件系统中。现在我已经创建了一个外部Hive表来映射这些日志数据。 但是除了hive无法正确解析日志数据并存储在表中之外,一切都顺利进行。

这是我的Flume和Hive配置:

虚拟日志文件格式(|分隔):ClientId |应用程序请求| URL

应用服务器上的Flume conf:

app-agent.sources = tail
app-agent.channels = memoryChannel 
app-agent.sinks = avro-forward-sink 

app-agent.sources.tail.type = exec 
app-agent.sources.tail.command = tail -F /home/kuntal/practice/testing/application.log
app-agent.sources.tail.channels = memoryChannel


app-agent.channels.memoryChannel.type = memory
app-agent.channels.memoryChannel.capacity = 100000
app-agent.channels.memoryChannel.transactioncapacity = 10000

app-agent.sinks.avro-forward-sink.type = avro 
app-agent.sinks.avro-forward-sink.hostname = localhost
app-agent.sinks.avro-forward-sink.port = 10000
app-agent.sinks.avro-forward-sink.channel = memoryChannel

Hdfs服务器上的Flume conf:

hdfs-agent.sources = avro-collect
hdfs-agent.channels = memoryChannel 
hdfs-agent.sinks = hdfs-write 

hdfs-agent.sources.avro-collect.type = avro 
hdfs-agent.sources.avro-collect.bind = localhost
hdfs-agent.sources.avro-collect.port = 10000 
hdfs-agent.sources.avro-collect.channels = memoryChannel

hdfs-agent.channels.memoryChannel.type = memory
hdfs-agent.channels.memoryChannel.capacity = 100000
hdfs-agent.channels.memoryChannel.transactioncapacity = 10000

hdfs-agent.sinks.hdfs-write.channel = memoryChannel
hdfs-agent.sinks.hdfs-write.type = hdfs 
hdfs-agent.sinks.hdfs-write.hdfs.path = hdfs://localhost:9000/user/flume/tail_table/avro
hdfs-agent.sinks.hdfs-write.rollInterval = 30 

Hive外部表:

CREATE EXTERNAL TABLE IF NOT EXISTS test(clientId int, itemType string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
LOCATION '/user/flume/tail_table/avro';

请建议我该怎么办?我是否需要在蜂巢端包含AvroSerde?

2 个答案:

答案 0 :(得分:1)

你在hdfs服务器端的flume配置文件上做了一个小错字 对于所有与hdfs相关的配置,我们必须将 hdfs 包含在属性中 所以,

  

hdfs-agent.sinks.hdfs-write.rollInterval = 30

必须是

  

hdfs-agent.sinks.hdfs-write .hdfs。 rollInterval = 30

有关详细信息,请参阅https://flume.apache.org/FlumeUserGuide.html#hdfs-sink
现在检查hdfs端的文件是否正确。尝试使用cat命令打印文件的内容,以查看是否只有您要发送的文本。如果在打印内容时仍然存在任何其他乱码,则配置文件中会出现一些错误。

答案 1 :(得分:1)

在hdfs接收器中缺少以下3个附加设置:

hdfs-agent.sinks.hdfs-write.hdfs.fileType = DataStream
hdfs-agent.sinks.hdfs-write.hdfs.writeFormat = Text
hdfs-agent.sinks.hdfs-write.hdfs.rollInterval = 30 

因此数据没有正确存储在hdfs中,Hive无法加载到表中。现在工作正常!