Добавить Jar в автономный pyspark

Я запускаю программу pyspark:

$ export SPARK_HOME=
$ export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip
$ python

И код py:

from pyspark import SparkContext, SparkConf

SparkConf().setAppName("Example").setMaster("local[2]")
sc = SparkContext(conf=conf)

Как добавить jar-зависимости, например, databricks csv jar? Используя командную строку, я могу добавить пакет следующим образом:

$ pyspark/spark-submit --packages com.databricks:spark-csv_2.10:1.3.0 

Но я не использую ни одного из них. Программа является частью большого рабочего процесса, который не использует spark-submit. Я должен иметь возможность запускать мою. /foo.py программу, и она должна работать.

  • Я знаю, что вы можете установить свойства искры для extraClassPath, но вам нужно скопировать файлы JAR на каждый узел?
  • Пробовал conf.set("spark.jars", "jar1, jar2"), который тоже не работал с исключением py4j CNF

Ответ 1

Любые зависимости могут быть переданы с использованием параметра spark.jars.packages ( spark.jars должен работать свойство $SPARK_HOME/conf/spark-defaults.conf) в параметре $SPARK_HOME/conf/spark-defaults.conf. Это должен быть список координат, разделенный запятыми.

И свойства пакета или classpath должны быть установлены до запуска JVM, и это происходит во SparkConf инициализации SparkConf. Это означает, что метод SparkConf.set не может быть использован здесь.

Альтернативный подход заключается в установке PYSPARK_SUBMIT_ARGS переменных окружений перед SparkConf инициализации объекта:

import os
from pyspark import SparkConf

SUBMIT_ARGS = "--packages com.databricks:spark-csv_2.11:1.2.0 pyspark-shell"
os.environ["PYSPARK_SUBMIT_ARGS"] = SUBMIT_ARGS

conf = SparkConf()
sc = SparkContext(conf=conf)

Ответ 2

Здесь много подходов (установка ENV vars, добавление к $SPARK_HOME/conf/spark-defaults.conf и т.д.), некоторые ответы уже охватывают их. Я хотел добавить дополнительный ответ для тех, кто использует Jupyter Notebooks, и создать сеанс Spark из ноутбука. Здесь решение, которое наилучшим образом помогло мне (в моем случае я хотел, чтобы пакет Kafka загрузился):

spark = SparkSession.builder.appName('my_awesome')\
    .config('spark.jars.packages', 'org.apache.spark:spark-sql-kafka-0-10_2.11:2.2.0')\
    .getOrCreate()

Используя эту строку кода, мне не нужно было ничего делать (никаких изменений в ENV или conf).

Ответ 3

Наконец нашел ответ после нескольких попыток. Ответ специфичен для использования искро-ЦСВ-банки. Создайте папку на жестком диске D:\Spark\spark_jars. Поместите там следующие банки:

  • spark-csv_2.10-1.4.0.jar(это версия, которую я использую)
  • Обще-CSV-1.1.jar
  • однозначность-парсеры-1.5.1.jar

2 и 3 - зависимости, требуемые от spark-csv, поэтому эти два файла также необходимо загрузить. Перейдите в каталог conf, где вы загрузили Spark. В файле spark-defaults.conf добавьте строку:

spark.driver.extraClassPath D:/Spark/spark_jars/*

Звездочка должна содержать все банки. Теперь запустите Python, создайте SparkContext, SQLContext, как обычно. Теперь вы должны иметь возможность использовать spark-csv как

sqlContext.read.format('com.databricks.spark.csv').\
options(header='true', inferschema='true').\
load('foobar.csv')

Ответ 4

Я столкнулась с аналогичной проблемой для другой jar ( "MongoDB разъем для Спарк", mongo-spark-connector), но большой нюанс в том, что я установил Spark с помощью pyspark в conda (conda install pyspark). Поэтому вся помощь для ответов Spark -specific была не совсем полезной. Для тех, кто вы устанавливаете с conda, вот процесс, который я объединил:

1) Найдите, где pyspark/jars ваши pyspark/jars. Мины были на этом пути: ~/anaconda2/pkgs/pyspark-2.3.0-py27_0/lib/python2.7/site-packages/pyspark/jars.

2) Загрузите файл jar в путь, найденный на шаге 1, из этого местоположения.

3) Теперь вы должны иметь возможность запускать что-то вроде этого (код, взятый из официального учебника MongoDB, используя ответ Брифорда Уайли выше):

from pyspark.sql import SparkSession

my_spark = SparkSession \
    .builder \
    .appName("myApp") \
    .config("spark.mongodb.input.uri", "mongodb://127.0.0.1:27017/spark.test_pyspark_mbd_conn") \
    .config("spark.mongodb.output.uri", "mongodb://127.0.0.1:27017/spark.test_pyspark_mbd_conn") \
    .config('spark.jars.packages', 'org.mongodb.spark:mongo-spark-connector_2.11:2.2.2') \
    .getOrCreate()

Отказ от ответственности:

1) Я не знаю, является ли этот ответ правильным местом /SO-вопросом, чтобы поставить это; пожалуйста, сообщите о лучшем месте, и я его переведу.

2) Если вы считаете, что я ошибался или у меня есть улучшения в описанном выше процессе, прокомментируйте и я буду пересматривать.

Ответ 5

import os
import sys
spark_home = os.environ.get('SPARK_HOME', None)
sys.path.insert(0, spark_home + "/python")
sys.path.insert(0, os.path.join(spark_home, 'python/lib/py4j-0.10.4-src.zip'))

Вот оно.

sys.path.insert(0, <PATH TO YOUR JAR>)

Тогда...

import pyspark
import numpy as np

from pyspark import SparkContext

sc = SparkContext("local[1]")
.
.
.