Apache Kafka示例错误:3次尝试后无法发送消息

时间:2014-05-28 06:00:08

标签: apache-kafka

我正在运行其网站

中提到的这个kafka制作人示例

代码:

public class TestProducer {

    public static void main(String[] args) {
        long events = Long.parseLong(args[0]);
        Random rnd = new Random();
        Properties props = new Properties();
        props.put("metadata.broker.list", "host.broker-1:9093, host.broker-2:9093, host.broker-3:9095");
        props.put("serializer.class", "kafka.serializer.StringEncoder");
        props.put("partitioner.class", "test.app.SimplePartitioner");
        props.put("request.required.acks", "1");
        ProducerConfig config = new ProducerConfig(props);
        Producer<String, String> producer = new Producer<String, String>(config);
        for (long nEvents = 0; nEvents < events; nEvents++) { 
               long runtime = new Date().getTime();  
               String ip = "192.168.2." + rnd.nextInt(255); 
               String msg = runtime + ",www.example.com," + ip; 
               KeyedMessage<String, String> data = new KeyedMessage<String, String>("page_visits", ip, msg);
               producer.send(data);
        }
        producer.close();
    }
}

public class SimplePartitioner implements Partitioner{
    public SimplePartitioner (VerifiableProperties props) {

    }

    public int partition(Object key, int a_numPartitions) {
        int partition = 0;
        String stringKey = (String) key;
        int offset = stringKey.lastIndexOf('.');
        if (offset > 0) {
           partition = Integer.parseInt( stringKey.substring(offset+1)) % a_numPartitions;
        }
       return partition;
  }

}

更多详情:

我在主机(呼叫是生产者)上运行此应用程序,它远离主机代理[1-3]

  • 我可以ping并从生产者主机ssh代理主机。

  • 在server.properties中提供advertised.host.name(它们分别在代理中命名为server [1-3] .properties

属性:

broker.id=1
port=9093
host.name=host.broker.internal.name
advertised.host.name=host-broker1
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/1/kafka-logs-1,/data/2/kafka-logs-2
num.partitions=1
num.recovery.threads.per.data.dir=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
log.cleaner.enable=false
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181
zookeeper.connection.timeout.ms=6000

有关如何解决此错误的想法吗?

7 个答案:

答案 0 :(得分:9)

我在运行Kafka制作人时遇到了这些错误:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

找到解决方案:

在我的Mac机上,在我下载scala-2.10kafka_2.10-0.8.1之后,在kafka_2.10-0.8.1目录中,当我启动zookeeper,kafka服务器并创建一个时,一切都很好测试主题。然后我需要为测试主题启动一个生产者。但是有一个错误:

yhuangMac:kafka_2.10-0.8.1 yhuang$ ./bin/kafka-console-producer.sh –broker-list localhost:9092 –topic test
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

原因是在kafka libs目录中,kafka发布的zip文件只包含了slf4j-api的jar文件,他们错过了一个jar文件:slf4j-nop.jar,所以我们必须转到http://www.slf4j.org ,下载slf4j-1.7.7.zip,然后解压缩,将slf4j-api-1.7.7,slf4j-nop-1.7.7.jar复制到kafka的libs目录中。

再次重启kafka生产者,现在没有报告错误。

来源:SOLUTION

答案 1 :(得分:3)

您需要添加SLF4j日志记录实现。如果您使用maven作为构建工具,请尝试将以下内容添加到您的pom.xml中,看看它是否有效..

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.5</version>
    </dependency>

答案 2 :(得分:2)

这是Krish提出的原始问题中异常的解决方案:&#34; kafka.common.FailedToSendMessageException:3次尝试后无法发送消息。&#34;

常见问题解答herehere表示您的主机名应正确设置。我没有经历过这种情况。但是当kafka生产者提供此错误消息时,我发现另一个条件:当生产者中的分区键错误时。也就是说,如果您有一个分区的主题,那么生产者中的分区键可以为空(消息发送到随机分区)或0(kafka中的分区从0开始编号)。如果您尝试使用分区键1,则会在生产者中抛出此异常。或者,如果主题中有3个分区,并且使用3的分区键(3的键为无效,因为有效分区号为0,1,2),则抛出此异常。当生产者的send()方法中的分区号与主题中的分区范围不匹配时,此错误是一致的。 我使用了kafka版本0.8.2。我使用的客户端API是包kafka.javaapi.producer.Producer。

答案 3 :(得分:2)

如果客户端无法达到kafka经纪商的BOTH主机名和IP,就会发生这种情况。

输入客户端\ etc \ hosts或C:\ Windows \ System32 \ drivers \ etc \ hosts,并为我解决了这个问题。

答案 4 :(得分:1)

我收到了来自apache kafka的错误:

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details

我的设置:

OS: Ubuntu 14.04
sbt: sbt launcher version 0.13.5
scala: Scala code runner version 2.9.2

能够使用以下命令修复它:

cd /home/el/apachekafka/kafka_2.10-0.8.1.1/libs
wget http://www.slf4j.org/dist/slf4j-1.7.7.tar.gz
tar -xvf slf4j-1.7.7.tar.gz
cd /home/el/apachekafka/kafka_2.10-0.8.1.1/libs/slf4j-1.7.7
cp slf4j-api-1.7.7.jar ..
cp slf4j-nop-1.7.7.jar ..

然后重新运行命令,生产者不会抛出任何错误。

答案 5 :(得分:1)

ForHDP kafka使用代理端口:6667

对于Standalone kafka使用代理端口:9092

错误是由于我们使用的端口号(HDP使用6667但我们使用的是9092)

bin / kafka-console-producer.sh --broker-list broker-ip:9092 - topic test // not working

bin / kafka-console-producer.sh --broker-list broker-ip:6667 - topic test // working

link:Kafka console producer Error in Hortonworks HDP 2.3 Sandbox

答案 6 :(得分:0)

不确定,但有一种可能性是该主题不是在Kafka上创建的。

检查kafka的网络用户界面并确保您使用的主题即&#34; page_visits&#34;发送数据是在那里创建的。

如果不是,使用GUI创建主题非常容易。