【问题标题】:Oozie pyspark jobOozie pyspark 工作
【发布时间】:2017-07-25 15:09:53
【问题描述】:

我的工作流程非常简单。

<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 我正在使用火花 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"/>

工作流成功,但文件未复制到 hdfs。没有错误。该脚本确实可以自行工作。更多here

【问题讨论】:

    标签: hadoop apache-spark pyspark oozie


    【解决方案1】:
    • 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")
    

    在您的工作流程中

                    <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】:

      不幸的是,Oozie Spark 操作仅支持 Java 工件,因此您必须指定主类(该错误消息几乎无法解释)。所以你有两个选择:

      1. 将代码重写为 Java/Scala
      2. 使用自定义操作或脚本,例如 this(我没有测试)

      【讨论】:

      • 以 python 脚本作为参数运行 shell 脚本是我最初的想法,但它没有成功。我希望,现在是 :) 非常感谢我的想法。
      • 无论如何,这很奇怪,因为在文档中我发现:jar 元素表示以逗号分隔的 jar 或 python 文件列表。
      【解决方案3】:

      您可以使用spark-action 来运行python 脚本,但您必须将路径作为参数传递给Spark 的Python API。您的文件的第一行也必须是这样的:

      #!/usr/bin/env python.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多