如何以编程方式从提交ID或驱动程序ID获取应用程序ID

时间:2015-08-20 06:55:56

标签: apache-spark

我在集群部署模式下提交Spark作业。我在我的代码中获得了提交ID。为了使用Spark rest Api,我们需要applicationId。那么我们如何通过编程方式通过提交ID获取应用程序ID

1 个答案:

答案 0 :(得分:0)

为了回答这个问题,假设已知可以使用以下功能获得证书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模块。子进程模块可以创建一个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指南,当不使用communic()函数时,它包含警告: https://docs.python.org/2/library/subprocess.html

警告当使用stdout = PIPE和/或stderr = PIPE时,这将导致死锁,并且子进程会为管道生成足够的输出,以阻止等待OS管道缓冲区接受更多数据。使用communic()来避免这种情况。