2017-08-06 54 views
25

Próbuję zbudować Scala projektu/iskry w IntelliJ IDEA z następującym build.sbt:Ostrzeżenia budując Scala projektu/Spark z SBT

name := "try" 

version := "1.0" 

scalaVersion := "2.11.8" 

val sparkVersion = "2.2.0" 

resolvers ++= Seq(
    "apache-snapshots" at "http://repository.apache.org/snapshots/" 
) 

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % sparkVersion, 
    "org.apache.spark" %% "spark-sql" % sparkVersion, 
    "org.apache.spark" %% "spark-mllib" % sparkVersion, 
    "org.apache.spark" %% "spark-streaming" % sparkVersion, 
    "org.apache.spark" %% "spark-hive" % sparkVersion 
) 

i coraz kilka ostrzeżeń:

8/6/17 
1:29 PM SBT project import 
       [warn] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible: 
       [warn] * io.netty:netty:3.9.9.Final is selected over {3.6.2.Final, 3.7.0.Final} 
       [warn]  +- org.apache.spark:spark-core_2.11:2.2.0    (depends on 3.9.9.Final) 
       [warn]  +- org.apache.zookeeper:zookeeper:3.4.6    (depends on 3.6.2.Final) 
       [warn]  +- org.apache.hadoop:hadoop-hdfs:2.6.5    (depends on 3.6.2.Final) 
       [warn] * commons-net:commons-net:2.2 is selected over 3.1 
       [warn]  +- org.apache.spark:spark-core_2.11:2.2.0    (depends on 2.2) 
       [warn]  +- org.apache.hadoop:hadoop-common:2.6.5    (depends on 3.1) 
       [warn] * com.google.guava:guava:11.0.2 is selected over {12.0.1, 16.0.1} 
       [warn]  +- org.apache.hadoop:hadoop-yarn-client:2.6.5   (depends on 11.0.2) 
       [warn]  +- org.apache.hadoop:hadoop-yarn-api:2.6.5   (depends on 11.0.2) 
       [warn]  +- org.apache.hadoop:hadoop-yarn-common:2.6.5 

mam kilka, być może głupi, pytania:

  1. Czy istnieje lepszy sposób na strukturę build.sbt (dodać o ter resolvers np.?), abym mógł pozbyć się ostrzeżeń?
  2. Czy w ogóle należy dbać o ostrzeżenia?

Odpowiedz

18

Czy istnieje lepszy sposób na strukturę build.sbt (dodać inne resolwera na przykład?), Tak, że można pozbyć się ostrzeżenia?

Jednym ze sposobów jest ręcznie powiedzieć SBT jakie zależności wolisz, w Twoim przypadku:

dependencyOverrides ++= Set(
    "io.netty" % "netty" % "3.9.9.Final", 
    "commons-net" % "commons-net" % "2.2", 
    "com.google.guava" % "guava" % "11.0.2" 
) 

Polecam również czytanie o conflict management in sbt.

Czy w ogóle należy dbać o ostrzeżenia?

W twoim przypadku - nie, ponieważ twoje konflikty wynikają z używania tylko artefaktów związanych z iskrą wydanych w tej samej wersji. Spark to projekt z dużą bazą użytkowników i możliwość wprowadzenia piekła słoika ze względu na przejściowe zależności jest raczej niska (choć technicznie nie jest gwarantowana).

W ogólnym przypadku - może. Zazwyczaj w większości przypadków jest dobrze, ale istnieje niewielkie prawdopodobieństwo wystąpienia problemu, który może wymagać starannego ręcznego rozwiązywania zależności (jeśli w ogóle jest to możliwe). W takich przypadkach naprawdę trudno jest stwierdzić, czy wystąpił problem, zanim uruchomisz aplikację i wpadniesz na jakiś problem, na przykład brak klasy, metody, sygnatury metody niedopasowania lub jakiś problem związany z odbiciem.

+0

dobra odpowiedź. Zastanawiam się też za każdym razem, gdy napotykam takie ostrzeżenie, dlaczego niektórzy twórcy lib deklarują zależności od lib w taki sposób, który generuje takie ostrzeżenia. Kiedy widzę to, myślę "chłopaki, czy próbowałeś zbudować swój własny projekt w SBT? Nie widziałeś tych ostrzeżeń?" :) –

+0

@Eugene Dzięki za wysiłek, ale mój SBT zbudowany nadal się nie udaje (zobacz log w UPDATE). Jakieś pomysły? –

+3

@SergeyBushmanov: Użyj '" io.netty "%" netty "%" 3.9.9.Final "', następnie uruchom 'reload' i' update' w konsoli 'sbt'. – chunjef

4

W sbt Spark zwykle z zależności Provided, to

"org.apache.spark" %% "spark-core" % sparkVersion % Provided 

może ciągnąc niepotrzebnych sprzecznych rekurencyjnych zależności.

1

Jeśli wszystko działa poprawnie, można wyłączyć te ostrzeżenia, dodając to, aby zbudować ustawienia:

evictionWarningOptions in update := EvictionWarningOptions.default 
.withWarnTransitiveEvictions(false)