2016-05-02 2 views
0

Я хочу запустить Spark-задание в кластере виртуальных виртуальных машин Google и внутри операции с картами Мне нужно сделать запрос на поиск по эластичности. Моя проблема заключается в том, что Спарк и Elastic Search есть конфликт на библиотеке Гуава, а Спарк использует Guava 14 и ES Guava 18.Spark on YARN confilict with Elasticsearch TransportClient из-за библиотеки Гуавы разных версий

Моя проблема заключается в вызове метода com.google.common.util.concurrent.MoreExecutors.directExecutor(), который существует в гуавы 18, но не в гуавы 14.

Более подробно работа, которую я пытаюсь сделать, это что-то вроде следующего.

input.map(record=>{ 
    val client=openConnection() 
    val newdata=client.query(record.someInfo) 
     new record(newdata) 
}) 

Метод openConnection показан ниже

public static TransportClient openConnection(String ipAddress, int ipPort) throws UnknownHostException { 


    Settings settings = Settings.settingsBuilder().put("cluster.name", "elasticsearch").build(); 
    TransportClient client = TransportClient.builder().settings(settings).build(). 
      addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ipAddress), ipPort)); 

    return client; 

} 

Я пытался использовать штриховку, чтобы заставить ES использовать Guava 18 путем добавления правила затенения в файле SBT следующим образом:

libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.0" % "provided" 
libraryDependencies += "org.apache.spark" % "spark-graphx_2.10" % "1.6.0" % "provided" , 
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.0" % "provided" , 
libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.6.0" % " 

libraryDependencies += "org.elasticsearch" % "elasticsearch" % "2.2.0", 

assemblyShadeRules in assembly :=Seq(
    ShadeRule.rename("com.google.common.*" -> "[email protected]"). 
    inLibrary("org.elasticsearch" % "elasticsearch" % "2.2.0")) 

Проблема, однако, похоже, остается. Есть ли способ разрешить этот конфликт?

+0

Удалить правила штриховки для Спарк, так что это при условии, библиотека. Я бы также попытался использовать две звездочки ('**') в правиле переименования для Guava. Если он все еще не работает, проверьте выходную банку, если имена пакетов изменились. Вы можете сделать это, переименовав банку в zip, а затем проверив каталоги в нем. –

ответ

1

Затенение было ответом: Я добавил следующее правило в файле build.sbt.

Решение ниже работает для SPARK-кластера над YARN, который использует класс ElasticSearch TransportClient.

assemblyShadeRules in assembly :=Seq(
     ShadeRule.rename("com.google.**" -> "[email protected]").inAll 
) 

Я придаю весь файл SBT для полноты:

import sbt.ExclusionRule 
import sbt.Keys._ 

lazy val root = (project in file(".")). 
    settings(
    name := "scala_code", 
    version := "1.0", 
    scalaVersion := "2.10.6", 
    conflictManager := ConflictManager.latestRevision, 
    test in assembly := {}, 
    assemblyMergeStrategy in assembly := { 
     case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard 
     case _ => MergeStrategy.first 
    }, 

    parallelExecution in test := false, 
    libraryDependencies += "com.fasterxml.jackson.module" % "jackson-module-scala_2.10" % "2.6.5", 
    libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.0" % "provided" exclude("javax.servlet", "servlet-api"), 
    libraryDependencies += "org.wikidata.wdtk" % "wdtk-datamodel" % "0.6.0" exclude ("com.fasterxml.jackson.core", "jackson-annotations"), 
    libraryDependencies += "org.apache.spark" % "spark-graphx_2.10" % "1.6.0" % "provided" , 
    libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.6.0" % "provided" , 
    libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.6.0" % "provided", 
    libraryDependencies += "org.scalatest" % "scalatest_2.10" % "2.0" % "test", 
+= "com.typesafe" % "config" % "1.2.1", 
    libraryDependencies += "org.jsoup" % "jsoup" % "1.8.3", 
    libraryDependencies += "org.elasticsearch" % "elasticsearch" % "2.2.0",// exclude("com.google.guava", "guava"), 

    assemblyShadeRules in assembly :=Seq(
     ShadeRule.rename("com.google.**" -> "[email protected]").inAll 
) 

) 
1

Вы не можете исключать переходные зависимости из предоставленных зависимостей. Отметив это provided, вы сообщите упаковщику, чтобы он не был помещен в финальную банку, потому что вы предполагаете, что он будет уже на пути к классам, где он будет развернут.

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

варианты:

  • исключая зависимость от библиотеки ElasticSearch: это будет означать, что ES будет использовать Guava, который предоставляется Спарк, и может быть несовместимой версии
  • переключение на ElasticSearch библиотека, которая имеет ту же версию Guava (различия в младших версиях в основном совместимы, хотя вам может потребоваться ее исключить)
  • переход на версию Spark, которая имеет ту же версию Guava, что и ElasticSearch.
  • Использование затенения: теперь это доступно в плагине SBT sbt-assembly. Шейдинг - это переименование классов. Вы знаете, что у ElasticSearch и Spark есть своя версия Guava, которую они также включают в себя как зависимость. Поэтому вы инструктируете SBT переименовать Guava, предоставленный ES, в Guava1, а Guava предоставлен Spark для Guava2, и каждая ссылка в Spark на Guava будет переименована в Guava1, а также с ES на Guava2.

Вы можете прочитать о затенении sbt-сборки here.

+0

Я сделал, как вам было поручено, но проблема остается. – orestis

+0

Спасибо за помощь! – orestis