来自Netcat源的事件不会通过Kafka频道

时间:2016-03-25 02:59:57

标签: logging apache-kafka flume

我使用水槽代理通过Flume代理收集外部数据。外部数据批量几乎是每10秒1MB。我将Flume代理配置如下。

# Flume agent configuration as /flume/conf/agent.conf
agent.sources = netcat-source
agent.channels = kafka-channel
agent.sinks = logger-sink

########################################
#   Netcat Source
########################################

agent.sources.netcat-source.type = netcat
agent.sources.netcat-source.bind = 0.0.0.0
agent.sources.netcat-source.port = 4141
agent.sources.netcat-source.max-line-length = 500000
agent.sources.netcat-source.channels = kafka-channel

########################################
#   Kafka Channel
########################################

agent.channels.kafka-channel.type =  org.apache.flume.channel.kafka.KafkaChannel
agent.channels.kafka-channel.brokerList = 10.212.136.108:9092,10.212.136.108:9092
agent.channels.kafka-channel.zookeeperConnect = 10.212.136.108:2181,10.212.136.108:2181/kafka
agent.channels.kafka-channel.topic = channel
agent.channels.kafka-channel.groupId = fcd-group


########################################
#   Logger Sink
########################################

agent.sinks.logger-sink.type = logger
agent.sinks.logger-sink.channel = kafka-channel

我按照以下方式激活了代理。

flume-ng agent -n agent -c /flume/conf -f /flume/conf/agent.conf 

不幸的是,事实证明netcat源工作得很好,并且通道或接收器出了问题。从Ubuntu的资源监视器,我可以看到以下性能。 Network performance. Blue curve indicates input while red one indicates output 如果没有运行网络io的其他应用程序,我确信这个数字证明了我的Flume代理发生了什么。

当我通过控制台消费者检查主题“频道”中的Kafka内容时,我什么都没得到。另外,当我检查 flume.log 时,我只获得没有数据的Flume输出状态。

我使用

验证了传入的数据
nc -lk 4141 >> my_data_check_file

我的频道或接收器有什么问题?

P.S。当我使用内存频道,文件频道时,情况也同样棘手。

1 个答案:

答案 0 :(得分:1)

啊,最后,我自己解决了这个问题!

关键点是行分隔符' \ n'

在Flume源代码 NetcatSource.java 中,我们有一个如下所示的三角行

private int processEvents(CharBuffer buffer, Writer writer) throws IOException {
  int numProcessed = 0;

  boolean foundNewLine = true;
  while (foundNewLine) {
    foundNewLine = false;

    int limit = buffer.limit();
    for (int pos = buffer.position(); pos < limit; pos++) {
      if (buffer.get(pos) == '\n') {  
        // parse event body bytes out of CharBuffer
        buffer.limit(pos); // temporary limit
        ByteBuffer bytes = Charsets.UTF_8.encode(buffer);
        buffer.limit(limit); // restore limit
... ...
... ...

代码强制输入数据以&#39; \ n&#39;结尾。否则,渠道不会发生任何事件。我们可以根据需要更改此字符,并将自定义源放入$ FLUME_HOME / lib