2017-11-22 4 views
1

Apache Spark v2.2.0, Scala 2.11.8에서 GeoIP2 v2.10.0 Java API (https://github.com/maxmind/GeoIP2-java)를 사용하려고합니다. 문제는 아파치 스파크가 jackson-databind 아티팩트 v2.6.5를 가지고 있는데, GeoIP2가 jackson-databind 2.9.2 미니멈 버전을 필요로하는 pom 파일입니다. 따라서 나는 sbt-assembly을 사용하여 관련 라이브러리를 음영 처리하려고합니다. 나는 AWS-EMR에 spark-submit 명령을 사용하고 있지만, 나는 다음과 같은 의존성 오류가 계속 잭슨 데이터 바인딩 v2.6.5는 2.9.2을 사용하는 대신 스파크에서 가져온되고 있기 때문에sbt 어셈블리 IntelliJ에서 음영 확인

Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.node.ArrayNode.<init>(Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;Ljava/util/List;)V at com.maxmind.db.Decoder.decodeArray(Decoder.java:272) 

위의 예외가 주로 발생합니다 . 아무도 내가 음영 프로세스를 올바르게 수행하고 있는지 또는 무엇이든 놓친다면 말해 줄 수 있습니까? com.fasterxml.jackson.core.*이 IntelliJ의 shaded.jackson.core.*에 실제로 음영 처리되었는지 여부를 어떻게 확인합니까? sbt-dependencyTree 플러그인을 사용하려고했지만, 종속성을 com.fasterxml.jackson.core.*으로 표시합니다. 사전에

name := "Sessionization" 
    version := "0.1" 
    scalaVersion := "2.11.8" 

    assemblyShadeRules in assembly := Seq(ShadeRule.rename("com.fasterxml.jackson.core.**" -> "[email protected]").inAll 
     //.inLibrary("com.fasterxml.jackson.core" % "jackson-databind" % "2.9.2") 
     //.inLibrary("com.fasterxml.jackson.core" % "jackson-core" % "2.9.2") 
     //.inLibrary("com.fasterxml.jackson.core" % "jackson-annotations" % "2.9.0") 
     //.inProject 
) 

    // Have to use "provided" because of some deduplicate error in merging many same-name class files. 
    libraryDependencies ++= Seq("com.maxmind.geoip2" % "geoip2" % "2.10.0", //"org.apache.spark" %% "spark-core" % "2.2.0" % "provided", 
    "org.apache.spark" %% "spark-sql" % "2.2.0" % "provided" 
    //"org.apache.spark" %% "spark-core" % "2.2.0" excludeAll(ExclusionRule(organization="com.fasterxml.jackson.core")), 
    //"org.apache.spark" %% "spark-sql" % "2.2.0" excludeAll(ExclusionRule(organization="com.fasterxml.jackson.core")) 
    ) 

감사 :

다음은 내 build.sbt 파일입니다!

답변

0

솔직히거야, 내가 조립 그늘 규칙을 사용한 적이 있지만 이러한 방법 중 하나를 시도 :

  1. 의 주석을 해제하여 제외 규칙 시도를하고 ExclusionRule(organization = "*", name = "jackson-core")
  2. 과 제외 규칙을 대체

    build.sbt의 맨 아래에 병합 전략을 추가하십시오. 의 라인을 따라 뭔가 : 당신은 여전히 ​​문제를 발생하는 경우 할 수있는 또 다른 유용한 것은 충돌을 식별 할 수 있도록 build.sbt에 conflictManager := ConflictManager.strict을 추가 할 것입니다

    assemblyMergeStrategy in assembly := { case x if x.contains("decodeArray") => MergeStrategy.deduplicate case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }

.

관련 문제