spark-submit
принимает несколько параметров, представляющих интерес. --packages
и --jars
. Вы можете добавить свой заказ .jar
в --jars
. Вы можете передать координаты maven в --packages
. Что-то вроде:
spark-submit ... --packages org.apache.spark:spark-streaming-kafka_2.10:1.6.0,org.apache.kafka:kafka_2.10:0.8.2.0 --jars localpath/to/your.jar
Они работают в spark-shell
, так что вы можете развернуть ваш пользовательский jar
файлы и любые внешние зависимости при использовании REPL
.
Если у вас есть особенно большой файл jar
, вы можете использовать SparkContext.addJar
, чтобы добавить его в контекст. Однако это боль для поддержания. Чтобы действительно эффективно это сделать, вам нужно будет развернуть JAR-файл на HDFS и убедиться, что HDFS реплицирует его среди всех ваших узлов - если HDFS имеет только файл JAR на одном узле, вы вернетесь туда, где вы начали. И что вы делаете в отношении контроля версий? Если вы измените файл JAR
, скорее всего, вам нужно сохранить старый, если на него были закодированы какие-либо задания, поэтому вам нужно будет иметь несколько версий в HDFS. Собираетесь ли вы перекомпилировать другие задания для использования новой версии? Хорошая вещь о --packages
и --jars
заключается в том, что беспорядок из всего этого предназначен для вас.
Но если ваш пользовательский JAR достаточно велик, чтобы гарантировать, что вы можете включить его через SparkContext.addJar
, однако, как я уже сказал, это не стандартный способ сделать это. Даже полуядерные расширения Spark, такие как spark-streaming-kafka
, поставляются через опцию --packages
.
Когда вы говорите * «Некоторый код Scala, который вызывает родные библиотеки» *, вы имеете в виду, что код запускается внутри задания Spark? –
Этот код должен быть доступен для вызова из Spark. Я отредактирую вопрос, чтобы уточнить. –
Вы хотите использовать внешнюю библиотеку из своей работы Spark? Рассматривали ли вы его упаковку внутри uber JAR вашей работы? –