2016-12-07 1 views
3

hbase에 액세스하기 위해 hortonworks-spark/shc을 사용하여 Scala 2.11 Spark 2.0 응용 프로그램을 어셈블리하려고합니다.Scala 2.11 Spark 2.0 hortonworks-spark/shc sbt assemby

종속성 세트는 간단한 같습니다 나는 지방 항아리에 조립 용도에하려고 할 때, 다음 어셈블리 플러그인 던져 중복 다른 버전으로 무상 종속성이 많이 있기 때문에

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "2.0.2" % "provided", 
    "com.hortonworks" % "shc-core" % "1.0.1-2.0-s_2.11" 
) 

문제가 온다 오류. 한 가지 예 : HBase를 서버 :이 org.apache.hbase 같은 항아리 종속성에 포함 맞다면 또한

deduplicate: different file contents found in the following: 
[error] /home/search/.ivy2/cache/org.mortbay.jetty/jsp-2.1/jars/jsp-2.1-6.1.14.jar:org/apache/jasper/xmlparser/XMLString.class 
[error] /home/search/.ivy2/cache/tomcat/jasper-compiler/jars/jasper-compiler-5.5.23.jar:org/apache/jasper/xmlparser/XMLString.class 

, 내가 모르는 그래서 1.1.2

, 기본적으로 질문 누구나이 라이브러리와 SBT를 사용하여 스칼라 스파크 애플리케이션을 어셈블리하는 올바른 방법을 알고 있으며 예제를 제공 할 수 있습니까? (그리고 어쩌면 hortonworks-spark/shc

참고 문서에 추가 : hortonworks-spark/shcspark-packages에 포함되지 그것이 내가 EMR 사용하고있는 항아리의 로컬 복사본이 아닌 경우 그래서 나는 --packages 옵션을 사용할 수 없습니다, 그래서. 배치에 복잡성을 추가하지 않고 jar를 복사하는 사전 구성된 클러스터가 없습니다

+0

팻 항아리를 조립할 때 어떤 문제가 발생합니까? – ipoteka

+0

@ipoteka 죄송합니다. 하나의 오류 예가 추가되었습니다. – angelcervera

답변

0

Readme에서 언급 한 mergeStrategy를 지정해야합니다. 그리고 각각을 fat.jar에 포함하는 대신 스파크 노드에 제공 할 수 있습니다 각 작업자에게 업로드하여 클래스 경로에 추가하는 것입니다.

+0

EMR을 사용 중이므로 응용 프로그램을 실행할 때마다 새 클러스터입니다. 이는 새로운 배포가있을 때마다 클러스터를 업로드하고 구성하는 것을 피하기 위해 뚱뚱한 항아리를 사용하기 때문에 그 이유가 있습니다. 또한 어셈블리 플러그인을 구성하는 방법을 알고 있지만 의존성 및 충돌이 큰 미친 작업입니다. 그래서 나는 무엇을해야할지 모른다. 어떻게 생각해? – angelcervera

+0

@angelcervera 내가 spark와 함께 일했을 때, 나는 가장 간단한 mergeStrategy를 제공하고 매번 150Mb의 응용 프로그램을 업로드했다. 그것은 나를 위해 빠르고 신뢰할 수있었습니다. 유일한 문제는 스파크와 응용 프로그램간에 라이브러리 버전 (json4s와 같은)이 다른 경우입니다. 그러나 그것은 단지 개인적인 경험 일뿐입니다. – ipoteka

+0

예, 나는 hadoop 응용 프로그램에서 동일한 작업을 수행하는 데 익숙합니다. – angelcervera

0

마찬가지로 jasper-xmlparser가 두 개의 서로 다른 항아리에서 사용되는 것을보십시오. 그래서 중복. 다음 중 하나에서 참조를 제외 할 수 있습니다.

예 : libraryDependencies + = "org.apache.hbase"% "hbase-server"% "0.98.12-hadoop2"excludeAll ExclusionRule (organization = "org .motbay.jetty ")

지방 병에 모든 종속성을 추가하는 것과 관련하여 스파크 응용 프로그램을위한 최소한의 방법은 병 어셈블리를 처리 할 때 제안되는 방법입니다. 가장 일반적인 jar (예 : spark, hbase 등)는 에지 노드 또는 실행중인 노드의 클래스 경로에 포함될 수 있습니다. 다른 특정 항아리는 uber jar의 일부가 될 수 있습니다. Spark/hbase jars는 제공된대로 만들 수 있습니다.

다음 핵심은 다음과 같이 기본 작업을 수행하는 데 도움이됩니다.

libraryDependencies += "org.apache.hbase" % "hbase-client" % "0.98.12-hadoop2" // % "provided" 
libraryDependencies += "org.apache.hbase" % "hbase-common" % "0.98.12-hadoop2" //% "provided" 
libraryDependencies += "org.apache.hbase" % "hbase-server" % "0.98.12-hadoop2" excludeAll ExclusionRule(organization = "org.mortbay.jetty") 
+0

필자가 @ipoteka에 의존하면서, 의존성의 정신적 집합으로 모든 라이브러리에 범위를 제외하거나 설정하고 그것이 괜찮은지 확인하는 것은 미친 짓이다. Spark에서 hbase에 액세스하는 것은 일반적인 사용이라고 생각하기 때문에 (필자는 의심 스럽습니다) 복사 및 붙여 넣기 구성이 있다고 생각했습니다. 그렇지 않으면 필요하기 때문에 그것을 할 것입니다. – angelcervera

+0

기본 hbase jars를 포함하도록 내 대답이 업데이트되었습니다. hbase-spark와 같이 일반적으로 제공되는 다른 jar를 사용하는 경우 모든 전 이적 종속성을 처리합니다. 하지만 그들은 당신에게 uber jar에 포함될 것입니다. – Ramzy

0

당신은 build.sbt에 mergeStrategy를 제공해야

그것은 다음과 같이 보입니다,

assemblyMergeStrategy in assembly := { 
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
    case "reference.conf" => MergeStrategy.concat 
    case x => MergeStrategy.first 
} 

이 예에서 나는 MergeStrategy.first지정했습니다. MergeStrategy.lastMergeStrategy.concat 같은 몇 가지 다른 옵션이 있습니다 MergeStrategy.first는 그것이 동네 짱 항아리를 만들 수 주어진 의존성에 대한보고 첫 번째 항아리를 선택 의미

.

경우에 따라 작동하지 않을 수도 있습니다. 그렇다면 MergeStrategy.last도 시도해보십시오.

+0

나는 이것을하는 것이 좋은 생각이 아닙니다. 그의 내용이 무엇이든 첫 번째 것을 고를 것이기 때문입니다. 예제를 확인하십시오. 올바른 클래스는 jsp-2.1-6.1.14.jar 내부 또는 jasper-compiler-5.5.23.jar 내부에 포함되어 있습니까? 올바른 조립 구성을 요구합니다. – angelcervera

+0

제 생각에는 첫 번째 또는 마지막 중 하나가 당신을 위해 일해야합니다. 어느 것이 작동하는지 알게되면 문제가되지 않습니다. – Ganesh