Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 带多个JDBC jar的EMR上的Spark_Apache Spark_Jdbc_Sbt_Emr - Fatal编程技术网

Apache spark 带多个JDBC jar的EMR上的Spark

Apache spark 带多个JDBC jar的EMR上的Spark,apache-spark,jdbc,sbt,emr,Apache Spark,Jdbc,Sbt,Emr,我的设置:small Spark项目构建了w/SBT(+SBT assembly,用于制作“胖”罐子),需要使用JDBC与多个DB后端进行对话(在本例中是PostgreSQL+SQL Server,但我认为我的问题概括了)。我可以在本地驱动程序模式下构建并运行我的项目,使用完全着色的JAR或使用spark submit添加到类路径中的带有JDBC libs的薄型JAR都没有问题。我已经确认类文件在我的jar中,各种驱动程序正确地连接到META-INF/services/java.sql.Driv

我的设置:small Spark项目构建了w/SBT(+SBT assembly,用于制作“胖”罐子),需要使用JDBC与多个DB后端进行对话(在本例中是PostgreSQL+SQL Server,但我认为我的问题概括了)。我可以在本地驱动程序模式下构建并运行我的项目,使用完全着色的JAR或使用spark submit添加到类路径中的带有JDBC libs的薄型JAR都没有问题。我已经确认类文件在我的jar中,各种驱动程序正确地连接到
META-INF/services/java.sql.Driver
,当胖jar在我的类路径中时,可以通过Scala repl加载任何有问题的类

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

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

我已经在这方面戳了几天了,老实说,我开始担心这是一个潜在的类加载器问题,或者是一些同样愚蠢的问题


一些标准免责声明:这不是一个开源工具,所以我不能提供太多的源代码或原始日志,但我很乐意查看并报告任何可以适当修改的内容。

因为您的调查没有显示任何明显的问题,这可能只是一个火花问题。在这种情况下,显式声明驱动程序类可能有助于:

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
时都提供了它,从而绕过了驱动程序问题。