2016-11-16 433 views
0

由於以下錯誤,我遇到了通過spark-submit運行spark作業的問題:由於java.lang.NoSuchMethodException,Spark作業失敗:org.apache.hadoop.hive.ql.metadata.Hive.loadDynamicPartitions

16/11/16 11:41:12 ERROR yarn.ApplicationMaster: User class threw exception: java.lang.NoSuchMethodException: org.apache.hadoop.hive.ql.metadata.Hive.loadDynamicPartitions(org.apache.hadoop.fs.Path, java.lang.String, java.util.Map, boolean, int, boolean, boolean, boolean) 
java.lang.NoSuchMethodException: org.apache.hadoop.hive.ql.metadata.Hive.loadDynamicPartitions(org.apache.hadoop.fs.Path, java.lang.String, java.util.Map, boolean, int, boolean, boolean, boolean) 
at java.lang.Class.getMethod(Class.java:1786) 
at org.apache.spark.sql.hive.client.Shim.findMethod(HiveShim.scala:114) 
at org.apache.spark.sql.hive.client.Shim_v0_14.loadDynamicPartitionsMethod$lzycompute(HiveShim.scala:404) 
at org.apache.spark.sql.hive.client.Shim_v0_14.loadDynamicPartitionsMethod(HiveShim.scala:403) 
at org.apache.spark.sql.hive.client.Shim_v0_14.loadDynamicPartitions(HiveShim.scala:455) 
at org.apache.spark.sql.hive.client.ClientWrapper$$anonfun$loadDynamicPartitions$1.apply$mcV$sp(ClientWrapper.scala:562) 
at org.apache.spark.sql.hive.client.ClientWrapper$$anonfun$loadDynamicPartitions$1.apply(ClientWrapper.scala:562) 
at org.apache.spark.sql.hive.client.ClientWrapper$$anonfun$loadDynamicPartitions$1.apply(ClientWrapper.scala:562) 
at org.apache.spark.sql.hive.client.ClientWrapper$$anonfun$withHiveState$1.apply(ClientWrapper.scala:281) 
at org.apache.spark.sql.hive.client.ClientWrapper.liftedTree1$1(ClientWrapper.scala:228) 
at org.apache.spark.sql.hive.client.ClientWrapper.retryLocked(ClientWrapper.scala:227) 
at org.apache.spark.sql.hive.client.ClientWrapper.withHiveState(ClientWrapper.scala:270) 
... 

我使用Spark 1.6.0與Scala 2.10,蜂巢1.1.0和平臺是一個CDH 5.7.1與火花和配置單元相同的版本。 是在類路徑的火花傳遞工作的蜂房EXEC是蜂房的exec-1.1.0-cdh5.7.1.jar。這個罐子有一個類​​,我可以看到有如下方法:

public java.util.Map<java.util.Map<java.lang.String, java.lang.String>, org.apache.hadoop.hive.ql.metadata.Partition> loadDynamicPartitions(org.apache.hadoop.fs.Path, java.lang.String, java.util.Map<java.lang.String, java.lang.String>, boolean, int, boolean, boolean, boolean) throws org.apache.hadoop.hive.ql.metadata.HiveException; 

這是不一樣的是隨庫火花hive_2.10-1.6.0.jar一來就org.apache.spark.sql.hive.client.ClientWrapper類我使用的,這個類中的相同方法的簽名是使用類org.apache.spark.sql.hive.client.HiveShim用這種方法:

private lazy val loadDynamicPartitionsMethod = 
findMethod(
    classOf[Hive], 
    "loadDynamicPartitions", 
    classOf[Path], 
    classOf[String], 
    classOf[JMap[String, String]], 
    JBoolean.TYPE, 
    JInteger.TYPE, 
    JBoolean.TYPE, 
    JBoolean.TYPE) 

我也查了蜂房EXEC罐子的歷史,似乎該類​​的簽名是版本1.0.0後更改。 我是新來的火花,但在我看來,火花蜂巢庫使用舊的實現蜂巢(我可以在META-INF /相關內容的文件看不到裏面的罐子已宣佈org.spark-project.hive的依賴:蜂房EXEC:罐子:1.2.1.spark)。 有誰知道如何設置spark工作以使用適當的配置單元庫?

+0

你找到一個解決的辦法? –

回答

0

確保您已設置以下設置

SET hive.exec.dynamic.partition=true; 
SET hive.exec.max.dynamic.partitions=2048 
SET hive.exec.dynamic.partition.mode=nonstrict; 

火花,你可以在蜂巢語境設置如下

hiveCtx.setConf("hive.exec.dynamic.partition","true") 
hiveCtx.setConf("hive.exec.max.dynamic.partitions","2048") 
hiveCtx.setConf("hive.exec.dynamic.partition.mode", "nonstrict") 

的。如果問題仍然存在,我想是指火花版本,您使用的是什麼與您嘗試運行spark-submit的環境不匹配...您可以嘗試在spark-shell中運行程序,如果它運行正常,則嘗試將spark版本與環境設置對齊。

您可以設置的依賴上你SBT如下或POM

libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.3" 
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.3" 
libraryDependencies += "org.apache.spark" % "spark-hive_2.10" % "1.6.3" 
libraryDependencies += "org.apache.hive" % "hive-exec" % "1.1.0" 

請參閱 https://mvnrepository.com/artifact/org.apache.spark

您可以使用下面的命令 SPARK_PRINT_LAUNCH_COMMAND =真正的火花外殼

獲得環境設置

替代的方法是使用火花分區由保存數據

dataframe.write.mode("overwrite").partitionBy("col1", "col2").json("//path") 
+0

我有這個問題,喲指定的地方: libraryDependencies + =「org.apache.spark」%「spark-core_2.10」%「1.6.3」 libraryDependencies + =「org.apache.spark」%「spark -sql_2.10「%」1.6.3「 libraryDependencies + =」org.apache.spark「%」spark-hive_2.10「%」1.6.3「 libraryDependencies + =」org.apache.hive「%」hive -exec」% 「1.1.0」 ? –

+0

在SBT或Maven – Nitin

+1

@LuisLeal即SBT,但你可以在Maven的定義相同 – jmoyano

相關問題