2016-03-13 3 views
1

У меня есть DataStax Enterprise 4.8 с Spark. Я хочу создать приложение Spark, написанное на Scala с помощью Gradle, и запустить его в этом кластере DSE, но я бы хотел избежать любых проблем с classpath во время выполнения.Построение приложения Spark против пути прохождения данных DataStax Enterprise

В настоящее время мои зависимости во времени компиляции (и разрешения конфликтов) автоматически управляются Gradle, которые уже вызвали различные проблемы во время выполнения.

Каков стандартный способ? Я хочу избежать создания жирной банки, которая включает в себя все зависимости.

+0

* В настоящее время мои зависимости времени компиляции (и разрешения конфликтов) автоматически управляет Gradle, который уже вызвал различные проблемы во время выполнения. * Стандартный способ - исправить эти конфликты во время выполнения, чтобы вы могли создать плотную банку, которую проще развернуть. –

+0

Проблема в том, что единственное, что я знаю о JAR-файлах runtime, - это их имена. –

+0

Знаете ли вы, какие JAR-файлы вызывают проблемы? Более конкретно, вы можете видеть во время компиляции, какие конфликты классов? –

ответ

3

Я просто использовал библиотеки, предоставленные командой dse spark-classpath. Я хотел бы включить это в файл сборки, как

Для SBT

val sparkClasspathStr = s"$DSE_HOME/bin/dse spark-classpath".!!.trim 
val sparkClasspathArr = sparkClasspathStr.split(':') 

//Find all Jars on dse spark-classpath 
val sparkClasspath = { 
    for (dseJar <- sparkClasspathArr if dseJar.endsWith("jar")) 
    yield Attributed.blank(file(dseJar)) 
}.toSeq 

//Your dependencies 
//libraryDependencies += "com.github.scopt" %% "scopt" % "3.2.0" 

//Add dse jars to classpath 
unmanagedJars in Compile ++= sparkClasspath 
unmanagedJars in Test ++= sparkClasspath 

Gradle

def DSE_HOME = (System.getenv("DSE_HOME") != null) ? System.getenv("DSE_HOME") : System.getenv("HOME")+"dse" 

def sparkClasspathStr = (DSE_HOME + "/bin/dse spark-classpath").execute().text.trim() 
def sparkClasspathJars = sparkClasspathStr.split(":").findAll{ it.endsWith(".jar") } 

dependencies { 
    compile files(sparkClasspathJars) 
} 
+0

Это немного помогает, но по-прежнему не решает проблем с конфликтующими транзитивными зависимостями. Я имею в виду случай, когда мой проект использует библиотеку A, которая зависит от версии B версии 2, но DSE-путь искробезопасности содержит B-версию 1. На самом деле я даже не знаю, что есть B на пути искрового класса, потому что DSE не предоставить файлы POM для этих JAR. Единственное, что я знаю, это имена файлов, и я могу только угадать имена групп и артефактов. Файл POM для всех JAR на искровом пути будет очень полезен. Я также предполагаю, что все JAR доступны на центральном Maven. –

+0

Хм, я не уверен, что мы предоставляем версию Pom на данный момент, но почти все библиотеки доступны на центральном сервере maven. Есть несколько отпечатков, которые являются собственностью DSE, но они не должны быть проблемой. Обычно, когда вы включаете сторонние библиотеки, я пытаюсь создать толстый Jar, но я понимаю, что вы можете легко столкнуться с переходными проблемами, если у вас есть Guava или Netty. – RussS

+0

Можно ли предоставить как минимум список всех JAR-систем, связанных с DSE? Так что я не трачу много времени, пытаясь найти их в публичном репо. –

Смежные вопросы