簡體   English   中英

Kafka ByteArrayDeserializer 讀取 Spark DStreams 中的 avro 消息

[英]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並且失敗了。

[BArray[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM