Hadoop Oozie Pypspark工作
我有非常简单的工作流程Hadoop Oozie Pypspark工作,hadoop,apache-spark,pyspark,oozie,Hadoop,Apache Spark,Pyspark,Oozie,我有非常简单的工作流程 <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-tra
<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>
我认为这是权限问题,所以我将hdfs文件夹-chmod 777和我的本地文件夹也设置为chmod 777
我使用的是spark 1.6。当我通过spark submit运行脚本时,一切都很好(甚至是读/写hdfs或hive的更复杂的脚本)
编辑:我试过了
不幸的是,Oozie Spark action只支持Java工件,因此您必须指定主类(该错误消息很难解释)。所以你有两个选择:
将代码重写为Java/Scala
使用自定义动作或脚本,如
(我没有测试它)
可以使用spark action
来运行python脚本,但必须将spark的python API
路径作为参数传递。此外,文件的第一行必须是:
#!/usr/bin/env python.
- 1:尝试使用getOpt
在你的财产里
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")
试试看:
参数,args=getopt.getopt(sys.argv[1:],“f:i:”,[“fuente=”,“id=”)
如果len(参数)<2:
打印(“不完整的论证”)
系统出口(1)
除getopt.GetoptError外:
打印(“论证错误”)
系统出口(2)
对于opt,参数中的arg:
如果选择加入(“-f”,即“--fuente”):
nom_fuente=str(arg).strip()
elif选择加入(“-i”,“-id”):
id_proceso=str(arg).strip()
其他:
打印(“参数”“选择+”‘不重新确认”)
在您的工作流程中
<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>
${nameNode}/${workflowRoot}/${appDir}/lib/GeneradorDeInsumos.py
--队列${queueName}
--num执行者40
--执行器核心2
--执行器存储器8g
-f${fuente}
-i${wf:id()}
并输出“vuala”
Fuente:BURO_CONCENTRADO
Contexto:<pyspark.context.SparkContext object at 0x7efd80424090>
id_workflow:0062795-190808055847737-oozie-oozi-W
Fuente:BURO_CONCENTRADO
上下文:
id_工作流:0062795-190808055847737-oozie-oozi-W
以python scrip作为参数运行shell脚本是我最初的想法,但这是行不通的。我希望,现在是:)谢谢你证实我的想法。无论如何,这很奇怪,因为在我发现的文档中:jar元素表示一个以逗号分隔的jar或python文件列表。
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>
Fuente:BURO_CONCENTRADO
Contexto:<pyspark.context.SparkContext object at 0x7efd80424090>
id_workflow:0062795-190808055847737-oozie-oozi-W