簡體   English   中英

帶有 Spark 3.0.1 結構化流的 Kafka:ClassException:org.apache.kafka.common.TopicPartition; class 對反序列化無效

[英]Kafka with Spark 3.0.1 Structured Streaming : ClassException: org.apache.kafka.common.TopicPartition; class invalid for deserialization

我正在嘗試使用 pyspark - 結構化流來讀取 google dataproc 中的 kafka 消息。

版本詳情如下:

  1. dataproc 映像版本是 2.0.0-RC22-debian10(要獲得 pyspark 3.0.1 版本和 delta Lake 0.7.0,因為我必須最終將此數據寫入托管在谷歌存儲上的 delta)
  2. pyspark 版本 3.0.1 和 pyspark 使用的 python 版本是 3.7.3
  3. 我使用的包是 org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.1
    io.delta:delta-core_2.12:0.7.0
    org.apache.spark:spark-avro_2.12:3.0.1

代碼片段是:

__my_dir = os.path.dirname("<directory_path>") 
jsonFormatSchema = open(os.path.join(__my_dir, 'avro_schema_file.avsc'), "r").read() 

df = spark \    
    .readStream \    
    .format("kafka") \   
    .option("kafka.bootstrap.servers", "<kafka_broker>") \   
    .option("subscribe", "<kafka_topic>") \    
    .option("startingOffsets", "latest") \    
    .load()\    
    .select(from_avro("value", jsonFormatSchema)
    .alias("element"))

df.printSchema()
 
df_output =     df.select("element.after.id","element.after.name","element.after.attribute","element.after.quantity")

StreamQuery = ( df_output.writeStream \ 
               .format("delta") \   
               .outputMode("append") \   
               .option("checkpointLocation","<check_point_location>") \   
               .trigger(once=True) \    
               .start("<target_delta_table>") \    )

我得到的錯誤是:

java.io.InvalidClassException: org.apache.kafka.common.TopicPartition;
class invalid for deserialization

為什么 spark 無法反序列化 TopicPartition,我該如何解決?

以下帖子幫助解決了這個問題: How to use Confluent Schema Registry with from_avro standard function?

另外,我們開始為kafka-client指向下面的jars

kafka-clients-2.4.1.jar

當您將 master 設置為local[*]時,錯誤消失。 無論如何,這個問題似乎與驅動程序和執行程序之間的 jar 沖突有關:它們使用不同版本的 kafka-clients 庫。

為了解決這個問題,您可能需要啟動作業

gcloud dataproc jobs submit spark \
 --class <YOUR_CLASS> \
 --jars target/scala-2.12/<COMPILED_JAR_FILE>.jar,kafka-clients-2.4.1.jar  \
 --cluster <CLUSTER_NAME> \
 --region= <YOUR_REGION> \
 --properties spark.jars.packages=org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.1,spark.executor.extraClassPath=org.apache.kafka_kafka-clients-2.4.1.jar,spark.driver.extraClassPath=org.apache.kafka_kafka-clients-2.4.1.jar

這適用於我的情況。 有關版本的更多詳細信息,請查看https://mvnrepository.com/artifact/org.apache.spark/spark-sql-kafka-0-10_2.12/3.0.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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