我们有一个审计需求,可以洞察Azure Databricks中谁在什么时候执行了什么查询。Azure Databricks / Spark UI / Jobs选项卡已经列出了执行的Spark作业,包括完成的查询和提交的时间。但是它不包括谁执行了查询。
谢谢,下吕
根据Douglas的回答,我想出了这个函数来在Databricks笔记本中使用,并获得有关缓存RDD的一些信息:
我希望它有帮助。我正在寻找关于这个主题的2h的信息。
def get_databricks_rdd_info():
import requests, json
# Get Spark Context
sc = spark.sparkContext
# Get App Id (Notebook is attached to it)
app_id = sc._jsc.sc().applicationId()
# Where is my driver
driver_ip = spark.conf.get('spark.driver.host')
port = spark.conf.get("spark.ui.port")
# Compose the query to the Spark UI API
url = f"http://{driver_ip}:{port}/api/v1/applications/{app_id}/storage/rdd"
# Make request
r = requests.get(url, timeout=3.0)
if r.status_code == 200:
# Compose results
df = spark.createDataFrame([json.dumps(r) for r in r.json()], T.StringType())
json_schema = spark.read.json(df.rdd.map(lambda row: row.value)).schema
df = df.withColumn('value', F.from_json(F.col('value'), json_schema))
df = df.selectExpr('value.*')
# Generate summary
df_summary = (df
.withColumn('Name', F.element_at(F.split(F.col('name'), ' '), -1))
.withColumn('Cached', F.round(F.lit(100) * F.col('numCachedPartitions')/F.col('numPartitions'), 2))
.withColumn('Memory GB', F.round(F.col('memoryUsed')*1e-9, 2))
.withColumn('Disk GB', F.round(F.col('diskUsed')*1e-9, 2))
.withColumnRenamed('numPartitions', '# Partitions')
.select([
'Name',
'id',
'Cached',
'Memory GB',
'Disk GB',
'# Partitions',
]))
else:
print('Some error happened, code:', r.status_code)
df = None
df_summary = None
return df, df_summary
您可以在数据砖笔记本中将其用作:
df_rdd_info, df_summary = get_databricks_rdd_info()
display(df_summary)
一个。驱动程序节点(内部)访问 Azure Databricks Spark api:
import requests
driverIp = spark.conf.get('spark.driver.host')
port = spark.conf.get("spark.ui.port")
url = F"http://{driverIp}:{port}/api/v1/applications"
r = requests.get(url, timeout=3.0)
r.status_code, r.text
例如,如果您从公共API收到以下错误消息:< code>PERMISSION_DENIED:不允许此端口上的流量
b. 对 Azure 数据砖 Spark API 的外部访问:
import requests
import json
"""
Program access to Databricks Spark UI.
Works external to Databricks environment or running within.
Requires a Personal Access Token. Treat this like a password, do not store in a notebook. Please refer to the Secrets API.
This Python code requires F string support.
"""
# https://<databricks-host>/driver-proxy-api/o/0/<cluster_id>/<port>/api/v1/applications/<application-id-from-master-spark-ui>/stages/<stage-id>
port = spark.conf.get("spark.ui.port")
clusterId = spark.conf.get("spark.databricks.clusterUsageTags.clusterId")
host = "eastus2.azuredatabricks.net"
workspaceId = "999999999999111" # follows the 'o=' in the databricks URLs or zero
token = "dapideedeadbeefdeadbeefdeadbeef68ee3" # Personal Access token
url = F"https://{host}/driver-proxy-api/o/{workspaceId}/{clusterId}/{port}/api/v1/applications/?status=running"
r = requests.get(url, auth=("token", token))
# print Application list response
print(r.status_code, r.text)
applicationId = r.json()[0]['id'] # assumes only one response
url = F"https://{host}/driver-proxy-api/o/{workspaceId}/{clusterId}/{port}/api/v1/applications/{applicationId}/jobs"
r = requests.get(url, auth=("token", token))
print(r.status_code, r.json())
集群日志将是您可以查看的地方,但用户标识不在那里。
投票和跟踪这个想法:https://ideas.databricks.com/ideas/DBE-I-313如何进入想法门户:https://docs.databricks.com/ideas.html
问题内容: 我了解JSON,但不了解JSONP。Wikipedia上有关JSON的文档是JSONP的最高搜索结果。它说: JSONP或“带填充的JSON”是JSON扩展,其中将前缀指定为调用本身的输入参数。 ??什么电话 这对我来说毫无意义。JSON是一种数据格式。没有电话 在第二个搜索结果是由某些人叫雷米,谁写的这个约JSONP: JSONP是脚本标记注入,它将响应从服务器传递到用户指定的函数。
下面的代码片段摘自我的global.class.php文件。当搜索“类型”等于“postcode”或“part-number”时,执行SQL查询所需的时间是我当前遇到的问题。请参阅下面的代码片段以获得包括处理时间在内的解释。 请参阅以下执行时间: Page time是调用findOrder(“type”,“query”)所用的时间; SQL time是直接在phpMyAdmin内重复查询所用的时间
问题内容: 我了解JSON,但不了解JSONP。Wikipedia上有关JSON的文档是JSONP的最高搜索结果。它说: JSONP或“带填充的JSON”是JSON扩展,其中将前缀指定为调用本身的输入参数。 ??什么电话 这对我来说毫无意义。JSON是一种数据格式。没有电话 在第二个搜索结果是由某些人叫雷米,谁写的这个约JSONP: JSONP是脚本标记注入,它将响应从服务器传递到用户指定的函数。
有ManyToOne链接的表。每个学生被分配一个方向从教育方向。当我创建学生时,所选方向被重新创建。为什么在创建学生时创建方向? 学生: 教育方向: 学生道:
每一个国家的都有其特殊国情,主要是原因是中国的网络太慢,及中国存在大量老旧的计算机,它们预装着window XP,IE浏览器最高只能升级到IE8, 出于这两方面的原因,我们需要一个体积更少,兼容性更好的React。并且之前facebook也闹过LICENSE问题,更是促进中国互联网公司决定自主研发框架,努力摆脱对外国框架的依赖。 对于我们公司而言,一个旅游公司, 在线上订火车票,飞机票, 景点门票
问题内容: 什么时候应该创建一个检查异常,什么时候应该创建一个运行时异常? 例如,假设我创建了以下类: 我应该如何创建我的?它应该扩展还是?还是我应该只使用它? 问题答案: 在这个话题上有很多分歧。在我的上一份工作中,我们遇到了一些实际问题,运行时异常被遗忘了,直到它们出现在生产环境中(在ageswards.com上),因此我们决定只使用已检查的异常。 在我目前的工作中,我发现在很多情况下都有很多