![](/img/trans.png)
[英]Spark Streaming Kafka: ClassNotFoundException for ByteArrayDeserializer when run with spark-submit
[英]Kafka ByteArrayDeserializer to read avro messages in Spark DStreams
我正在尝试使用 Kafka ByteArrayDeserializer 从 Kafka 主题中读取 avro 记录。 但低于例外。
Caused by: java.lang.ClassCastException: [B cannot be cast to java.lang.String
我的代码:
val ssc = new StreamingContext(spark.sparkContext, Seconds(1))
val kafkaParams: Map[String, Object] = Map(
"bootstrap.servers" -> "kafka-server:9092",
"key.serializer" -> classOf[StringSerializer],
"value.serializer" -> classOf[StringSerializer],
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[ByteArrayDeserializer],
"auto.offset.reset" -> "earliest",
"enable.auto.commit" -> (false: java.lang.Boolean),
"security.protocol" -> "SSL",
"ssl.truststore.location" -> "truststore",
"ssl.truststore.password" -> "pass",
"ssl.keystore.location" -> "keystore.jks",
"ssl.keystore.password" -> "pass",
"group.id" -> "group1"
)
val topics: Array[String] = Array("topics")
val kafkaDstream = KafkaUtils.createDirectStream(
ssc,
LocationStrategies.PreferConsistent,
ConsumerStrategies.Subscribe[String, String](topics, kafkaParams)
)
val schema = parser.parse(new String(Files.readAllBytes(Paths.get("avro2.avsc"))))
val datumReader = new SpecificDatumReader[GenericRecord](schema)
val processedStream = kafkaDstream.map(record => {
val x = new ByteArrayInputStream(record.value().getBytes()) // throwing exception here
val binaryDecoder = DecoderFactory.get.binaryDecoder(x, null)
datumReader.read(null, binaryDecoder)
})
processedStream.map(rec => rec.get("taskId")).print
任何帮助都很感激。
谢谢你。
您正在使用Subscribe[String, String]
。
你想要Subscribe[String, Array[Byte]]
然后record.value()
已经是一个字节数组,没有 getBytes 方法
引起:java.lang.ClassCastException:[B 无法转换为 java.lang.String
这个异常是说有一个 object 类型[B
被转换为java.lang.String
并且失败了。
[B
是Array[Byte]
的字符串表示形式:
jshell> byte[] bytes = new byte[10]
bytes ==> byte[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
jshell> bytes.toString()
$2 ==> "[B@6e8cf4c6"
“为什么会发生这种事?” 你问。 这是因为以下行(默默地)假设您正在做的任何事情都可以是String
。
val x = new ByteArrayInputStream(record.value().getBytes()) // throwing exception here
请改用Spark Structured Streaming 。 你不会后悔这个决定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.