获取" org.apache.kafka.common.network.InvalidReceiveException:无效接收(大小= 1195725856大于104857600)"

时间:2018-03-19 19:31:00

标签: apache-kafka

我已经安装了zookeeper和kafka, 第一步 : 通过以下命令运行zookeeper:

bin/zkServer.sh start
bin/zkCli.sh
第二步: 运行kafka服务器

bin/kafka-server-start.sh config/server.properties

kafka应该在localhost:9092

运行

但是我收到以下错误:

WARN Unexpected error from /0:0:0:0:0:0:0:1; closing connection (org.apache.kafka.common.network.Selector)
org.apache.kafka.common.network.InvalidReceiveException: Invalid receive (size = 1195725856 larger than 104857600)

我关注以下链接: Link1 Link2

我是kafka的新手,请帮我设置。

6 个答案:

答案 0 :(得分:17)

1195725856被GET[space]编码为大字节序的四字节整数(有关其工作原理的更多信息,请参见here)。这表明HTTP流量正在发送到Kafka端口9092,但是Kafka不接受HTTP流量,它仅接受自己的协议(将前四个字节作为接收大小,因此会出现错误)。

由于错误是在启动时收到的,因此它可能是良性的,并且可能表明网络扫描端口上的扫描服务或类似服务具有Kafka无法理解的协议。

为了找到原因,您可以使用tcpdump查找HTTP流量来自何处:

tcpdump -i any -w trap.pcap dst port 9092
# ...wait for logs to appear again, then ^C...
tcpdump -qX -r trap.pcap | less +/HEAD

总的来说,这可能很烦人但无害。至少Kafka实际上并没有分配/弄脏内存。 :-)

答案 1 :(得分:6)

尝试将socket.request.max.bytes文件中的$KAFKA_HOME/config/server.properties值重置为超出数据包大小的值,然后重新启动kafka服务器。

答案 2 :(得分:1)

很可能您正在尝试连接到非SSL侦听器。 如果使用端口的默认代理,则需要验证:9092是该代理上的SSL侦听器端口。

例如

listeners=SSL://:9092
advertised.listeners=SSL://:9092
inter.broker.listener.name=SSL

应该为您解决问题(确保在重新配置这些属性后重新启动Kafka)。

或者,您可能正在尝试接收太大的请求。最大大小是socket.request.max.bytes的默认大小,即100MB。因此,如果收到的消息大于100MB,请尝试增加server.properties下此变量的值。

答案 3 :(得分:1)

这是在安装Kafka,ELK和Kafdrop设置后解决此问题的方法:

  1. 首先逐个停止与Kakfa交互的每个应用程序 跟踪有问题的服务。

  2. 解决该应用程序的问题。

在我的设置中是Metricbeats。

通过编辑位于modules.d子文件夹中的Metricbeats kafka.yml设置文件来解决该问题:

  1. 确保server.properties中的Kafka advertised.listener为 在hosts属性中引用。

  2. 取消注释指标集和client_id属性。

生成的kafka.yml如下:

# Module: kafka
# Docs: https://www.elastic.co/guide/en/beats/metricbeat/7.6/metricbeat-module-kafka.html

# Kafka metrics collected using the Kafka protocol
- module: kafka
  metricsets:
    - partition
    - consumergroup
period: 10s
hosts: ["[your advertised.listener]:9092"]

client_id: metricbeat

答案 4 :(得分:0)

答案最有可能在两个区域之一

a。 socket.request.max.bytes

b。您也使用非SSL端点来连接生产者和使用者。

注意:您运行它的端口确实没有关系。确保如果您有ELB,ELB会返回所有运行状况检查,以确保成功。

就我而言,我在AWS KAFKA前面有一个AWS ELB。我已将Listernet协议指定为TCP而不是安全TCP。这引起了问题。

#listeners=PLAINTEXT://:9092
inter.broker.listener.name=INTERNAL
listeners=INTERNAL://:9093,EXTERNAL://:9092
advertised.listeners=EXTERNAL://<AWS-ELB>:9092,INTERNAL://<EC2-PRIVATE-DNS>:9093

listener.security.protocol.map =内部:SASL_PLAINTEXT,外部:SASL_PLAINTEXT    sasl.enabled.mechanisms =普通    sasl.mechanism.inter.broker.protocol = PLAIN

这是我的producer.properties和Consumer.properties的摘录,用于外部测试

bootstrap.servers=<AWS-ELB>:9092
security.protocol=SASL_SSL
sasl.mechanism=PLAIN

答案 5 :(得分:0)

就我而言,其他一些应用程序已经在向端口 9092 发送数据,因此服务器启动失败。关闭应用程序解决了这个问题。