目录
一、查看自己的运行入口
二、spark程序内部排查
2.1查看配置类
2.2 如果存在外部环境引入,引入的路径是否正确
三、jar包是否打对
在运行spark程序的时候,总是报这个错误java.lang.ClassNotFoundException,折磨了我一整天。
现在我解决了这个bug。我就想总结一下遇到这个情况如何排查它。
一、查看自己的运行入口
${SPARK_HOME}/bin/spark-submit #spark指令
--jars /usr/local/hive/auxlib/hudi-spark-bundle_2.11-0.5.2-incubating.jar #加载的jar包
--conf spark.sql.hive.convertmetastoreParquet=false
--conf spark.executor.heartbeatInterval=120s
--conf spark.network.timeout=600s
--conf spark.sql.catalogImplementation=hive
--conf spark.yarn.submit.waitAppCompletion=false
--name lr
--conf spark.task.cpus=1
--conf spark.executor.cores=4
--conf spark.sql.shuffle.partitions=50
--master yarn
--deploy-mode client
--driver-memory 512M
--executor-memory 3G
--num-executors 1
--class com.qf.bigata.LRClass #这里非常重要,就是类的路径,要正确
/data/jar/recommend-test-1.0.jar #这是本地虚拟机里面要运行的jar包,名字不要出错!
-e prod -x root
${SPARK_HOME}/bin/spark-submit #spark指令
--jars /usr/local/hive/auxlib/hudi-spark-bundle_2.11-0.5.2-incubating.jar #加载的jar包
--conf spark.sql.hive.convertmetastoreParquet=false
--conf spark.executor.heartbeatInterval=120s
--conf spark.network.timeout=600s
--conf spark.sql.catalogImplementation=hive
--conf spark.yarn.submit.waitAppCompletion=false
--name lr
--conf spark.task.cpus=1
--conf spark.executor.cores=4
--conf spark.sql.shuffle.partitions=50
--master yarn
--deploy-mode client
--driver-memory 512M
--executor-memory 3G
--num-executors 1
--class com.qf.bigata.LRClass #这里非常重要,就是类的路径,要正确
/data/jar/recommend-test-1.0.jar #这是本地虚拟机里面要运行的jar包,名字不要出错!
-e prod -x root
其实我就是jar名字多打了一个.,就是一个小黑点导致我卡了一天。
二、spark程序内部排查
2.1查看配置类
下面要重点关注ip号和端口号是否正确,然后解析的类名有没有写对。
package com.qf.bigata.conf
import org.slf4j.LoggerFactory
case class Config(
env:String = "",
hbaseZK:String = "192.168.10.101",
hbasePort:String = "2181",
hFileTmpPath:String = "/tmp/hFile",
tableName:String = "",
irisPath:String = "",
proxyUser:String = "root",
topK:Int = 10
)
object Config {
private val logger = LoggerFactory.getLogger(Config.getClass.getSimpleName)
def parseConfig(obj: Object, args: Array[String]): Config = {
//1. 获取到程序名称
val programName = obj.getClass.getSimpleName.replace("$", "")
//2. 类似于getopts命令
//2.1 得到解析器
val parser = new scopt.OptionParser[Config](s"ItemCF ${programName}") {
head(programName, "v1.0")
opt[String]('e', "env").required().action((x, config) => config.copy(env = x)).text("dev or prod")
opt[String]('x', "proxyUser").required().action((x, config) => config.copy(proxyUser = x)).text("proxy username")
opt[String]('z', "hbaseZK").optional().action((x, config) => config.copy(hbaseZK = x)).text("hbaseZK")
opt[String]('p', "hbasePort").optional().action((x, config) => config.copy(hbasePort = x)).text("hbasePort")
opt[String]('f', "hFileTmpPath").optional().action((x, config) => config.copy(hFileTmpPath = x)).text("hFileTmpPath")
opt[String]('t', "tableName").optional().action((x, config) => config.copy(tableName = x)).text("tableName")
opt[Int]('k', "topK").optional().action((x, config) => config.copy(topK = x)).text("topK")
programName match {
case "ItemCF" => logger.info(s"ItemCF is staring ---------------------------->")
case "AlsCF" => logger.info(s"AlsCF is staring ---------------------------->")
case "ItembaseFeature" => logger.info(s"ItembaseFeature is staring ---------------------------->")
case "UserbaseFeature" => logger.info(s"UserbaseFeature is staring ---------------------------->")
case "ArticleEmbedding" => logger.info(s"ArticleEmbedding is staring ---------------------------->")
case "LRClass" => logger.info(s"LRClass is staring ---------------------------->")
case _ =>
}
}
//2.2 解析
parser.parse(args, Config()) match {
case Some(conf) => conf
case None => {
logger.error(s"cannot parse args")
System.exit(-1)
null
}
}
}
}
2.2 如果存在外部环境引入,引入的路径是否正确
就如上图如果有环境,也要仔细核对路径。
三、jar包是否打对
打了没有依赖的jar,找不到文件是真的很正常咯。
看我的jar包邮两个dependencise,至于上面第二个jar包,我一开始是使用这个,但是配置文件总是少了一行。非要我自己把正确的代码添加上,真的太麻烦了。
然后我就使用最后一个dependencise,发现配置文件没有少那个代码。
打错jar包,其实也会有报错找不到文件。我的虚拟机重启过没有报错日志。(真的发现跑本地模式没开集群模式,不开yarn,yarn就真的不跑了,连错误日志都不打了。)
下面这个就是我之前打错jar报错截图。
上传到服务器中的jar说明_林柚晞的博客-CSDN博客



