Добавить 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]")
.
.
.