如何在 Databricks 上的同一个 cluster/SparkContext 上监视不同的 Spark 作业?

How to monitor different Spark jobs on the same cluster/SparkContext on Databricks?

我想有一个监控和警报系统(使用诸如 Datadog 之类的工具),它可以从我在 Databricks 中的 Spark 应用程序中获取指标和日志。事实是,为了不必每天启动 运行 并杀死数百甚至数千个作业集群,最好将现有集群重新用于类似的数据提取作业。

为了从 Datadog 中的 Databricks 和 Spark 获取指标,我尝试了以下方法:

  1. 更改每个笔记本中的 SparkSession.builder.appName:不起作用,因为在集群启动后无法更改它。默认情况下,它将始终为“Databricks Shell”
  2. 设置集群范围的标签并在作业结束后取消设置 -> 当并发发生时,可能会导致标签之间不匹配。另外,我没有找到在此处“附加”标签的明确方法。
  3. 以某种方式从 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 作业。它不是“经典”的实时监控工具,但已经被许多客户使用。