
# 运行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程序](https://support.huaweicloud.com/devg3-mrs/mrs_07_410123.html)。
**--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"。
   
 
