繁体   English   中英

Spark-在纱线群集模式下jdbc写失败,但在spark-shell中工作

[英]Spark - jdbc write fails in Yarn cluster mode but works in spark-shell

我正在使用Spark 1.6.2,Hadoop 2.6,Scala 2.10.5和Java 1.7

我正在使用JDBC从MSSQL读取数据,这可以正常工作:

val hqlContext = new HiveContext(sc)

val url = "jdbc:sqlserver://1.1.1.1:1111;database=CIQOwnershipProcessing;user=OwnershipUser;password=Ownership123"

val driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

val df1 = hqlContext.read.format("jdbc").options(
   Map("url" -> url, "driver" -> driver,
  "dbtable" -> "(select * from OwnershipStandardization_PositionSequence_tbl) as ps")).load()

而且,在将数据帧写回MSSQL时,我正在使用JDBC写入,如下所示。 这在Spark-shell中工作正常,但是当我在Yarn-Cluster模式下执行spark-submit时失败。 我想念什么?

val prop = new java.util.Properties
df1.write.mode("Overwrite").jdbc(url, "CIQOwnershipProcessing.dbo.df_sparkop",prop)

这就是我的spark-submit命令的样子。 如您所见,我也传递了SQLJDBC jar路径。 并且,我还在群集的所有节点上的spark-defaults.conf中的“ spark.executor.extraClassPath”属性中指定了jdbc jar路径。 由于JDBC读取有效,因此我怀疑它是否与类路径有关。

spark-submit --class com.spgmi.csd.OshpStdCarryOver --master  yarn --deploy-mode cluster --conf spark.yarn.executor.memoryOverhead=2048 --num-executors 1 --executor-cores 2 --driver-memory 3g --executor-memory 8g --jars $SPARK_HOME/lib/datanucleus-api-jdo-3.2.6.jar,$SPARK_HOME/lib/datanucleus-core-3.2.10.jar,$SPARK_HOME/lib/datanucleus-rdbms-3.2.9.jar,/usr/share/java/sqljdbc_4.1/enu/sqljdbc41.jar --files $SPARK_HOME/conf/hive-site.xml $SPARK_HOME/lib/spark-poc2-17.1.0.jar

在Yarn-Cluster模式下引发的错误是:

17/1/17 10:21:31错误yarn.ApplicationMaster:用户类引发异常:java.lang.InstantiationException:org.apache.spark.sql.execution.datasources.jdbc.DriverWrapper java.lang.InstantiationException:org.apache org.apache.spark.sql.execution.datasources.jdbc.DriverRegistry $ .register(DriverRegistry.scala)上的java.lang.Class.newInstance(Class.java:368)上的.spark.sql.execution.datasources.jdbc.DriverWrapper :46),位于org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils上的org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils $$ anonfun $ createConnectionFactory $ 2.apply(JdbcUtils.scala:53) $$ anonfun $ createConnectionFactory $ 2.apply(JdbcUtils.scala:52)位于org.apache.spark.sql.DataFrameWriter.jdbc(DataFrameWriter.scala:278)位于com.spgmi.csd.OshpStdCarryOver $ .main(SparkOshpStdCarryOver.scala: 175),位于com.spgmi.csd.OshpStdCarryOver.main(SparkOshpStdCarryOver.scala),位于sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcces) sorImpl.java:57)位于org.apache.spark.deploy.yarn.ApplicationMaster处的java.lang.reflect.Method.invoke(Method.java:606)处的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) $$不久又看到了$ 2.run(ApplicationMaster.scala:558)

我面临着同样的问题。 我通过在prop中设置连接属性来解决它。

val prop = new java.util.Properties
prop.setProperty("driver","com.mysql.jdbc.Driver")

现在通过这个道具

df1.write.mode("Overwrite").jdbc(url, "CIQOwnershipProcessing.dbo.df_sparkop",prop)

您的问题,感觉非常相似, 火花14204SPARK-14162 - (?!),虽然该缺陷是应该被固定在星火1.6.2

使用Type 4 JDBC驱动程序时,您不必显式提及“ driver”属性。 JAR应该自动注册它支持的URL前缀(此处为jdbc:sqlserver:
但是由于该错误,Spark JDBC模块可能无法使用该“注册”来找到与URL 隐式匹配的驱动程序。

换句话说:为了阅读,您强制使用“ driver”属性,并且连接有效; 对于写作,您不会强迫它,并且它也不起作用。 啊哈!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM