我正在使用以下Scala代码(作为自定义spark-submit
包装器)将Spark应用程序提交到YARN集群:
val result = Seq(spark_submit_script_here).!!
我在提交时所拥有的只是spark-submit
和Spark应用程序的jar(没有SparkContext).我想拍摄applicationId
从result
,但它是空的.
我可以在命令行中看到输出applicationId和其余的Yarn消息:
INFO yarn.Client:application_1450268755662_0110的应用报告
如何在代码中读取它并获取applicationId?
如Spark问题5439中所述,您可以使用SparkContext.applicationId
或解析stderr输出。现在,当您用自己的脚本/对象包装spark-submit命令时,我会说您需要阅读stderr并获取应用程序ID。
如果要通过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