2017-02-21 26 views
0

Если я хочу использовать библиотеку python для конкретной задачи, например NLTK или BeautifulSoup, я могу это сделать, когда я использую Spark на моей локальной машине, но то же самое не делает работайте с Spark на YARN.Как сделать работу библиотеки Python на Spark YARN

Вот пример кода:

from pyspark.sql.functions import udf 
from pyspark.sql.types import StringType 

def html_parsing(x): 
    """ Cleans the text from Data Frame text column""" 

    textcleaned='' 
    #if row['desc'] is not None: 
    souptext=BeautifulSoup(x) 
    #souptext=BeautifulSoup(text) 
    p_tags=souptext.find_all('p') 
    for p in p_tags: 
     if p.string: 
      textcleaned+=p.string 
    #print textcleaned 
    #ret_list= (int(row['id']),row['title'],textcleaned) 

    return textcleaned 


parse_html=udf(html_parsing,StringType()) 

sdf_cleaned=sdf_rss.dropna(subset=['desc']).withColumn('text_cleaned',parse_html('desc'))\ 
.select('id','title','text_cleaned') 

sdf_cleaned.cache().take(3) 

Этот код работает на моем локальном Спарк и убирает теги HTML. Однако, когда я запускаю его на Спарк на ПРЯЖИ, он не работает, и говорит следующее:

File "/var/storage/nm-sdl1/nm-local/usercache/appcache/application_1485803993783_0664/container_1485803993783_0664_01_000002/pyspark.zip/pyspark/serializers.py", line 422, in loads 
    return pickle.loads(obj) 
ImportError: No module named bs4 

    at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:193) 
    at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:234) 
    at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:152) 
    at org.apache.spark.sql.execution.python.BatchEvalPythonExec$$anonfun$doExecute$1.apply(BatchEvalPythonExec.scala:124) 

Все эти пакеты установлены на моем Anaconda установлен на кластере. Однако я думаю, проблема может заключаться в том, что этот пакет недоступен для исполнителей. Моя догадка.

Любая идея, как мы можем сделать любой пакет python на Spark на YARN?

Просьба сообщить.

ответ

0

Я предполагаю, что вам нужно указать переменную окружения PYSPARK_PYTHON, чтобы указать на ваш путь анаконды.

По умолчанию Spark будет искать первый исполняемый файл python, который он находит в пути. Как правило, это будет установка системы python (например, /usr/bin/python). Чтобы pyspark знал, где установлен дистрибутив anaconda, вам необходимо установить переменную PYSPARK_PYTHON. Например, выполните export PYSPARK_PYTHON=/path/to/anaconda/bin/python перед запуском скрипта python или запустите pyspark.

+0

Не могли бы вы немного подробнее рассказать? Я не уверен, что получил это. У меня установлена ​​библиотека в анаконде. Но если я использую это в Spark on Yarn, я не думаю, что библиотека доступна исполнителям. Итак, как я могу сделать это доступным, чтобы он мог работать на исполнителях и на блоке RDD? Я думаю, это то, что заставило его сказать «Нет модуля bs4» – Baktaawar

+0

@Baktaawar см. Обновленный ответ – santon

+0

Ну Pyspark использует только Anaconda python. Оболочка Pyspark использует это, и я это вижу. Его набор в моем профиле bash тоже – Baktaawar