如何在Databricks上监控同一集群/SparkContext上的不同Spark作业?

jei2mxaa  于 8个月前  发布在  Apache
关注(0)|答案(2)|浏览(67)

我希望有一个监控和警报系统(使用Datadog等工具),可以从我的Spark应用程序中获取数据和日志。事情是,为了避免每天启动,运行和杀死数百甚至数千个Job集群,最好重用现有集群进行类似的数据提取作业。
为了从Datadog中的Databricks和Spark获取指标,我尝试了以下方法:
1.在每个笔记本中更改SparkSession.builder.appName:不起作用,因为在集群启动后无法更改它。默认情况下,它将始终是“Databricks Shell”
1.设置一个集群范围的标签,并在作业结束后取消设置->可能会导致标签之间的不匹配,当并发发生时。
1.以某种方式从Datadog获取数据块的作业/运行ID:我不知道如何做到这一点。
在我看来,这是可行的,因为同一个SparkSession上的每个spark作业都有我的Databricks作业/运行id的名称。我只需要了解如何在Datadog上识别它。
有什么想法?为了达到这个目标我可能会错过什么愚蠢的事情?

ffx8fchx

ffx8fchx1#

这里有几点:

  • 当您使用现有群集运行作业时,会产生更高的成本-自动化群集的成本为15美分/DBU,而交互式群集的成本为56美分/DBU
  • 当您使用不同的库等运行作业时,可能会出现库冲突等情况。
  • 不能更改现有群集上的标记
  • 并发作业可能会影响彼此的性能

所以我建议使用单独的自动集群。如果你想重用节点,并且有更短的启动时间,你可以使用示例池。
如果你想监控资源使用情况等,我建议看看项目Overwatch,它能够从不同的来源收集数据,如集群日志,API等,然后建立统一的性能视图,成本等,其优点之一是,你可以属性成本,资源负载,它不是“经典的”实时监控工具,但已经被许多客户使用。

bybem2ql

bybem2ql2#

我不确定我是否完全理解了你的用例,但是你可以使用简单的python代码来获取基于rest API的作业id。

from pyspark.sql.types import IntegerType
from pyspark.sql.types import *
from pyspark.sql import Row
import base64
import requests
import json

databricks_instance ="<databricks-instances>"

url_list = f"{databricks_instance}/api/2.0/jobs/runs/get?run_id=39347"

headers = {
  'Authorization': 'Bearer <databricks-access-token>',
  'Content-Type': 'application/json'
}

response = requests.request("GET", url_list, headers=headers).json()
print(response)
print(response['job_id'])
print(response['start_time'])
print(response['end_time'])

相关问题