如何在 oozie 4.2.0 上运行火花动作(pyspark 脚本)?

Posted

技术标签:

【中文标题】如何在 oozie 4.2.0 上运行火花动作(pyspark 脚本)?【英文标题】:How to run a spark action (a pyspark script) on oozie 4.2.0? 【发布时间】:2017-05-26 04:10:16 【问题描述】:

当我将 python 脚本作为 jar 提交以在 oozie 中触发操作时,我看到以下错误:

Traceback (most recent call last):
  File "/home/hadoop/spark.py", line 5, in <module>
    from pyspark import SparkContext, SparkConf
ImportError: No module named pyspark
Intercepting System.exit(1)

虽然我可以看到 pyspark 库存在于我的本地 FS 上:

$ ls /usr/lib/spark/python/pyspark/
accumulators.py     heapq3.py           rdd.py              statcounter.py
broadcast.py        __init__.py         rddsampler.py       status.py
cloudpickle.py      java_gateway.py     resultiterable.py   storagelevel.py
conf.py             join.py             serializers.py      streaming/
context.py          ml/                 shell.py            tests.py
daemon.py           mllib/              shuffle.py          traceback_utils.py
files.py            profiler.py         sql/                worker.py

我知道在像https://issues.apache.org/jira/browse/OOZIE-2482 这样的 oozie 上运行 pyspark 存在问题,但我看到的错误与 JIRA 票证不同。

我还在我的工作流定义中将--conf spark.yarn.appMasterEnv.SPARK_HOME=/usr/lib/spark --conf spark.executorEnv.SPARK_HOME=/usr/lib/spark 传递为spark-opts

这是我的示例应用程序供参考:

job.properties

masterNode ip-xxx-xx-xx-xx.ec2.internal
nameNode hdfs://$masterNode:8020
jobTracker $masterNode:8032
master yarn
mode client
queueName default
oozie.libpath $nameNode/user/oozie/share/lib
oozie.use.system.libpath true
oozie.wf.application.path /user/oozie/apps/

workflow.xml(位于 $nameNode/user/oozie/apps/)

<workflow-app name="spark-wf" xmlns="uri:oozie:workflow:0.5"> 
    <start to="spark-action-test"/> 
    <action name="spark-action-test"> 
        <spark xmlns="uri:oozie:spark-action:0.1"> 
            <job-tracker>$jobTracker</job-tracker> 
            <name-node>$nameNode</name-node> 
            <configuration>  
                <property> 
                    <name>mapred.compress.map.output</name> 
                    <value>true</value> 
                </property> 
            </configuration> 
            <master>$master</master> 
            <mode>$mode</mode>
            <name>Spark Example</name>
            <jar>/home/hadoop/spark.py</jar>
            <spark-opts>--driver-memory 512m --executor-memory 512m --num-executors 4 --conf spark.yarn.appMasterEnv.SPARK_HOME=/usr/lib/spark --conf spark.executorEnv.SPARK_HOME=/usr/lib/spark --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=/usr/lib/spark/python --conf spark.executorEnv.PYTHONPATH=/usr/lib/spark/python --files $nameNode/user/oozie/apps/hive-site.xml</spark-opts>
        </spark> 
        <ok to="end"/> 
        <error to="kill"/> 
    </action> 
    <kill name="kill"> 
        <message>Action failed, error message[$wf:errorMessage(wf:lastErrorNode())]</message> 
    </kill> 
    <end name="end"/> 
</workflow-app>

spark.py(在 /home/hadoop/)

# sc is an existing SparkContext.
from pyspark import SparkContext, SparkConf
from pyspark.sql import HiveContext
conf = SparkConf().setAppName('test_pyspark_oozie')
sc = SparkContext(conf=conf)

sqlContext = HiveContext(sc)


sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")

按照这里的建议 - http://www.learn4master.com/big-data/pyspark/run-pyspark-on-oozie,我也确实将以下两个文件放在了我的 $nameNode/user/oozie/share/lib 文件夹下:py4j-0.9-src.zip pyspark.zip。

我正在使用单节点 YARN 集群 (AWS EMR) 并试图找出我可以在我的 oozie 应用程序中将这些 pyspark 模块传递给 python。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

你得到No module named error,因为你没有在你的配置中提到PYTHONPATH。在--conf 中再添加一行PYTHONPATH=/usr/lib/spark/python。我不知道如何在 oozie 工作流定义中设置此 PYTHONPATH,但通过在您的配置中添加 PYTHONPATH 属性肯定会解决您的问题。

【讨论】:

以上是关于如何在 oozie 4.2.0 上运行火花动作(pyspark 脚本)?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Oozie 永久运行 Sqoop 作业

在 oozie shell 动作中运行 pig

Oozie Spark 操作工作流无法启动

Oozie Pig 动作卡在 PREP 状态,作业处于 RUNNING 状态

带有 oozie 工作流程的猪

Oozie Spark (2.x) 动作总是卡在接受状态