我的工作流程非常简单。
<workflow-app name="testSparkjob" xmlns="uri:oozie:workflow:0.5">
<start to="testJob"/>
<action name="testJob">
<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>local[*]</master>
<name>Spark Example</name>
<jar>mapping.py</jar>
<spark-opts>--executor-memory 1G --num-executors 3
--executor-cores 1 </spark-opts>
<arg>argument1</arg>
<arg>argument2</arg>
</spark>
<ok to="end"/>
<error to="killAction"/>
</action>
<kill name="killAction">
<message>"Killed job due to error"</message>
</kill>
<end name="end"/>
</workflow-app>
Spark脚本几乎没有任何作用:
if len(sys.argv) < 2:
print('You must pass 2 parameters ')
#just for testing, later will be discarded, sys.exit(1) will be used.")
ext = 'testArgA'
int = 'testArgB'
#sys.exit(1)
else:
print('arguments accepted')
ext = sys.argv[1]
int = sys.argv[2]
该脚本位于hdfs与workflow.xml相同的文件夹中。
当我退出工作流程时出现以下错误
Launcher ERROR, reason: Main class
[org.apache.oozie.action.hadoop.SparkMain], exit code [2]
我认为是权限问题,所以我将hdfs文件夹-chmod 777和我的本地文件夹也设置为chmod 777 我正在使用spark 1.6。当我通过spark-submit运行脚本时,一切都很好(甚至更复杂的脚本可读/写hdfs或hive)。
编辑:我试过了this
<action name="forceLoadFromLocal2hdfs">
<shell xmlns="uri:oozie:shell-action:0.3">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>driver-script.sh</exec>
<!-- single -->
<argument>s</argument>
<!-- py script -->
<argument>load_local_2_hdfs.py</argument>
<!-- local file to be moved-->
<argument>localFilePath</argument>
<!-- hdfs destination folder, be aware of, script is deleting existing folder! -->
<argument>hdfsPath</argument>
<file>${workflowRoot}driver-script.sh</file>
<file>${workflowRoot}load_local_2_hdfs.py</file>
</shell>
<ok to="end"/>
<error to="killAction"/>
workkflow已成功,但该文件未复制到hdfs。没有错误。这个脚本本身就可以工作了。更多here。
答案 0 :(得分:1)
不幸的是,Oozie Spark动作仅支持Java工件,因此您必须指定主类(该错误消息几乎不尝试解释)。所以你有两个选择:
答案 1 :(得分:1)
在您的财产中
fuente=BURO_CONCENTRADO
代码.py
try:
parametros, args = getopt.getopt(sys.argv[1:], "f:i:", ["fuente=", "id="])
if len(parametros) < 2:
print("Argumentos incompletos")
sys.exit(1)
except getopt.GetoptError:
print("Error en los argumentos")
sys.exit(2)
for opt, arg in parametros:
if opt in ("-f", "--fuente"):
nom_fuente = str(arg).strip()
elif opt in ("-i", "--id"):
id_proceso = str(arg).strip()
else:
print("Parametro '" + opt + "' no reconocido")
在您的工作流程中
<jar>${nameNode}/${workflowRoot}/${appDir}/lib/GeneradorDeInsumos.py</jar>
<spark-opts>
--queue ${queueName}
--num-executors 40
--executor-cores 2
--executor-memory 8g
</spark-opts>
<arg>-f ${fuente}</arg>
<arg>-i ${wf:id()}</arg>
并输出'vuala'
Fuente:BURO_CONCENTRADO
Contexto:<pyspark.context.SparkContext object at 0x7efd80424090>
id_workflow:0062795-190808055847737-oozie-oozi-W
答案 2 :(得分:0)
您可以使用spark-action
来运行python脚本,但是必须将Spark的Python API
路径作为参数传递。此外,文件的第一行必须是这样的:
#!/usr/bin/env python.