如何使Python库在Spark YARN上运行

时间:2017-02-21 23:17:24

标签: python apache-spark pyspark

如果我想将一个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上运行吗?

请指教。

1 个答案:

答案 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