【问题标题】:Spark on EMR w/multiple JDBC jars带有多个 JDBC jar 的 EMR 上的 Spark
【发布时间】:2018-07-08 14:15:18
【问题描述】:

我的设置:使用 SBT 构建的小型 Spark 项目(+ 用于制作“胖”罐子的 sbt-assembly)需要使用 JDBC(在本例中为 PostgreSQL + SQL Server)与多个数据库后端通信,但我认为我的问题很普遍)。我可以毫无问题地在本地驱动程序模式下构建 + 运行我的项目,使用完全着色的 JAR 或使用 spark-submit 添加到类路径的带有 JDBC 库的苗条。我已经确认类文件在我的 jar 中,并且各种驱动程序正确连接到 META-INF/services/java.sql.Driver,并且当胖 JAR 在我的类路径中时,可以通过 Scala repl 加载任何有问题的类。

现在的问题是:没有构建选项、作业提交选项等的组合。一旦我将作业提交到 EMR,我可以猜想是否允许我访问 >1 JDBC 驱动程序。我已经尝试过普通的胖 JAR 以及通过各种 spark-submit 选项(--jars--packages 等)添加驱动程序。在每种情况下,我的工作都会抛出“没有合适的驱动程序”错误,但只是为了加载 second 驱动程序。一个额外的问题:我通过 EC2 主机而不是我的本地开发机器(b/c 云安全,这就是为什么)将作业提交给 EMR,但在任何一种情况下它都是相同的 JAR。

另一个有趣的数据点:我已经验证了驱动程序类在 EMR 作业中的运行时可用,方法是在实际尝试连接之前对每个驱动程序强制一个 Class.forName(...)。看不到一个ClassNotFoundException。同样,进入 EMR 主节点上的 spark-shell 并运行相同的代码路径来获取数据库连接(或多个!)似乎工作正常。

这几天我一直在研究这个问题,老实说,我开始担心这是一个潜在的类加载器问题或同样迟钝的问题。

一些标准的免责声明:这不是一个开源工具,所以我不能以源代码或原始日志的方式分发太多,但我很高兴查看并报告任何可以适当地已编辑。

【问题讨论】:

    标签: apache-spark jdbc sbt emr


    【解决方案1】:

    由于您的调查没有显示任何明显的问题,因此可能只是 Spark 问题。在这种情况下,显式声明驱动程序类可能会有所帮助:

    val postgresDF = spark.read
      .format("jdbc")
      .option("driver" , "org.postgresql.Driver")
      ...
      .load()
    
    val msSQLDF = spark.read
      .format("jdbc")
      .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
      ...
      .load()
    

    【讨论】:

    • 显式驱动程序类完全是问题所在。不知道这是什么时候偷偷出现的问题,但似乎在每次调用 spark.jdbc.read 时都提供它可以解决驱动程序问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2016-07-30
    • 1970-01-01
    • 2015-12-21
    • 2016-07-16
    • 2015-10-06
    • 2019-06-07
    相关资源
    最近更新 更多