【问题标题】:JDBC Driver not found - On submitting to YARN from Spark找不到 JDBC 驱动程序 - 从 Spark 提交到 YARN
【发布时间】:2016-01-10 10:48:18
【问题描述】:

尝试从数据库表中读取所有行并将其写入另一个空目标表。因此,当我在主节点发出以下命令时,它按预期工作 -

$./bin/spark-submit --class cs.TestJob_publisherstarget --driver-class-path ./lib/mysql-connector-java-5.1.35-bin.jar --jars ./lib/mysql-connector-java-5.1.35-bin.jar,./lib/univocity-parsers-1.5.6.jar,./lib/commons-csv-1.1.1-SNAPSHOT.jar ./lib/uber-ski-spark-job-0.0.1-SNAPSHOT.jar

(其中:uber-ski-spark-job-0.0.1-SNAPSHOT.jar 是 ../spark/lib 文件夹中的打包 jar,cs.TestJob_publisherstarget 是类)

上述命令非常适合代码,并使用 --jars 选项提到的 JDBC 驱动程序从 MySQL 中的表中读取所有行并将所有 roes 转储到目标表。

这是问题:

一切与上述相同,当我向 YARN 提交相同的作业时,它会失败并出现异常指示 - 找不到驱动程序

$./bin/spark-submit --verbose --class cs.TestJob_publisherstarget --master yarn-cluster --driver-class-path ./lib/mysql-connector-java-5.1.35-bin.jar --jars ./lib/mysql-connector-java-5.1.35-bin.jar ./lib/uber-ski-spark-job-0.0.1-SNAPSHOT.jar

YARN 控制台中的异常:

Error: application failed with exception
org.apache.spark.SparkException: Application finished with failed status
    at org.apache.spark.deploy.yarn.Client.run(Client.scala:625)
    at org.apache.spark.deploy.yarn.Client$.main(Client.scala:650)
    at org.apache.spark.deploy.yarn.Client.main(Client.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:577)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:174)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:197)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:112)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

日志异常:

5/10/12 20:38:59 ERROR yarn.ApplicationMaster: User class threw exception: No suitable driver found for jdbc:mysql://localhost:3306/pubs?user=root&password=root
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/pubs?user=root&password=root
    at java.sql.DriverManager.getConnection(DriverManager.java:596)
    at java.sql.DriverManager.getConnection(DriverManager.java:187)
    at org.apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:96)
    at org.apache.spark.sql.jdbc.JDBCRelation.<init>(JDBCRelation.scala:133)
    at org.apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:121)
    at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:219)
    at org.apache.spark.sql.SQLContext.load(SQLContext.scala:697)
    at com.cambridgesemantics.application.sdi.compiler.spark.DataSource.getDataFrame(DataSource.scala:20)
    at cs.TestJob_publisherstarget$.main(TestJob_publisherstarget.scala:29)
    at cs.TestJob_publisherstarget.main(TestJob_publisherstarget.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:484)
15/10/12 20:38:59 INFO yarn.ApplicationMaster: Final app status: FAILED, exitCode: 15, (reason: User class threw exception: No suitable driver found for jdbc:mysql://localhost:3306/pubs?user=root&password=root)

无论如何:我应该将 JDBC 驱动程序 jar 文件放在哪里?我已经将它复制到每个子节点的库中,仍然没有运气!

【问题讨论】:

    标签: apache-spark hadoop-yarn apache-spark-sql


    【解决方案1】:

    我遇到了同样的问题,它在本地模式下工作,但在 yarn-client 下没有。

    我添加到 spark 提交:

    --conf "spark.executor.extraClassPath=/path/to/mysql-connector-java-5.1.34.jar
    

    这对我有用

    【讨论】:

      【解决方案2】:

      对于 Spark 1.6,我在使用 org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils.saveTable 将 DataFrame 存储到 Oracle 时遇到问题

      在 yarn-cluster 模式下,我将这些选项放在了提交脚本中:

      --conf "spark.driver.extraClassPath=$HOME/jdbc-11.2.0.3.0.jar" \
      --conf "spark.executor.extraClassPath=$HOME/jdbc-11.2.0.3.0.jar" \
      

      我还必须将 Class.forName("..") 如下所示放在保存行之前:

      try {
         Class.forName("oracle.jdbc.OracleDriver");
                      org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils.saveTable(ds, url, "RD_SPARK_DTL_INCL_HY ", p);
                  } catch (Exception e) {....
      

      当然,您必须将 lib 复制到每个节点。不漂亮,但它有效。希望以后有人能提出更好的解决方案。

      我强烈推荐使用这个 API——非常方便和快速。

      【讨论】:

        猜你喜欢
        • 2015-06-15
        • 1970-01-01
        • 2017-07-21
        • 2016-04-18
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多