【发布时间】:2015-11-13 16:40:54
【问题描述】:
我正在集群部署模式下提交 Spark 作业。我在我的代码中获得了提交 ID。为了使用 Spark rest Api,我们需要 applicationId。那么我们如何以编程方式通过 Submission ID 获取 Application Id
【问题讨论】:
-
如何在程序中获取提交 ID。我在程序中有应用程序 ID,并且需要其中的提交 ID。
标签: apache-spark
我正在集群部署模式下提交 Spark 作业。我在我的代码中获得了提交 ID。为了使用 Spark rest Api,我们需要 applicationId。那么我们如何以编程方式通过 Submission ID 获取 Application Id
【问题讨论】:
标签: apache-spark
要回答这个问题,假设已知可以使用以下函数获取证书 ID:
scala> spark.sparkContext.applicationId
如果你想得到它有点不同。通过其余的 API,可以发送命令。例如,在以下关于 Apache REST API 的有用教程中:http://arturmkrtchyan.com/apache-spark-hidden-rest-api 另一种解决方案是自己编程。您可以使用以下样式发送 Spark 提交:
$SPARK_HOME/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://my-cluster:7077 \
--deploy-mode cluster \
/path/to/examples.jar 1000
在终端后台,您应该会看到正在生成的日志文件。在日志文件中有应用程序 ID (App_ID)。 $SPARK_HOME 是指向 spark 所在文件夹的环境变量。
例如 Python 可以在下面描述的代码中获取 App_ID。首先,我们创建一个列表以使用 Python 的 subprocess 模块发送命令。 subprocess 模块可以创建一个 PIPE,您可以从中提取日志信息,而不是使用 Spark 作为标准选项将其发布到终端。确保在 Popen 之后使用communicate(),以防止等待操作系统。然后将其分成几行并刮过它以找到App_ID。示例如下:
submitSparkList=['$SPARK_HOME/bin/spark-submit','--class','org.apache.spark.examples.SparkPi','--master spark://my-cluster:7077','--deploy-mode cluster','/path/to/examples.py','1000']
sparkCommand=subprocess.Popen(submitSparkList,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
stdout, stderr = sparkCommand.communicate()
stderr=stderr.splitlines()
for line in stderr:
if "Connected to Spark cluster" in line: #this is the first line from the rest API that contains the ID. Scrape through the logs to find it.
app_ID_index=line.find('app-')
app_ID=line[app_ID_index:] #this gives the app_ID
print('The app ID is ' + app_ID)
遵循 Python 指南,这包含不使用communicate() 函数时的警告: https://docs.python.org/2/library/subprocess.html
警告这将在使用 stdout=PIPE 和/或 stderr=PIPE 时发生死锁,并且子进程会向管道生成足够的输出,从而阻塞等待 OS 管道缓冲区接受更多数据。使用communicate() 来避免这种情况。
【讨论】:
spark-submit (2.4.x) 在集群部署模式下仅返回 Spark 独立的驱动程序 ID。要获取应用程序 ID,您必须进入客户端模式(或 grep 主日志,如果您有访问权限)。