1

私は Oozie で SparkAction ジョブの例をいくつか見つけましたが、それらのほとんどは Java です。Cloudera CDH Quickstart 5.4.0 (Spark バージョン 1.4.0 を使用) でサンプルを少し編集して実行します。

ワークフロー.xml

<workflow-app xmlns='uri:oozie:workflow:0.5' name='SparkFileCopy'>
    <start to='spark-node' />

    <action name='spark-node'>
        <spark xmlns="uri:oozie:spark-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/spark"/>
            </prepare>
            <master>${master}</master>
        <mode>${mode}</mode>    
            <name>Spark-FileCopy</name>
            <class>org.apache.oozie.example.SparkFileCopy</class>
            <jar>${nameNode}/user/${wf:user()}/${examplesRoot}/apps/spark/lib/oozie-examples.jar</jar>
            <arg>${nameNode}/user/${wf:user()}/${examplesRoot}/input-data/text/data.txt</arg>
            <arg>${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/spark</arg>
        </spark>
        <ok to="end" />
        <error to="fail" />
    </action>

    <kill name="fail">
        <message>Workflow failed, error
            message[${wf:errorMessage(wf:lastErrorNode())}]
        </message>
    </kill>
    <end name='end' />
</workflow-app>

ジョブのプロパティ

nameNode=hdfs://quickstart.cloudera:8020
jobTracker=quickstart.cloudera:8032
master=local[2]
mode=client
examplesRoot=examples
oozie.use.system.libpath=true
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/spark

Oozie ワークフローの例 (Java) は、タスクを完了して実行することができました。

spark-submitただし、Python / PySpark を使用してジョブを作成しました。<class>私は瓶のためにとを削除しようとしました

<jar>my_pyspark_job.py</jar>

しかし、Oozie-Spark ジョブを実行しようとすると、ログにエラーが表示されます。

Launcher ERROR, reason: Main class [org.apache.oozie.action.hadoop.SparkMain], exit code [2]

Python / PySpark を使用している場合<class>、タグには何を配置すればよいのでしょうか?<jar>

4

4 に答える 4

6

私も、oozie のスパーク アクションにかなり苦労しました。sharelib を適切にセットアップし、タグ内で --jars オプションを使用して適切な jar を渡そうとしましたが、役に立ち<spark-opts> </spark-opts>ませんでした。

私はいつも何らかのエラーが発生することになりました。私ができることのほとんどは、spark-action を介してすべての Java/Python Spark ジョブをローカル モードで実行することでした。

ただし、シェル アクションを使用して、すべての実行モードですべての spark ジョブを oozie で実行することができました。シェル アクションの主な問題は、シェル ジョブが「yarn」ユーザーとしてデプロイされることです。yarn 以外のユーザー アカウントから oozie spark ジョブを展開すると、最終的に Permission Denied エラーが発生します (ユーザーは /user/yarn/.SparkStaging にコピーされた spark アセンブリ jar にアクセスできないため)。ディレクトリ)。これを解決する方法は、HADOOP_USER_NAME 環境変数を、oozie ワークフローをデプロイするユーザー アカウント名に設定することです。

以下は、この構成を示すワークフローです。ambari-qa ユーザーから Oozie ワークフローをデプロイします。

<workflow-app xmlns="uri:oozie:workflow:0.4" name="sparkjob">
    <start to="spark-shell-node"/>
    <action name="spark-shell-node">
        <shell xmlns="uri:oozie:shell-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>oozie.launcher.mapred.job.queue.name</name>
                    <value>launcher2</value>
                </property>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>default</value>
                </property>
                <property>
                    <name>oozie.hive.defaults</name>
                    <value>/user/ambari-qa/sparkActionPython/hive-site.xml</value>
                </property>
            </configuration>
            <exec>/usr/hdp/current/spark-client/bin/spark-submit</exec>
            <argument>--master</argument>
            <argument>yarn-cluster</argument>
            <argument>wordcount.py</argument>
            <env-var>HADOOP_USER_NAME=ambari-qa</env-var>
            <file>/user/ambari-qa/sparkActionPython/wordcount.py#wordcount.py</file>
            <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="spark-fail"/>
    </action>
    <kill name="spark-fail">
        <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

お役に立てれば!

于 2015-10-13T05:22:03.497 に答える
0

別の問題につながるものの、この問題を「修正」することができました。とはいえ、まだまだ投稿します。

Oozie コンテナー ログの stderr には、次のように表示されます。

Error: Only local python files are supported

そして、ここで解決策を見つけました

これは私の最初のworkflow.xmlです:

    <spark xmlns="uri:oozie:spark-action:0.1">
        <job-tracker>${resourceManager}</job-tracker>
        <name-node>${nameNode}</name-node>
        <master>local[2]</master>
        <mode>client</mode>
        <name>${name}</name>
        <jar>my_pyspark_job.py</jar>
    </spark>

最初にしたことは、spark-submit ジョブとして実行したい Python スクリプトを HDFS にコピーすることでした。ローカル ファイル システムに .py スクリプトが必要であることが判明したため、スクリプトの絶対ローカル ファイル システムを参照するようにしました。

<jar>/<absolute-local-path>/my_pyspark_job.py</jar>
于 2015-07-17T09:06:57.300 に答える