2016-12-07 3 views
3

Я пытаюсь собрать приложение Scala 2.11 Spark 2.0 с использованием hortonworks-spark/shc для доступа к hbase.Scala 2.11 Spark 2.0 hortonworks-spark/shc sbt assembly

Набор зависимостей выглядит просто:

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

Проблема возникает, когда я пытаюсь сборки приложения в баночку жира, потому что есть много зависимостей невозвратности с другой версией, то сборка плагин бросить дубликат ошибки. Один из примеров:

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 

Кроме того, я не знаю, если это право включать в зависимости баночки, как org.apache.hbase: HBase-сервер: 1.1.2

Таким образом, в основном, вопрос : Кто-нибудь знает правильный способ сборки приложения Scala Spark с использованием этой библиотеки и sbt и может предоставить пример? (А может быть, добавить его в документации hortonworks-spark/shc

Примечание: hortonworks-spark/shc не включают в spark-packages поэтому я не могу использовать --packages вариант, если это не с локальной копией баночки я использую ЭМИ, так. У меня нет предварительно сконфигурированного кластера, где скопируйте банку, не добавляя больше сложностей в развертывание.

+0

Не могли бы вы описать в вопросе, какая проблема возникает, когда вы собираете жировую банку? – ipoteka

+0

@ipoteka Извините. Добавлен один пример ошибки. – angelcervera

ответ

0

Вы должны указать mergeStrategy, упомянутую в Readme. И вы можете предоставить общие библиотеки на искровых узлах, а не включать их в fat.jar каждый время. Для этого необходимо загрузить их на каждого работника и добавить в classpath.

+0

Я использую EMR, так что это новый кластер каждый раз, когда выполняется приложение. Именно по этой причине я хочу использовать толстую банку, чтобы избежать загрузки и настройки кластера при каждом новом развертывании. Также я знаю, как настроить плагин сборки, но это сумасшедшая работа с большим набором зависимостей и конфликтов. Поэтому я не знаю, что делать. Как вы думаете? – angelcervera

+0

@angelcervera Когда я работал с искровым, я предоставил простейшую mergeStrategy и загрузил 150 мб моего приложения каждый раз. Это было быстро и надежно для меня. Единственная проблема заключалась в том, что версия библиотеки (например, json4s) отличается от искры и моего приложения. Но это просто личный опыт. – ipoteka

+0

Да, я привык делать то же самое в приложениях hadoop. – angelcervera

0

Как вы c см. jasper-xmlparser используется двумя разными банками. Итак, дубликат. Вы можете исключить ссылку от одного из них, как следует

Например: libraryDependencies + = "org.apache.hbase" % "HBase-сервер" % "0.98.12-hadoop2" excludeAll ExclusionRule (организация = «орг .mortbay.jetty ")

И относительно добавления всех зависимостей в жировую банку, по крайней мере, для искровых приложений, то есть предлагаемый способ обработки сборки банки. Наиболее распространенные банки (например, искра, hbase и т. Д.) Могут быть сделаны частью пути класса на краевом узле или в любом из когда-либо выполняемых узлов. Любые другие конкретные банки могут быть частью uber jar. Вы можете сделать банки искры/hbase, как предусмотрено.

Ну, в основном, следующие действия помогут вам выполнить основные операции.

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, с ментальным набором зависимостей, это безумие, чтобы исключить или установить область для всех библиотек и быть уверенным, что все в порядке. Потому что я думаю, что доступ к hbase от искры - это обычная польза (теперь я сомневаюсь), я полагал, что была конфигурация копирования и вставки. Если нет, я сделаю это, потому что это необходимо. – angelcervera

+0

Обновлен мой ответ, чтобы включить базовые банки hbase. Если вы используете какой-либо другой обычно используемый jar, такой как hbase-spark, тогда он будет обрабатывать все транзитивные зависимости. Но они будут включены в вас uber jar – Ramzy

0

Вы должны предоставить mergeStrategy в build.sbt,

Это выглядит примерно так,

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

В этом примере я указал MergeStrategy.first. Есть несколько других вариантов, как MergeStrategy.last и MergeStrategy.concat

MergeStrategy.first означает, что он будет выбрать первую банку он видит для данной зависимости, чтобы создать убер банку.

Для некоторых случаев это может не сработать, если это так, попробуйте с MergeStrategy.last также.

+0

Я думаю, что это не очень хорошая идея, потому что я собираюсь выбрать первый, независимо от его содержания. Проверьте пример. Каков правильный класс, включенный внутри jsp-2.1-6.1.14.jar или внутри jasper-compiler-5.5.23.jar? Я спрашиваю о правильной конфигурации сборки. – angelcervera

+0

На мой взгляд, один из первых или последних должен работать на вас. Как только вы знаете, какой из них работает, это не должно быть проблемой. – Ganesh