Spark JobServer JDBC-ClassNotFound错误

时间:2016-01-26 12:24:52

标签: scala jdbc apache-spark spark-jobserver

我有: - Hadoop - Spark JobServer - 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"]

但是找不到JDBC类的错误仍然存​​在。

已检查以下错误:

ERROR1: 如果有人认为我只是有错误的文件路径(据我所知,这很可能就是这种情况),我已经使用hadoop fs -ls hdfs://quickstart.cloudera:8020/user/cloudera/在HDFS上检查了正确的文件,文件在那里:< / p>

-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

ERROR2: 我在build.sbt文件中加载了必要的依赖项:libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.+"和我的scala文件import java.sql._中的import命令。

如何解决此ClassNotFound错误? JDBC有什么好的替代方法可以连接到SQL吗?

2 个答案:

答案 0 :(得分:1)

我们在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 =&#34; /选择/火花jobserver / lib中/ *&#34;

CLASSPATH =&#34; $ appdir:$ appdir / spark-job-server.jar:$ EXTRA_JARS:$(dse spark-classpath)&#34;

Spark Jobserver使用的所有相关文件都放在/ opt / spark-jobserver / lib

我没有使用HDFS为作业服务器加载jar。

但是如果你需要在spark worker节点上加载mysql驱动程序,那么你应该通过dependent-jar-uris来实现。我认为这就是你现在正在做的事情。

答案 1 :(得分:0)

我已经使用sbt程序集打包了项目,它终于有效了,我很高兴。

但它实际上并没有在您的dependent-jar-uri中使用HDFS文件。因此,不要使用HDFS链接作为您的依赖jar-uris。

另外,如果您感到好奇,请阅读此链接:https://github.com/spark-jobserver/spark-jobserver/issues/372