web-dev-qa-db-ja.com

SparkアプリケーションをScalaのYARNにデプロイするためのapplicationIdを取得するにはどうすればよいですか?

次のScalaコード(カスタムspark-submitラッパーとして)を使用して、SparkアプリケーションをYARNクラスターに送信します:

val result = Seq(spark_submit_script_here).!!

送信時に持っているのはspark-submitとSparkアプリケーションのjar(SparkContextなし)だけです。applicationIdからresultをキャプチャしたいのですが、空です。

コマンドライン出力で、applicationIdと残りのYarnメッセージを確認できます。

INFOyarn.Client:application_1450268755662_0110のアプリケーションレポート

コード内でそれを読み取ってapplicationIdを取得するにはどうすればよいですか?

8
nish1013

Spark issue 5439 で述べられているように、SparkContext.applicationIdを使用するか、stderr出力を解析することができます。ここで、spark-submitコマンドを独自のスクリプト/オブジェクトでラップしているので、stderrを読み取ってアプリケーションIDを取得する必要があると思います。

7
Markon

Python経由でジョブを送信する場合、次のようにして、yarnアプリケーションIDを取得できます。

    cmd_list = [{
            'cmd': '/usr/bin/spark-submit --name %s --master yarn --deploy-mode cluster '
                   '--executor-memory %s --executor-cores %s --num-executors %s '
                   '--class %s %s %s'
                   % (
                       app_name,
                       config.SJ_EXECUTOR_MEMORY,
                       config.SJ_EXECUTOR_CORES,
                       config.SJ_NUM_OF_EXECUTORS,
                       config.PRODUCT_SNAPSHOT_SKU_PRESTO_CLASS,
                       config.SPARK_JAR_LOCATION,
                       config.SPARK_LOGGING_ENABLED
                   ),
            'cwd': config.WORK_DIR
        }]
cmd_output = subprocess.run(cmd_obj['cmd'], Shell=True, check=True, cwd=cwd, stderr=subprocess.PIPE)
cmd_output = cmd_output.stderr.decode("utf-8")
yarn_application_ids = re.findall(r"application_\d{13}_\d{4}", cmd_output)
                if len(yarn_application_ids):
                    yarn_application_id = yarn_application_ids[0]
                    yarn_command = "yarn logs -applicationId " + yarn_application_id
5
Rajiv

sparkコンテキストを使用して、アプリケーション情報を取得します。

sc.getConf.getAppId 
res7: String = application_1532296406128_16555
4
mmopu