【问题标题】:Error connecting to kafka server via IDE in WSL2在 WSL2 中通过 IDE 连接到 kafka 服务器时出错
【发布时间】:2020-06-22 09:17:11
【问题描述】:

我无法通过在 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-kafka windows-subsystem-for-linux


    【解决方案1】:

    您需要将代码中的 localhost 替换为 0.0.0.0(所有 IP)

    像这样:

    producerProperties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "0.0.0.0:9092");

    这在您链接的“其他网络注意事项”部分中进行了说明。

    【讨论】:

    • 试过了,没用。我猜它与防火墙有关
    • 好吧,我想我误解了你想要做什么。暂时将 localhost:9092 留在您的代码中。问题是您如何在 WSL2 中运行 kafkaserver。需要绑定到 0.0.0.0 的是服务器。
    【解决方案2】:

    我有同样的问题,很难解决。当我发现这个closed, but apparently still broken, issue in 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-logs
    • /tmp/zookeeper
    • /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 (window 5) 中不应该显示任何内容,这将在程序在 sbt 中运行时生成。

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

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

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

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 2012-09-06
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 2020-08-09
      • 2015-07-02
      • 2011-06-29
      相关资源
      最近更新 更多