我使用spark streaming'org.apache.spark:spark-streaming_2.10:1.6.1'和'org.apache.spark:spark-streaming-kafka_2.10:1.6.1'连接到kafka经纪人版本0.10.0.1。当我尝试这段代码时:
def messages = KafkaUtils.createDirectStream(jssc,
String.class,
String.class,
StringDecoder.class,
StringDecoder.class,
kafkaParams,
topicsSet)
我收到了这个例外:
INFO consumer.SimpleConsumer: Reconnect due to socket error: java.nio.channels.ClosedChannelException
Exception in thread "main" org.apache.spark.SparkException: java.nio.channels.ClosedChannelException
org.apache.spark.SparkException: Couldn't find leader offsets for Set([stream,0])
at org.apache.spark.streaming.kafka.KafkaCluster$$anonfun$checkErrors$1.apply(KafkaCluster.scala:366)
at org.apache.spark.streaming.kafka.KafkaCluster$$anonfun$checkErrors$1.apply(KafkaCluster.scala:366)
at scala.util.Either.fold(Either.scala:97)
at org.apache.spark.streaming.kafka.KafkaCluster$.checkErrors(KafkaCluster.scala:365)
at org.apache.spark.streaming.kafka.KafkaUtils$.getFromOffsets(KafkaUtils.scala:222)
at org.apache.spark.streaming.kafka.KafkaUtils$.createDirectStream(KafkaUtils.scala:484)
at org.apache.spark.streaming.kafka.KafkaUtils$.createDirectStream(KafkaUtils.scala:607)
at org.apache.spark.streaming.kafka.KafkaUtils.createDirectStream(KafkaUtils.scala)
at org.apache.spark.streaming.kafka.KafkaUtils$createDirectStream.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at com.privowny.classification.jobs.StreamingClassification.main(StreamingClassification.groovy:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
我试图在这个网站上搜索一些答案,但似乎没有答案,你能给我一些建议吗?主题stream
不为空。
答案 0 :(得分:2)
根据经验,我知道可能导致此错误消息的一件事是,如果Spark驱动程序无法使用代理的广告主机名(advertised.host.name
中的server.properties
)访问kafka代理。即使spark配置使用不同的地址识别kafka代理也是如此。所有经纪人公布的主机名必须可以从Spark驱动程序访问。
这发生在我身上,因为集群在一个单独的AWS账户中运行,经纪人使用内部DNS记录识别自己,这些必须被复制到其他AWS账户。在此之前,我收到此错误消息,因为Spark驱动程序无法访问代理以询问其最新的偏移量,即使我们在spark配置中使用代理的私有IP地址。
希望能有所帮助。
答案 1 :(得分:2)
我也遇到过这个问题。所以你必须改变Kafka上的一些配置。
转到Kafka配置并配置listeners
;
在“套接字服务器设置”部分中,格式为:
listeners=PLAINTEXT://[hostname or IP]:[port]
例如:
listeners=PLAINTEXT://192.168.1.24:9092
答案 2 :(得分:0)
我是从HDP运行kafka,所以默认端口是6667而不是9092,当我将bootstrap.servers
的端口切换为<hostname>:6667
时,问题就解决了。