2016-11-16 4 views
0

다음 오류로 인해 spark-submit을 통해 스파크 작업을 실행하는 데 문제가 있습니다 :java.lang.NoSuchMethodException으로 인해 스파크 작업이 실패합니다 : 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) 
... 

나는 스칼라 2.10, 하이브 1.1.0와 스파크 1.6.0을 이용하고 있고이 플랫폼은 스파크와 하이브에 대해 동일한 버전을 가진 CDH 5.7.1입니다. classpath에서 spark 작업으로 전달되는 hive-exec는 hive-exec-1.1.0-cdh5.7.1.jar입니다. 이 병은 내가 볼 수있는 클래스 org.apache.hadoop.hive.ql.metadata.Hive는 다음과 같은 방법이 있습니다

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 클래스에 하나 그

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

나는 또한 하이브 간부 항아리의 역사를 확인하고 클래스 org.apache.hadoop.hive.ql.metadata.Hive의 서명했다 보인다 :이 클래스에서 같은 방법의 서명이 방법으로 클래스 org.apache.spark.sql.hive.client.HiveShim을 사용하고, 사용하고 버전 1.0.0 이후로 변경되었습니다. Spark를 처음 접했을 때 spark-hive 라이브러리가 Hive의 이전 구현을 사용하고있는 것으로 보입니다 (JAR 내부의 META-INF/DEPENDENCIES 파일에서 org.spark-project.hive에 대한 종속성이 있음을 알 수 있습니다). : hive-exec : jar : 1.2.1.spark). 누구든지 올바른 하이브 라이브러리를 사용하도록 스파크 작업을 설정하는 방법을 알고 있습니까?

+0

해결 방법을 찾으셨습니까? –

답변

0

있는지 확인하십시오 당신은 문제가 계속 내가 추측 존재하는 경우 그래서 당신이 사용하고있는 스파크 버전을 의미 당신이

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

다음과 같이 하이브 상황에 설정할 수 있습니다 스파크에서

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

설정 아래 설정 한 spark-submit을 실행하려고하는 환경과 일치하지 않습니다 ... spark-shell에서 프로그램을 실행하고 작동하면 스파크 버전을 환경 설정에 맞춰보십시오.

당신이 아래 SBT에 당신은 의존성을 설정하거나 치어

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 "%"1.6.3 " libraryDependencies + ="org.apache.spark "%"spark-hive_2.10 "%"1.6.3 " -exec "%"1.1.0 " ? –

+0

sbt 또는 maven – Nitin

+1

@LuisLeal은 sbt이지만, 당신은 Maven에서 동일한 것을 정의 할 수 있습니다 – jmoyano

관련 문제