【发布时间】: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