如果我想将一个python库用于特定任务,比如NLTK或BeautifulSoup,我可以在我的本地机器上使用Spark时这样做,但同样的事情并不适用于YARN上的Spark。
以下是示例代码:
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标记。但是,当我在YARN上的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)
所有这些软件包都安装在集群上安装的Anaconda上。但是我想问题可能是这个包在执行器上不可用。我的预感
知道如何让任何python包在YARN上的Spark上运行吗?
请指教。
答案 0 :(得分:0)
我的猜测是你需要指出/usr/bin
环境变量指向你的anaconda路径。
默认情况下,Spark会查找它在路径中找到的第一个python可执行文件。通常,这将是python的系统安装(例如PYSPARK_PYTHON
)。要让pyspark知道您的anaconda发行版的安装位置,您需要设置/usr/bin/python
变量。例如,在运行python脚本或运行PYSPARK_PYTHON
之前执行export PYSPARK_PYTHON=/path/to/anaconda/bin/python
。