如果我想爲特定的任務使用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上工作?
請指教。
你能詳細解釋一下嗎?我不確定我是否明白。我在anaconda中安裝了該庫。但是如果我在紗線上使用Spark,我不認爲這個庫可用於執行者。那麼,如何使其可用,以便它可以在執行者和RDD塊上工作?我想這就是導致它說「沒有模塊BS4」 – Baktaawar
@Baktaawar看到更新的答案 – santon
Pyspark只使用Anaconda python。 Pyspark外殼使用它,我可以看到。其設置在我的bash配置文件中 – Baktaawar