如何在 Databricks 上的同一个 cluster/SparkContext 上监视不同的 Spark 作业?
How to monitor different Spark jobs on the same cluster/SparkContext on Databricks?
我想有一个监控和警报系统(使用诸如 Datadog 之类的工具),它可以从我在 Databricks 中的 Spark 应用程序中获取指标和日志。事实是,为了不必每天启动 运行 并杀死数百甚至数千个作业集群,最好将现有集群重新用于类似的数据提取作业。
为了从 Datadog 中的 Databricks 和 Spark 获取指标,我尝试了以下方法:
- 更改每个笔记本中的
SparkSession.builder.appName
:不起作用,因为在集群启动后无法更改它。默认情况下,它将始终为“Databricks Shell”
- 设置集群范围的标签并在作业结束后取消设置 -> 当并发发生时,可能会导致标签之间不匹配。另外,我没有找到在此处“附加”标签的明确方法。
- 以某种方式从 Datadog 获取 Databricks 的 Job/Run ID:我不知道如何执行此操作。
在我看来这是可行的,因为同一个 SparkSession 上的每个 spark 作业都具有我的 Databricks 的 Job/Run id 的名称。我只需要了解如何在 Datadog 上识别它。
想法?为了实现这一目标,我可能会错过任何愚蠢的事情吗?
我不确定我是否完全理解您的用例。但是您可以使用简单的 python 代码根据其余 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'])
这里有几点:
- 当您将现有集群用于 运行 个作业时,您会产生更高的成本 - 自动化集群的成本为 15 cents/DBU,而交互式集群的成本为 56 cents/DBU
- 当您 运行 使用不同的库等工作时,您可能会以库冲突等结束。
- 您不能更改现有集群上的标签
- 并发作业可能会影响彼此的性能
所以我真的会推荐使用单独的自动化集群。如果你想重用节点,并且有更短的启动时间,你可以使用实例池。
如果您想监控资源使用情况等。我建议查看项目 Overwatch,它能够从不同来源收集数据,例如集群日志、API 等,然后建立关于性能、成本等的统一视图。它的优点之一是您可以将成本、资源负载等归因于 users/notebooks/individual 个 Spark 作业。它不是“经典”的实时监控工具,但已经被许多客户使用。
我想有一个监控和警报系统(使用诸如 Datadog 之类的工具),它可以从我在 Databricks 中的 Spark 应用程序中获取指标和日志。事实是,为了不必每天启动 运行 并杀死数百甚至数千个作业集群,最好将现有集群重新用于类似的数据提取作业。
为了从 Datadog 中的 Databricks 和 Spark 获取指标,我尝试了以下方法:
- 更改每个笔记本中的
SparkSession.builder.appName
:不起作用,因为在集群启动后无法更改它。默认情况下,它将始终为“Databricks Shell” - 设置集群范围的标签并在作业结束后取消设置 -> 当并发发生时,可能会导致标签之间不匹配。另外,我没有找到在此处“附加”标签的明确方法。
- 以某种方式从 Datadog 获取 Databricks 的 Job/Run ID:我不知道如何执行此操作。
在我看来这是可行的,因为同一个 SparkSession 上的每个 spark 作业都具有我的 Databricks 的 Job/Run id 的名称。我只需要了解如何在 Datadog 上识别它。
想法?为了实现这一目标,我可能会错过任何愚蠢的事情吗?
我不确定我是否完全理解您的用例。但是您可以使用简单的 python 代码根据其余 api.
获取作业 IDfrom 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'])
这里有几点:
- 当您将现有集群用于 运行 个作业时,您会产生更高的成本 - 自动化集群的成本为 15 cents/DBU,而交互式集群的成本为 56 cents/DBU
- 当您 运行 使用不同的库等工作时,您可能会以库冲突等结束。
- 您不能更改现有集群上的标签
- 并发作业可能会影响彼此的性能
所以我真的会推荐使用单独的自动化集群。如果你想重用节点,并且有更短的启动时间,你可以使用实例池。
如果您想监控资源使用情况等。我建议查看项目 Overwatch,它能够从不同来源收集数据,例如集群日志、API 等,然后建立关于性能、成本等的统一视图。它的优点之一是您可以将成本、资源负载等归因于 users/notebooks/individual 个 Spark 作业。它不是“经典”的实时监控工具,但已经被许多客户使用。