如何在 oozie 4.2.0 上 运行 一个 spark 动作(一个 pyspark 脚本)?
How to run a spark action (a pyspark script) on oozie 4.2.0?
当我将 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
我知道 oozie 上的 运行 pyspark 存在问题,例如 https://issues.apache.org/jira/browse/OOZIE-2482,但我看到的错误与 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,我也确实把下面两个文件:py4j-0.9-src.zip pyspark.zip,放在我的${nameNode}/user/oozie/share/lib下面文件夹。
我正在使用单节点 YARN 集群 (AWS EMR) 并试图找出我可以将这些 pyspark 模块传递到我的 oozie 应用程序中的 python。任何帮助表示赞赏。
您得到 No module named error
因为您没有在您的配置中提到 PYTHONPATH
。用 PYTHONPATH=/usr/lib/spark/python
在 --conf
中再添加一行。我不知道如何在 oozie 工作流定义中设置这个 PYTHONPATH
但是通过在你的配置中添加 PYTHONPATH
属性 肯定会解决你的问题。
当我将 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
我知道 oozie 上的 运行 pyspark 存在问题,例如 https://issues.apache.org/jira/browse/OOZIE-2482,但我看到的错误与 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,我也确实把下面两个文件:py4j-0.9-src.zip pyspark.zip,放在我的${nameNode}/user/oozie/share/lib下面文件夹。
我正在使用单节点 YARN 集群 (AWS EMR) 并试图找出我可以将这些 pyspark 模块传递到我的 oozie 应用程序中的 python。任何帮助表示赞赏。
您得到 No module named error
因为您没有在您的配置中提到 PYTHONPATH
。用 PYTHONPATH=/usr/lib/spark/python
在 --conf
中再添加一行。我不知道如何在 oozie 工作流定义中设置这个 PYTHONPATH
但是通过在你的配置中添加 PYTHONPATH
属性 肯定会解决你的问题。