Если кто-то хочет веб-решение, я сделал простой сайт, который преобразует классы C # DTO в интерфейсы машинописного текста. http://dto2ts.ga/ (Это еще не ошибка)
При создании и развертывании приложений Spark все зависимости требуют совместимых версий.
build.sbt
: name := "Simple Project"
version := "1.0"
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.11" % "2.0.1",
"org.apache.spark" % "spark-streaming_2.10" % "2.0.1",
"org.apache.bahir" % "spark-streaming-twitter_2.11" % "2.0.1"
)
Мы используем spark-streaming
для Scala 2.10, а оставшиеся пакеты для Scala 2.11. Допустимым файлом может быть name := "Simple Project"
version := "1.0"
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.11" % "2.0.1",
"org.apache.spark" % "spark-streaming_2.11" % "2.0.1",
"org.apache.bahir" % "spark-streaming-twitter_2.11" % "2.0.1"
)
, но лучше указать версию по всему миру и использовать %%
: name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.7"
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.0.1",
"org.apache.spark" %% "spark-streaming" % "2.0.1",
"org.apache.bahir" %% "spark-streaming-twitter" % "2.0.1"
)
Аналогично в Maven: <project>
<groupId>com.example</groupId>
<artifactId>simple-project</artifactId>
<modelVersion>4.0.0</modelVersion>
<name>Simple Project</name>
<packaging>jar</packaging>
<version>1.0</version>
<properties>
<spark.version>2.0.1</spark.version>
</properties>
<dependencies>
<dependency> <!-- Spark dependency -->
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.bahir</groupId>
<artifactId>spark-streaming-twitter_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
</dependencies>
</project>
name := "Simple Project"
version := "1.0"
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.11" % "1.6.1",
"org.apache.spark" % "spark-streaming_2.10" % "2.0.1",
"org.apache.bahir" % "spark-streaming-twitter_2.11" % "2.0.1"
)
Мы используем spark-core
1.6, в то время как остальные компоненты находятся в Spark 2.0. Допустимым файлом может быть name := "Simple Project"
version := "1.0"
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.11" % "2.0.1",
"org.apache.spark" % "spark-streaming_2.10" % "2.0.1",
"org.apache.bahir" % "spark-streaming-twitter_2.11" % "2.0.1"
)
, но лучше использовать переменную: name := "Simple Project"
version := "1.0"
val sparkVersion = "2.0.1"
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.11" % sparkVersion,
"org.apache.spark" % "spark-streaming_2.10" % sparkVersion,
"org.apache.bahir" % "spark-streaming-twitter_2.11" % sparkVersion
)
Аналогично в Maven: <project>
<groupId>com.example</groupId>
<artifactId>simple-project</artifactId>
<modelVersion>4.0.0</modelVersion>
<name>Simple Project</name>
<packaging>jar</packaging>
<version>1.0</version>
<properties>
<spark.version>2.0.1</spark.version>
<scala.version>2.11</scala.version>
</properties>
<dependencies>
<dependency> <!-- Spark dependency -->
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.bahir</groupId>
<artifactId>spark-streaming-twitter_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
</dependencies>
</project>
--jars
аргумент для spark-submit
- для распространения локальных файлов jar
. --packages
для spark-submit
- для получения зависимостей из репозитория Maven. При отправке в узел кластера вы должны включить приложение jar
в --jars
. Классы зависимостей вашего приложения должны быть указаны в параметре application-jar вашей команды запуска.
Более подробную информацию можно найти в документации Spark
. Из документации:
application-jar: Путь к объединенной банке, включая ваше приложение и все зависимости. URL-адрес должен быть глобально видимым внутри вашего кластера, например, путь hdfs: // или путь к файлу: //, который присутствует на всех узлах
Я думаю, что эта проблема должна решить плагин сборки. Вам нужно построить жирную банку. Например, в sbt:
$PROJECT_ROOT/project/assembly.sbt
с кодом addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.0")
added some libraries
libraryDependencies ++ = Seq ("com.some. компания "%%" some-lib "%" 1.0.0 ")` . Если вам нужно дополнительную информацию, перейдите к https://github.com/sbt/sbt-assembly
Путь классов Apache Spark построен динамически (для размещения кода пользователя для каждого приложения), что делает его уязвимым для таких проблем. @ user7337271 ответ правильный, но есть еще несколько проблем, в зависимости от используемого вами менеджера кластера («мастер»).
Во-первых, приложение Spark состоит из из этих компонентов (каждый из них является отдельным JVM, поэтому потенциально содержит разные классы в его пути к классам):
SparkSession
(или SparkContext
) и подключение к диспетчеру кластера для выполнения фактической работы Соотношение между ними описано на этой диаграмме из обзора режима кластера Apache Spark :
Теперь - какие классы должны находиться в каждом из этих компонентов?
На это может ответить следующая диаграмма:
Давайте разберем это медленно:
Теперь, когда мы получили это прямо, как мы получаем, чтобы классы правильно загружались в каждом компоненте, и какими правилами они должны следовать?
spark.yarn.archive
или spark.yarn.jars
параметры при использовании YARN). Банки / архив, которые вы предоставляете, должны включать все зависимости Spark (включая транзитивные зависимости), и они будут отправляться диспетчером кластера каждому исполнителю при запуске приложения. spark.jars
. Подводя итог, рассмотрим предлагаемый подход к созданию и развертыванию Spark Application (в данном случае - с использованием YARN):
spark.jars
при запуске SparkSession
lib/
загруженных двоичных файлов Spark в качестве значения spark.yarn.archive