首页 > 解决方案 > 在 WSL2 中通过 IDE 连接到 kafka 服务器时出错

问题描述

我无法通过在 Windows 上运行的 intellij 或 vscode 连接到在 ubuntu 上运行的 kafka 服务器(我在 WSL2 上尝试过的第一台服务器)。我什至尝试使用虚拟机的 IP,但没有运气。据我了解,我们应该能够根据此文档https://docs.microsoft.com/en-us/windows/wsl/compare-versions使用“localhost”进行连接 我错过了什么吗?

这是我的代码

    Properties producerProperties = new Properties();
    producerProperties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    producerProperties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
    producerProperties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

    KafkaProducer<String, String> producer = new KafkaProducer<String, String>(producerProperties);

    ProducerRecord<String, String> record = new ProducerRecord<>("topic_1", "hello from java");
    producer.send(record);

    producer.flush();
    producer.close();

这是错误 错误日志

标签: apache-kafkawindows-subsystem-for-linux

解决方案


我有同样的问题,很难解决。当我在 WSL2 中发现这个已关闭但显然仍未解决的问题时,突破就来了。基本上,发生的事情是我无法从 Windows 10 中的 IntelliJ 访问 Ubuntu/WSL2 的 localhost。所以,当我在 Intellij 中编译并运行我的程序时,它给了我你发布的错误。

我的设置的一些细节:

操作系统:Windows 10,版本 2004(操作系统内部版本 19041.630)

我的 build.sbt:

scalaVersion := "2.12.10"

libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.0.1"
libraryDependencies += "org.apache.spark" %% "spark-streaming" % "3.0.1"
libraryDependencies += "org.apache.bahir" %% "spark-streaming-twitter" % "2.4.0"
libraryDependencies += "org.apache.httpcomponents" % "httpclient" % "4.5.12"
libraryDependencies += "commons-io" % "commons-io" % "2.8.0"
libraryDependencies += "org.apache.spark" % "spark-sql-kafka-0-10_2.12" % "3.0.1"

这是我尝试运行的 Scala 代码,它读取一个主题(快速启动事件)并发布到另一个主题(辅助输出):

package kafka

import org.apache.spark.sql.SparkSession

object kafkaRunner {
   def main(args: Array[String]): Unit = {
     val spark = SparkSession.builder()
       .appName("Kafka First App")
       .master("local[*]")
       .getOrCreate()

     import spark.implicits._

     val df = spark
       .readStream
       .format("kafka")
       .option("kafka.bootstrap.servers", "localhost:9092")
       .option("subscribe", "quickstart-events")
       .load()

     df
       .writeStream
       .format("kafka")
       .option("kafka.bootstrap.servers", "localhost:9092")
       .option("topic", "aux-output")
       .option("checkpointLocation", "/tmp/kafka-checkpoint")
       .start()
       .awaitTermination()
  }
}

我已经多次运行该程序并重新开始,我删除了 zookeeper 和 kafkas /tmp 文件。我不知道这些文件有多大价值,所以请谨慎行事。我删除了这三个目录:

  • /tmp/kafka-日志
  • /tmp/动物园管理员
  • /tmp/kafka-checkpoint (这是我在程序中设置的目录,你的可能不同,但是当我没有设置时 Spark 会抛出错误)。

接下来,我从 ubuntu 中的 Kafka 目录运行这些命令。每个都在一个单独的终端窗口中。

[terminal window 1 - zookeeper server]
bin/zookeeper-server-start.sh config/zookeeper.properties

[terminal window 2 - kafka server, **wait until zookeeper finishes loading before running**]
bin/kafka-server-start.sh config/server.properties

[terminal window 3 - create our 2 topics, then run the producer for **quickstart**]
(the following three commands were run in the same window)

bin/kaftopics.sh --create.sh --topic quickstart-events --bootstrap-server localhost:9092

bin/kaftopics.sh --create.sh --topic aux-output --bootstrap-server localhost:9092

bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092

[terminal window 4 - create a consumer for **quickstart** channel]
bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092

[terminal window 5 - create a consumer for **aux-out** channel]
bin/kafka-console-consumer.sh --topic aux-out --from-beginning --bootstrap-server localhost:9092

[terminal window 6 - use to run sbt]

我利用这段时间在生产者(窗口 3)中输入了一些行,并在快速启动消费者(窗口 4)中查找输出。aux-out(窗口 5)中不应显示任何内容,这将在程序在 sbt 中运行时生成。

然后我运行我的程序。我没有从 Windows 中移动我的项目,而是导航到 Ubuntu 中的 windows 目录 (/mnt/c/User/me/lots/of/dir/kafkaProject)。我从sbt目录开始build.sbt。加载后,我“sbt编译”和“运行”

它开始像火花作业一样处理,但随后文本开始飞逝。这是您应该在aux-out中看到来自快速入门主题输出的输入的时候。

在程序运行时,在窗口 3 的生产者中输入的文本应显示在 4 和 5 中。

我没有提到的一件事是,在尝试运行该程序几次但都失败后,我确实执行了“wsl.exe --shutdown”并重新启动了所有窗口以重新启动。如果您收到提示缺少主题的错误消息,请尝试更改主题名称并重新开始。我发现有时我以前​​使用过但不起作用的主题已损坏。我相信还有其他一些我尚未发现的临时文件正在缓存主题,但是一旦我开始工作,我就继续前进。

祝你好运!


推荐阅读