运行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-clients-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”。