我在集群部署模式下提交Spark作业.我在我的代码中获得了提交ID.为了使用Spark rest Api,我们需要applicationId.那么我们如何通过编程方式通过提交ID获取Application Id
为了回答这个问题,假设已知可以使用以下函数获取证书 ID:
scala> spark.sparkContext.applicationId
Run Code Online (Sandbox Code Playgroud)
如果你想得到它,那就有点不同了。可以通过其余 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
Run Code Online (Sandbox Code Playgroud)
在终端的背景中,您应该看到正在生成的日志文件。日志文件中有应用程序 ID (App_ID)。这里$SPARK_HOME是指向spark所在文件夹的环境变量。
例如,使用Python可以在下面描述的代码中获取 App_ID。首先,我们创建一个列表来使用 Python 模块发送命令subprocess。subprocess 模块可以创建一个 PIPE,您可以从中提取日志信息,而不是使用 Spark 的标准选项将其发布到终端。确保communicate()在 Popen 之后使用,以防止等待操作系统。然后将其分成几行并刮过它以找到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)
Run Code Online (Sandbox Code Playgroud)
按照Python指南,在不使用communicate()函数时会出现警告: https: //docs.python.org/2/library/subprocess.html
警告 当使用 stdout=PIPE 和/或 stderr=PIPE 并且子进程生成足够的输出到管道时,这将导致死锁,从而阻止等待操作系统管道缓冲区接受更多数据。使用communicate()来避免这种情况。
| 归档时间: |
|
| 查看次数: |
2535 次 |
| 最近记录: |