J'essaie de construire un projet Scala/Spark dans IntelliJ Idea avec le build.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
)
et obtenir un tas d'avertissements:
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
J'ai plusieurs questions, peut-être stupides:
build.sbt
(ajouter d'autres résolveurs, par exemple?), afin que je puisse me débarrasser des avertissements?Existe-t-il un meilleur moyen de structurer build.sbt (ajouter d'autres résolveurs, par exemple?), Afin de pouvoir me débarrasser des avertissements?
Une façon consiste à dire manuellement à sbt quelles dépendances vous préférez, pour votre cas:
dependencyOverrides ++= Set(
"io.netty" % "netty" % "3.9.9.Final",
"commons-net" % "commons-net" % "2.2",
"com.google.guava" % "guava" % "11.0.2"
)
Je recommande également de lire sur gestion des conflits dans sbt .
Dois-je me soucier des avertissements?
Dans votre cas - non, car vos conflits proviennent de l'utilisation uniquement d'artefacts liés aux étincelles publiés sous la même version. Spark est un projet avec une grande base d'utilisateurs et la possibilité d'un enfer de jar introduit en raison de dépendances transitives est plutôt faible (bien que, techniquement, ce ne soit pas garanti).
Dans le cas général - peut-être. En règle générale, cela est correct dans la plupart des cas, mais il existe une petite possibilité de problème qui peut nécessiter une résolution manuelle des dépendances (si cela est possible). Dans ces cas, il est vraiment difficile de dire s'il y a un problème avant d'exécuter votre application et de rencontrer un problème comme une classe, une méthode, une signature de méthode non concordante ou un problème lié à la réflexion.
Dans sbt
, Spark est normalement répertorié comme une dépendance Provided
, c'est-à-dire,
"org.Apache.spark" %% "spark-core" % sparkVersion % Provided
Vous pouvez tirer des dépendances récursives inutiles et conflictuelles.
Si tout fonctionne correctement, vous pouvez désactiver ces avertissements en ajoutant ceci aux paramètres de construction:
evictionWarningOptions in update := EvictionWarningOptions.default
.withWarnTransitiveEvictions(false)