我使用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? p>
答案 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无法加载到表中。现在工作正常!