2017-02-21 44 views
0

如果我想爲特定的任務使用python庫,比如NLTK或BeautifulSoup,我可以在我的本地機器上使用Spark的時候這樣做,但同樣的事情不會在YARN上與Spark一起工作。如何使Spark庫上的Python庫工作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) 

此代碼的工作在我的本地Spark和清潔的HTML標記。然而,當我在紗線上的Spark運行它,它不工作,說以下內容:

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) 

所有這些包都安裝在我的蟒蛇安裝集羣。不過,我想這個問題可能是這個包在執行器上不可用。我的直覺。

任何想法如何我們可以使任何python包在Spark上在YARN上工作?

請指教。

回答

0

我的猜測是你需要指出PYSPARK_PYTHON環境變量指向你的anaconda路徑。

默認情況下,Spark將查找它在路徑中找到的第一個python可執行文件。通常,這將是python的系統安裝(例如/usr/bin/python)。爲了讓pyspark知道你的anaconda分佈安裝在哪裏,你需要設置PYSPARK_PYTHON變量。例如,在運行python腳本或運行pyspark之前執行export PYSPARK_PYTHON=/path/to/anaconda/bin/python

+0

你能詳細解釋一下嗎?我不確定我是否明白。我在anaconda中安裝了該庫。但是如果我在紗線上使用Spark,我不認爲這個庫可用於執行者。那麼,如何使其可用,以便它可以在執行者和RDD塊上工作?我想這就是導致它說「沒有模塊BS4」 – Baktaawar

+0

@Baktaawar看到更新的答案 – santon

+0

Pyspark只使用Anaconda python。 Pyspark外殼使用它,我可以看到。其設置在我的bash配置文件中 – Baktaawar

相關問題