Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Akka Stream Kafka:找不到密钥';卡夫卡客户';_Scala_Apache Kafka_Akka_Akka Stream_Alpakka - Fatal编程技术网

Scala Akka Stream Kafka:找不到密钥';卡夫卡客户';

Scala Akka Stream Kafka:找不到密钥';卡夫卡客户';,scala,apache-kafka,akka,akka-stream,alpakka,Scala,Apache Kafka,Akka,Akka Stream,Alpakka,我正在尝试使用创建一个简单的原型 在运行应用程序时,我遇到以下错误: com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'kafka-clients' 我在/src/main/scala/App.scala中有以下代码: import akka.Done import akka.actor.ActorSystem import akka.kafka.ProducerSettin

我正在尝试使用创建一个简单的原型

在运行应用程序时,我遇到以下错误:

com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'kafka-clients'
我在
/src/main/scala/App.scala
中有以下代码:

import akka.Done
import akka.actor.ActorSystem
import akka.kafka.ProducerSettings
import akka.kafka.scaladsl.Producer
import akka.stream.{ActorMaterializer, Materializer}
import akka.stream.scaladsl.Source
import com.typesafe.config.ConfigFactory
import org.apache.kafka.clients.producer.ProducerRecord
import org.apache.kafka.common.serialization.StringSerializer

import scala.concurrent.Future

object App {
  def main(args: Array[String]): Unit = {
    println("Hello from producer")

    implicit val system = ActorSystem("fakeProducer")
    implicit val materializer: Materializer = ActorMaterializer()

    val config = system.settings.config // ConfigFactory.load()

    val producerSettings =
      ProducerSettings(config, new StringSerializer, new StringSerializer)
      .withBootstrapServers("localhost:9092")

    val done: Future[Done] =
      Source(1 to 100)
        .map(_.toString)
        .map(value => new ProducerRecord[String, String]("test-basic-numbers", value))
        .runWith(Producer.plainSink(producerSettings))


    println("Done")
  }
}
以下
build.sbt

name := "test-akka-stream"

version := "0.1"

scalaVersion := "2.11.8"

libraryDependencies += "com.typesafe.akka" %% "akka-stream-kafka" % "0.21.1"
我使用
sbt run
运行应用程序。我还没有配置任何uber/assembly jar

我可能错过了一些明显的东西,但我看不到。。。我怀疑akka依赖项存在一些问题

更新 正如@terminally chill调用
ProducerSettings(系统、新StringSerializer、新StringSerializer)
所建议的那样(传递
ActorSystem
而不是配置)解决了问题。我只是不明白这是设计还是一个bug

更新2 我已经创建了一个已修复的。现在,文档更加准确,并解释了创建
ProducerSettings
/
ConsumerSettings
的正确方法

val config = system.settings.config.getConfig("akka.kafka.producer")
val producerSettings =
      ProducerSettings(config, new StringSerializer, new StringSerializer)
      .withBootstrapServers("localhost:9092")

或者你可以像上面解释的那样传递
ActorSystem

通常我会将所有配置保存在AkkaSystem实例中。我没有将Alpakka用于Kafka,但我的许多实现都基于源代码

使用
val config=ConfigFactory.Load()
加载typesafe配置对象,然后将
config
传递到
val system=ActorSystem(“fakeProducer”,config)

最后,将
system.settings.config
传递到
ProducerSettings

val config = system.settings.config.getConfig("akka.kafka.producer")
val producerSettings =
      ProducerSettings(config, new StringSerializer, new StringSerializer)
      .withBootstrapServers("localhost:9092")

您当前的代码未通过任何设置,因为您尚未将配置加载到Akka系统中。您的
val config=system.settings.config
引用了一个空配置,它没有卡夫卡客户端部分(最佳猜测)。

我想我遇到了与您相同的问题(几乎在同一时间),尽管我正试图创建一个基本的“hello world”卡夫卡消费者而不是制作人。我猜您只是浏览了中的文档,并遵循了他们最初定义的示例

val config = system.settings.config
然后将其传递到新的ConsumerSettings对象中。我猜在线文档有一个缺陷,但我对Akka Streams还不够熟悉(这是我第一次尝试通过示例学习),我没有资格准确判断什么是对的,什么是错的

我曾尝试创建和application.conf文件,然后执行ConfigFactory.load(),然后在创建时手动将其传递给ActorSystem,然后将该系统传递给ConsumerSettings构造函数,丢失的“kafka客户端”错误消失了,但显然我甚至不必这样做。正如您所说,只需传递'system'变量而不是'config'变量就可以了


希望这能帮助那些在黑暗中摸索的人。我要说的是,尽管Akka Streams周围有很多嗡嗡声,但似乎确实缺少文档。一旦我弄明白这些东西,我可能不得不写一篇博客文章

感谢@terminally chill和@murray todd williams的回答。我做了一些进一步的研究,并尝试在这里总结:

消费者设置
生产者设置
都具有
应用
功能,这些功能采用
配置
(请参阅)或
操作系统
(请参阅)

问题在于,当使用
ActorSystem
时,代码是:

val config = system.settings.config.getConfig("akka.kafka.consumer")
apply(config, keyDeserializer, valueDeserializer) // call the other overload
val properties = ConfigSettings.parseKafkaClientsProperties(config.getConfig("kafka-clients"))
使用
Config
时,代码为:

val config = system.settings.config.getConfig("akka.kafka.consumer")
apply(config, keyDeserializer, valueDeserializer) // call the other overload
val properties = ConfigSettings.parseKafkaClientsProperties(config.getConfig("kafka-clients"))
因此,当直接传递配置时,代码将搜索
kafka客户端
属性,而不是传递
ActorSystem
时,代码将检查
akka.kafka.consumer/akka.kafka.producer

最后考虑在创建<代码> ActoStices < /Calp>实例时,默认情况下,大多数设置都是从嵌入式<代码>参考.CONF文件加载的,并与您的代码>应用程序合并。CONF文件。更多信息。 因此,基本上唯一需要设置的属性通常是

bootstrap.servers

因此,您现在可以理解为什么使用
system.settings.config
时代码不起作用。此配置实例已加载
reference.conf
(使用所有默认值,请参阅)和自定义
application.conf
kafka clients
属性位于
akka.kafka.consumer/akka.kafka.producer
内,但代码直接检查
kafka客户端

一些可能的解决办法:

  • 使用另一个重载直接传递
    ActorSystem
  • 使用
    system.settings.config.getConfig(“akka.kafka.consumer”)
  • 使用
    kafka客户机
    部分手动构造一个
    Config
    实例
对我来说,问题在于提供的官方文件没有提到这些差异,并且提供的示例不完整和/或不精确。对于Akka专家来说,这一点可能很清楚,但对于新开发人员来说,这可能会非常混乱


我已经创建了一个更易于使用的示例,并打开了一个。

感谢您注意到并提交了Alpakka-Kafka连接器项目中的一个问题。
文档现已更新:

您是否定义了卡夫卡消费者配置。如本文所述,
application.conf
文件在哪里?它看起来是什么样子?@terminally chill我试图创建
src/main/resources/application.conf
,并定义了相同的内容。但是错误是一样的。@Nio现在我只想试试producer(我只想写一个卡夫卡主题)。我不需要消费者配置,对吗?如果不将配置对象传递给ProducerSettings apply方法,是否会得到相同的异常?它应该采取(ActorSystem,Serializer,Serializer)感谢您的信息,我已经做了一些进一步的调查,请参阅我的答案:。我完全同意你的看法,文件很糟糕。请帮忙