【问题标题】:Apache Spark could not deserialize `TopicPartition` on clusterApache Spark 无法反序列化集群上的“TopicPartition”
【发布时间】:2019-06-14 04:05:51
【问题描述】:

我使用 spark-sql-kafka-0-10 使用 Spark 2.4 和 scala 2.11.12 从 kafka 读取批处理。所以我的build.sbt 文件具有以下依赖项。

"org.apache.spark"  %% "spark-core" % sparkVersion % "provided",
"org.apache.spark"  %% "spark-sql" % sparkVersion % "provided",
"org.apache.spark"  %% "spark-sql-kafka-0-10" % sparkVersion

我还使用sbt-assembly 插件来制作我的应用程序的胖罐。在本地 spark 上部署这个 jar 文件时效果很好,如下所示 $FAT_JAR 指向我的程序集文件:

./spark-submit --class $MAIN_CLASS --master local --driver-class-path $FAT_JAR $FAT_JAR

但是当我在集群上部署它时(即使worker和master都在同一台机器上)它会抛出关于TopicPartiton的反序列化问题的异常。

我如何在集群上运行:

./spark-submit \
  --master spark://spark-master:7077 \
  --class $MAIN_CLASS \
  --driver-class-path $FAT_JAR \
  --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.0 \
  $FAT_JAR

我也试过--jars,我确信worker和master有kafka-client的保存版本2.0.0

异常日志:

Caused by: java.io.InvalidClassException: org.apache.kafka.common.TopicPartition; class invalid for deserialization
        at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:169)
        at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:874)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2043)

为什么 spark 无法反序列化 TopicPartition,我该如何解决?

【问题讨论】:

  • 你是在驱动节点还是其他节点上得到这个?他们都使用相同的JVM(版本)吗?

标签: apache-spark apache-spark-sql


【解决方案1】:

我找到了解决方案。 正如我将SPARK_DIST_PATH 设置为$(hadoop classpath) 一样,它包括kafka-client-0.8,它与kafka-client-2.0.0 中使用的spark-sql-kafka-0-10 不同。 我刚刚使用了包含 hadoop 的 spark 版本并取消设置 SPARK_DIST_PATH 来解决它。

无论如何,我希望spark.executor.userClassPathFirstspark.driver.userClassPathFirst 有助于解决这个问题,但现在它们是实验性的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多