Предупреждения при построении Scala/Проект Spark с SBT
Я пытаюсь создать проект Scala/Spark в IntelliJ Idea со следующим 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
)
и получить кучу предупреждений:
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
У меня есть несколько, возможно, немых вопросов:
- Есть ли лучший способ структурирования
build.sbt
(добавить другие резольверы, например?), чтобы я мог избавиться от предупреждений?
- Должен ли я вообще беспокоиться о предупреждениях?
Ответы
Ответ 1
Есть ли лучший способ структурирования build.sbt(добавить другие резольверы, например?), чтобы я мог избавиться от предупреждений?
Один из способов - вручную указать sbt зависимости, которые вы предпочитаете, для вашего случая:
dependencyOverrides ++= Set(
"io.netty" % "netty" % "3.9.9.Final",
"commons-net" % "commons-net" % "2.2",
"com.google.guava" % "guava" % "11.0.2"
)
Я также рекомендую прочитать управление конфликтами в sbt.
Должен ли я вообще беспокоиться о предупреждениях?
В вашем случае - нет, поскольку ваши конфликты связаны с использованием только искровых артефактов, выпущенных в той же версии. Spark - это проект с большой пользовательской базой, и возможность появления jar-ада из-за транзитивных зависимостей довольно низка (хотя технически не гарантируется).
В общем случае - может быть. Обычно это нормально в большинстве случаев, но есть небольшая возможность проблемы, которая может потребовать тщательного ручного разрешения зависимостей (если это вообще возможно). В этих случаях очень сложно определить, есть ли проблема перед запуском приложения и столкнуться с какой-либо проблемой, например, отсутствием класса, метода, сигнатуры метода несоответствия или некоторой проблемы, связанной с отражением.
Ответ 2
В sbt
Spark обычно указывается как зависимость Provided
, т.е.
"org.apache.spark" %% "spark-core" % sparkVersion % Provided
Возможно, вы занимаетесь ненужными и противоречивыми рекурсивными зависимостями.