2016-04-22 2 views
0

Если у меня есть пользовательская библиотека (закодированная в Scala, но она внутренне вызывает собственные библиотеки через JNI), то какой способ развернуть ее на рабочих узлах Apache Spark, чтобы ее могли использовать другие приложения в кластере? В принципе, я хочу расширить Spark с помощью моей настраиваемой функциональности, чтобы любая работа могла ее использовать.Как развернуть пользовательские библиотеки в Apache Spark?

Насколько я понимаю, spark-submit - для подачи работ, так что это не то, что я хочу.

Если я упакую родные библиотеки в банке, то Context.addJar() собирается сделать трюк? Мне пришлось бы распаковывать собственные библиотеки во время выполнения в какой-то временный каталог для работы - это даже вариант в среде Spark?

Заранее спасибо.

+0

Когда вы говорите * «Некоторый код Scala, который вызывает родные библиотеки» *, вы имеете в виду, что код запускается внутри задания Spark? –

+0

Этот код должен быть доступен для вызова из Spark. Я отредактирую вопрос, чтобы уточнить. –

+0

Вы хотите использовать внешнюю библиотеку из своей работы Spark? Рассматривали ли вы его упаковку внутри uber JAR вашей работы? –

ответ

3

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.

+0

Будет ли это развертывать мою библиотеку так, чтобы она могла использоваться другими заданиями? Я не пытаюсь запустить свою собственную работу, но расширить Spark, чтобы все задания могли вызвать мою библиотеку. –

+0

Это другие задания, которые должны использовать команды в этом ответе. Так вы позволяете им разворачивать свой собственный код - вы даете им свою банку и позволяете им выполнять свою команду, как указано выше (с помощью «--jars»), или вы создаете артефакт «maven» и даете им координаты. Если вы посмотрите в моем примере, 'spark-streaming-kafka' является расширением Spark. Вы пытаетесь сделать именно то, что он делает - расширение Spark - и это стандартный способ сделать это. –

+0

Но не будет ли скопление jar на каждой новой задаче? В идеале я бы установил его на каждом рабочем узле и был готов к использованию другими заданиями. –

Смежные вопросы