Spark JobServer JDBC-ClassNotFound 错误
Spark JobServer JDBC-ClassNotFound error
我有:
- Hadoop
- Spark 作业服务器
- SQL 数据库
我已经创建了一个文件来从 Spark JobServer 的本地实例访问我的 SQL 数据库。为此,我首先必须使用以下命令加载我的 JDBC-驱动程序:Class.forName("com.mysql.jdbc.Driver");
。但是,当我尝试在 Spark JobServer 上执行该文件时,出现 classNotFound 错误:
"message": "com.mysql.jdbc.Driver",
"errorClass": "java.lang.ClassNotFoundException",
我读到要加载 JDBC 驱动程序,您必须更改 Spark JobServer 的 application.conf 文件或其 server_start.sh 文件中的一些配置。我这样做如下。在 server_start.sh 中,我更改了作为 spark-submit 命令发送的 cmd 值:
cmd='$SPARK_HOME/bin/spark-submit --class $MAIN --driver-memory $JOBSERVER_MEMORY
--conf "spark.executor.extraJavaOptions=$LOGGING_OPTS spark.executor.extraClassPath = hdfs://quickstart.cloudera:8020/user/cloudera/mysql-connector-java-5.1.38-bin.jar"
--driver-java-options "$GC_OPTS $JAVA_OPTS $LOGGING_OPTS $CONFIG_OVERRIDES"
--driver-class-path "hdfs://quickstart.cloudera:8020/user/cloudera/mysql-connector-java-5.1.38-bin.jar"
--jars "hdfs://quickstart.cloudera:8020/user/cloudera/mysql-connector-java-5.1.38-bin.jar"
$@ $appdir/spark-job-server.jar $conffile'
我还更改了启动实例时使用的 Spark JobServer 的 application.conf 文件的一些行:
# JDBC driver, full classpath
jdbc-driver = com.mysql.jdbc.Driver
# dependent-jar-uris = ["hdfs://quickstart.cloudera:8020/user/cloudera/mysql-connector-java-5.1.38-bin.jar"]
但是JDBCclass找不到的错误还是回来了
已检查是否存在以下错误:
错误 1:
如果有人认为我只是有错误的文件路径(据我所知这很可能是这种情况),我已经使用 hadoop fs -ls hdfs://quickstart.cloudera:8020/user/cloudera/
检查了 HDFS 上的正确文件并且该文件在那里:
-rw-r--r-- 1 cloudera cloudera 983914 2016-01-26 02:23 hdfs://quickstart.cloudera:8020/user/cloudera/mysql-connector-java-5.1.38-bin.jar
错误 2:
我在我的 build.sbt 文件中加载了必要的依赖项:libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.+"
和我的 scala 文件中的导入命令 import java.sql._
.
如何解决这个 ClassNotFound 错误?
JDBC 有什么好的替代方法来连接到 SQL 吗?
我已经使用 sbt assembly 打包了项目,它终于成功了,我很高兴。
但是在您的 dependent-jar-uri 中使用 HDFS 文件实际上是行不通的。所以不要使用 HDFS links 作为你的 dependent-jar-uris.
此外,如果您好奇,请阅读此 link:https://github.com/spark-jobserver/spark-jobserver/issues/372
我们在 local.conf
中有类似的东西
# JDBC driver, full classpath
jdbc-driver = org.postgresql.Driver
# Directory where default H2 driver stores its data. Only needed for H2.
rootdir = "/var/spark-jobserver/sqldao/data"
jdbc {
url = "jdbc:postgresql://dbserver/spark_jobserver"
user = "****"
password = "****"
}
dbcp {
maxactive = 20
maxidle = 10
initialsize = 10
}
在启动脚本中我有
EXTRA_JARS="/opt/spark-jobserver/lib/*"
CLASSPATH="$appdir:$appdir/spark-job-server.jar:$EXTRA_JARS:$(dse spark-classpath)"
Spark Jobserver使用的所有依赖文件都放在/opt/spark-jobserver/lib
我没有使用 HDFS 为 job-server 加载 jar。
但是如果您需要 mysql 驱动程序加载到 spark worker 节点上,那么您应该通过 dependent-jar-uris 来完成。我想这就是你现在正在做的事情。
我有: - Hadoop - Spark 作业服务器 - SQL 数据库
我已经创建了一个文件来从 Spark JobServer 的本地实例访问我的 SQL 数据库。为此,我首先必须使用以下命令加载我的 JDBC-驱动程序:Class.forName("com.mysql.jdbc.Driver");
。但是,当我尝试在 Spark JobServer 上执行该文件时,出现 classNotFound 错误:
"message": "com.mysql.jdbc.Driver",
"errorClass": "java.lang.ClassNotFoundException",
我读到要加载 JDBC 驱动程序,您必须更改 Spark JobServer 的 application.conf 文件或其 server_start.sh 文件中的一些配置。我这样做如下。在 server_start.sh 中,我更改了作为 spark-submit 命令发送的 cmd 值:
cmd='$SPARK_HOME/bin/spark-submit --class $MAIN --driver-memory $JOBSERVER_MEMORY
--conf "spark.executor.extraJavaOptions=$LOGGING_OPTS spark.executor.extraClassPath = hdfs://quickstart.cloudera:8020/user/cloudera/mysql-connector-java-5.1.38-bin.jar"
--driver-java-options "$GC_OPTS $JAVA_OPTS $LOGGING_OPTS $CONFIG_OVERRIDES"
--driver-class-path "hdfs://quickstart.cloudera:8020/user/cloudera/mysql-connector-java-5.1.38-bin.jar"
--jars "hdfs://quickstart.cloudera:8020/user/cloudera/mysql-connector-java-5.1.38-bin.jar"
$@ $appdir/spark-job-server.jar $conffile'
我还更改了启动实例时使用的 Spark JobServer 的 application.conf 文件的一些行:
# JDBC driver, full classpath
jdbc-driver = com.mysql.jdbc.Driver
# dependent-jar-uris = ["hdfs://quickstart.cloudera:8020/user/cloudera/mysql-connector-java-5.1.38-bin.jar"]
但是JDBCclass找不到的错误还是回来了
已检查是否存在以下错误:
错误 1:
如果有人认为我只是有错误的文件路径(据我所知这很可能是这种情况),我已经使用 hadoop fs -ls hdfs://quickstart.cloudera:8020/user/cloudera/
检查了 HDFS 上的正确文件并且该文件在那里:
-rw-r--r-- 1 cloudera cloudera 983914 2016-01-26 02:23 hdfs://quickstart.cloudera:8020/user/cloudera/mysql-connector-java-5.1.38-bin.jar
错误 2:
我在我的 build.sbt 文件中加载了必要的依赖项:libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.+"
和我的 scala 文件中的导入命令 import java.sql._
.
如何解决这个 ClassNotFound 错误? JDBC 有什么好的替代方法来连接到 SQL 吗?
我已经使用 sbt assembly 打包了项目,它终于成功了,我很高兴。
但是在您的 dependent-jar-uri 中使用 HDFS 文件实际上是行不通的。所以不要使用 HDFS links 作为你的 dependent-jar-uris.
此外,如果您好奇,请阅读此 link:https://github.com/spark-jobserver/spark-jobserver/issues/372
我们在 local.conf
中有类似的东西 # JDBC driver, full classpath
jdbc-driver = org.postgresql.Driver
# Directory where default H2 driver stores its data. Only needed for H2.
rootdir = "/var/spark-jobserver/sqldao/data"
jdbc {
url = "jdbc:postgresql://dbserver/spark_jobserver"
user = "****"
password = "****"
}
dbcp {
maxactive = 20
maxidle = 10
initialsize = 10
}
在启动脚本中我有
EXTRA_JARS="/opt/spark-jobserver/lib/*"
CLASSPATH="$appdir:$appdir/spark-job-server.jar:$EXTRA_JARS:$(dse spark-classpath)"
Spark Jobserver使用的所有依赖文件都放在/opt/spark-jobserver/lib
我没有使用 HDFS 为 job-server 加载 jar。
但是如果您需要 mysql 驱动程序加载到 spark worker 节点上,那么您应该通过 dependent-jar-uris 来完成。我想这就是你现在正在做的事情。