更新时间:2024-08-05 GMT+08:00

运行SparkStreamingKafka样例工程时报“类不存在”问题

问题

通过spark-submit脚本提交KafkaWordCount(org.apache.spark.examples.streaming.KafkaWordCount)任务时,日志中报Kafka相关的类不存在的错误。KafkaWordCount样例为Spark开源社区提供的。

回答

Spark部署时,如下jar包存放在客户端的“${SPARK_HOME}/jars/streamingClient010”目录以及服务端的“${BIGDATA_HOME}/FusionInsight_Spark2x_8.1.0.1/install/FusionInsight-Spark2x-3.1.1/spark/jars/streamingClient010”目录:

  • kafka-clients-xxx.jar
  • kafka_2.12-xxx.jar
  • spark-streaming-kafka-0-10_2.12-3.1.1-hw-ei-311001-SNAPSHOT.jar
  • spark-token-provider-kafka-0-10_2.12-3.1.1-hw-ei-311001-SNAPSHOT.jar

由于“$SPARK_HOME/jars/streamingClient010/*”默认没有添加到classpath,所以需要手动配置。

在提交应用程序运行时,在命令中添加如下参数即可,详细示例可参考在Linux环境中编包并运行Spark程序

--jars $SPARK_CLIENT_HOME/jars/streamingClient010/kafka-client-2.4.0.jar,$SPARK_CLIENT_HOME/jars/streamingClient010/kafka_2.12-*.jar,$SPARK_CLIENT_HOME/jars/streamingClient010/spark-streaming-kafka-0-10_2.12-3.1.1-hw-ei-311001-SNAPSHOT.jar

用户自己开发的应用程序以及样例工程都可使用上述命令提交。

但是Spark开源社区提供的KafkaWordCount等样例程序,不仅需要添加--jars参数,还需要配置其他,否则会报“ClassNotFoundException”错误,yarn-client和yarn-cluster模式下稍有不同。

  • yarn-client模式下

    在除--jars参数外,在客户端“spark-defaults.conf”配置文件中,将“spark.driver.extraClassPath”参数值中添加客户端依赖包路径,如“$SPARK_HOME/jars/streamingClient010/*”

  • yarn-cluster模式下

    除--jars参数外,还需要配置其他,有三种方法任选其一即可,具体如下:

    • 在客户端spark-defaults.conf配置文件中,在“spark.yarn.cluster.driver.extraClassPath”参数值中添加服务端的依赖包路径,如“${BIGDATA_HOME}/FusionInsight_Spark2x_8.1.0.1/install/FusionInsight-Spark2x-3.1.1/spark/jars/streamingClient010/*”
    • 将各服务端节点的“original-spark-examples_2.12-3.1.1-xxx.jar”包删除。
    • 在客户端“spark-defaults.conf”配置文件中,修改或增加配置选项“spark.driver.userClassPathFirst” = “true”