当使用python套接字或telnet工作时,无法正确获取事件

时间:2016-12-28 09:04:00

标签: python flume netcat

我想使用Flume在Python脚本中收集日志,因此我按照用户指南使用netcat源配置Flume,然后使用telnet和nc进行测试,效果很好。

我的配置代码:

a1.sources = r1
a1.sinks = k1
a1.channels = c1
Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
a1.sinks.k1.type = logger
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

然后我使用Python来连接Flume,并像这样发送一些单词:

import socket
def netcat(hostname, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((hostname, port))
    s.send("test words 1\n")
    s.send("test words 2\n")
    s.send("test words 3\n")
    s.send("test words 4\n")
    s.shutdown(socket.SHUT_WR)
    s.close()

if _name_ == "_main_":
    netcat("127.0.0.1",44444)
问题发生时,水槽只能收到2排。 水槽日志:

2016-12-28 16:44:32,248 (lifecycleSupervisor-1-0) [INFO - org.apache.flume.source.NetcatSource.start(NetcatSource.java:169)] Created serverSocket:sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:44444] 2016-12-28 16:44:41,814 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 74 65 73 74 20 77 6F 72 64 73 20 31 test words 1 } 2016-12-28 16:44:41,815 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{} body: 74 65 73 74 20 77 6F 72 64 73 20 32 test words 2 }

我在Ubuntu& Java1.8和Centos& Java 1.7上获得了相同的结果,并且在Python中使用telnet模型也得到了相同的结果。

配置或Python脚本有什么问题吗?或者有人对此案有建议吗?

1 个答案:

答案 0 :(得分:2)

发生这种情况的原因是因为您没有等待回复的回复。默认情况下,Flume的netcat来源会发送" OK"回复每个事件。您可以在发送响应之前终止连接,这会导致处理其他消息失败(因为管道已从客户端断开)。

要解决此问题,您需要对flume.conf进行以下更改:

a1.sources.r1.ack-every-event=false

这消除了对" OK"的要求。发送,因此停止失败。

或者,您可以将Python更改为每次等待" OK"关闭连接之前要发送的消息。人为地,在中添加sleep语句也可以解决问题,尽管您要假设处理消息需要多长时间。通常很好,但可能有其他情况导致处理延迟。