无法从我的虚拟机客户端连接到我的虚拟机上的kafka

时间:2014-02-27 12:09:51

标签: maven centos virtual-machine apache-zookeeper apache-kafka

目标:我正在尝试从java cleint向kafka发送消息 这真是一种痛苦..
让我简单介绍一下。

  1. 我在centos VM上安装了kafka。
  2. 我使用所有默认属性文件运行随附的zookeeper,服务器,生产者和客户端。
    我成功发送并收到了邮件。
  3. 我的计算机连接到zookeeper(2181)端口和VM的kafka服务器(9092)端口。
  4. 现在,我想编写java代码来向主题发送消息。 我使用网站快速入门的例子:

    Properties props = new Properties();
    props.put("zk.connect", "http://XX.XX.XX.XX:2181"); //  where X is the ip
    props.put("serializer.class", "kafka.serializer.StringEncoder");
    producer = new Producer<String, String>(new ProducerConfig(props));
    

    它在第四行失败,但有以下例外:

    kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries
    

    rg.I0Itec.zkclient.exception.ZkTimeoutException: Unable to connect to zookeeper server within timeout: 400
    

    问题。

    1. 例外。
      不好的参数:
      在kafka快速入门示例中,我看到它只需要zk.connect, serializer.class.,当我运行它时,它会在Producer的构造函数中需要metadata.broker.list。 可以?所以我觉得kafka服务器的ip和端口 和btw - 是zk.connect还是zookeeper连接?ZkTimeoutException:无法在超时内连接到zookeeper服务器:400

    2. maven bad versions
      我去了网站,我看到最新版本是kafka_2.8.0-0.8.0 问题1 - 我使用intelij下载它(我认为它是maven central) -
      我得到所有相关的罐子 - 只有卡夫卡罐子是空的(仅包含清单)。

      问题2 - 有更新版本,然后是网站中的版本。他们是官方的。
      无论如何,我下载了org.apache.kafka:kafka_2.10:0.8.0

    3. 使用wireshark我看到三个SYN&amp; ACK(三次握手)和然后FYN&amp; ACK
       之后。在动物园管理员的日志中,我看到以下内容   [2014-02-27 01:43:42,127]警告EndOfStreamException:无法从客户端sessionid 0x0读取其他数据,可能客户端已关闭套接字
        (org.apache.zookeeper.server.NIOServerCnxn)
        这意味着我关闭了连接。为什么?

2 个答案:

答案 0 :(得分:2)

Kafka 0.8不需要zk.connect参数。你可能跟着0.7 quickstart dodumentation。检查您正在使用的版本,即使您使用DONT属性中zk.connect需要“http”的旧0.7版本。将其删除为"xx.xxx.xx.xx:9092" ... ...应该只是

    props.put(“zk.connect”, “127.0.0.1:2181”);

对于0.8跟随this链接,生成器在这两个不同版本中的工作方式几乎没有变化。 如果您是Kafka的新手,那么您应该使用最新版本,因为那里有很多修复

答案 1 :(得分:1)

在我的情况下,我试图在云端服务中连接到HDP 2.2 Sandbox VM和Azure CentOS 6.6虚拟机上托管的代理,但无法连接。

我在Mac上运行了一个简单的Java示例(类似于问题中发布的代码段)。

最终对我有用的是将以下参数添加到./kafka/config/server.properties中:

advertised.host.name advertised.port

对于Azure,我必须指定云服务名称,例如:

advertised.host.name = my-cloud-service.cloudapp.net advertised.port = 6667

此外,对于Azure,我必须确保端口6667作为端点打开。

一旦我配置了这些,我就可以从我的工作站运行我的Java代码,并查看在VM上运行的消费者进程的输出。

让我得出这个结论的是以下网址:

https://cwiki.apache.org/confluence/display/KAFKA/FAQ

看看:为什么我的消费者/生产者不能连接到经纪人?