簡體   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