通过 Azure Log Analytics 监视 Apache Spark 应用程序(预览版)
Fabric Apache Spark 诊断发射器扩展是一个库,通过该库,Apache Spark 应用程序能够将日志、事件日志和指标发送到多个目标,包括 Azure Log Analytics、Azure 存储和 Azure 事件中心。
在本教程中,你将学习如何配置 Spark 日志和指标并将其发送到 Fabric 中的日志分析。 配置完成后,你可以在 Log Analytics 工作区中收集和分析 Apache Spark 应用程序指标和日志。
配置工作区信息
按照以下步骤配置 Fabric 中的必要信息。
步骤 1:创建 Log Analytics 工作区
参考以下任一资源,创建此工作区:
步骤 2:使用 Apache Spark 配置创建 Fabric 环境项目
若要配置 Spark,请创建 Fabric 环境项目并选择以下选项之一:
选项 1:使用 Log Analytics 工作区 ID 和密钥进行配置
在 Fabric 中创建 Fabric 环境项目
将以下 Spark 属性及其相应值添加到环境项目,或者选择功能区中的“从 .yml 添加”以下载示例 yaml 文件,该文件已包含所需属性。
<LOG_ANALYTICS_WORKSPACE_ID>
:Log Analytics 工作区 ID。<LOG_ANALYTICS_WORKSPACE_KEY>
:Log Analytics 密钥。 若要查找此项,请在 Azure 门户中转到“Azure Log Analytics 工作区”>“代理”>“主密钥”。
spark.synapse.diagnostic.emitters: LA spark.synapse.diagnostic.emitter.LA.type: "AzureLogAnalytics" spark.synapse.diagnostic.emitter.LA.categories: "Log,EventLog,Metrics" spark.synapse.diagnostic.emitter.LA.workspaceId: <LOG_ANALYTICS_WORKSPACE_ID> spark.synapse.diagnostic.emitter.LA.secret: <LOG_ANALYTICS_WORKSPACE_KEY> spark.fabric.pools.skipStarterPools: "true" //Add this Spark property when using the default pool.
或者,若要应用与 Azure Synapse 相同的配置,请使用以下属性,或选择功能区中的“从 .yml 添加”以下载示例 yaml 文件。
spark.synapse.logAnalytics.enabled: "true" spark.synapse.logAnalytics.workspaceId: <LOG_ANALYTICS_WORKSPACE_ID> spark.synapse.logAnalytics.secret: <LOG_ANALYTICS_WORKSPACE_KEY> spark.fabric.pools.skipStarterPools: "true" //Add this Spark property when using the default pool.
保存并发布更改。
选项 2:配置 Azure 密钥保管库
注意
已知问题:无法使用选项 2 临时启动会话。 目前,将机密存储在密钥保管库中会阻止 Spark 会话启动。 请优先使用选项 1 中概述的方法对其进行配置。
对于将提交 Apache Spark 应用程序的用户,需要向其授予读取机密权限。 有关详细信息,请参阅使用 Azure 基于角色的访问控制提供对密钥保管库密钥、证书和机密的访问权限。
若要配置 Azure 密钥保管库以存储工作区密钥,请执行以下步骤:
在 Azure 门户中转到你的密钥保管库。
在密钥保管库的设置页面上,选择“机密”,然后选择“生成/导入”。
在“创建机密”屏幕上,输入以下值:
- 名称:输入机密的名称。 对于默认设置,请输入
SparkLogAnalyticsSecret
。 - 值:输入机密的
<LOG_ANALYTICS_WORKSPACE_KEY>
。 - 让其他值保留默认设置。 然后选择“创建”。
- 名称:输入机密的名称。 对于默认设置,请输入
在 Fabric 中创建 Fabric 环境项目
将以下 Spark 属性及其相应值添加到环境项目,或者在环境项目的功能区上选择“从 .yml 添加”,以下载包含以下 Spark 属性的示例 yaml 文件。
<LOG_ANALYTICS_WORKSPACE_ID>
:Log Analytics 工作区 ID。<AZURE_KEY_VAULT_NAME>
:配置的密钥保管库名称。<AZURE_KEY_VAULT_SECRET_KEY_NAME>
(可选):工作区密钥的密钥保管库中的机密名称。 默认为SparkLogAnalyticsSecret
。
// Spark properties for LA spark.synapse.diagnostic.emitters LA spark.synapse.diagnostic.emitter.LA.type: "AzureLogAnalytics" spark.synapse.diagnostic.emitter.LA.categories: "Log,EventLog,Metrics" spark.synapse.diagnostic.emitter.LA.workspaceId: <LOG_ANALYTICS_WORKSPACE_ID> spark.synapse.diagnostic.emitter.LA.secret.keyVault: <AZURE_KEY_VAULT_NAME> spark.synapse.diagnostic.emitter.LA.secret.keyVault.secretName: <AZURE_KEY_VAULT_SECRET_KEY_NAME> spark.fabric.pools.skipStarterPools: "true" //Add this Spark property when using the default pool.
或者,若要应用与 Azure Synapse 相同的配置,请使用以下属性,或选择功能区中的“从 .yml 添加”以下载示例 yaml 文件。
spark.synapse.logAnalytics.enabled: "true" spark.synapse.logAnalytics.workspaceId: <LOG_ANALYTICS_WORKSPACE_ID> spark.synapse.logAnalytics.keyVault.name: <AZURE_KEY_VAULT_NAME> spark.synapse.logAnalytics.keyVault.key.secret: <AZURE_KEY_VAULT_SECRET_KEY_NAME> spark.fabric.pools.skipStarterPools: "true" //Add this Spark property when using the default pool.
注意
你还可以将工作区 ID 存储到密钥保管库中。 将机密名称设置为
SparkLogAnalyticsWorkspaceId
,或使用配置spark.synapse.logAnalytics.keyVault.key.workspaceId
指定工作区 ID 机密名称。有关 Apache Spark 配置的列表,请参阅可用的 Apache Spark 配置
保存并发布更改。
步骤 3:将环境项目附加到笔记本或 Spark 作业定义,或将其设置为工作区默认值
将环境附加到笔记本或 Spark 作业定义:
- 导航到 Fabric 中的笔记本或 Spark 作业定义。
- 选择“主页”选项卡上的“环境”菜单,然后选择已配置的环境。
- 启动 Spark 会话后将应用配置。
将环境设置为工作区默认值:
- 导航到 Fabric 中的工作区设置。
- 在工作区设置中找到“Spark 设置”(工作区设置 -> 数据工程/科学 -> Spark 设置)
- 选择“环境”选项卡,选择已配置诊断 spark 属性的环境,然后单击“保存”。
注意
只有工作区管理员可以管理配置。 这些值将应用于附加到工作区设置的笔记本和 Spark 作业定义。 有关更多详细信息,请参阅 Fabric 工作区设置。
提交 Apache Spark 应用程序并查看日志和指标
提交 Apache Spark 应用程序:
提交 Apache Spark 应用程序以及上一步中配置的相关环境。 可以使用以下任何一个方法来实现此操作:
- 在 Fabric 中运行笔记本。
- 通过 Apache Spark 作业定义提交一个 Apache Spark 批处理作业。
- 在管道中运行 Spark 活动。
转到指定的 Log Analytics 工作区,然后在 Apache Spark 应用程序开始运行时查看应用程序指标和日志。
编写自定义应用程序日志
可以使用 Apache Log4j 库编写自定义日志。 下面是 Scala 和 PySpark 的示例:
Scala 示例:
%%spark
val logger = org.apache.log4j.LogManager.getLogger("com.contoso.LoggerExample")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
//log exception
try {
1/0
} catch {
case e:Exception =>logger.warn("Exception", e)
}
// run job for task level metrics
val data = sc.parallelize(Seq(1,2,3,4)).toDF().count()
PySpark 示例:
%%pyspark
logger = sc._jvm.org.apache.log4j.LogManager.getLogger("com.contoso.PythonLoggerExample")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
使用 Kusto 查询数据
查询 Apache Spark 事件:
SparkListenerEvent_CL
| where fabricWorkspaceId_g == "{FabricWorkspaceId}" and artifactId_g == "{ArtifactId}" and fabricLivyId_g == "{LivyId}"
| order by TimeGenerated desc
| limit 100
查询 Spark 应用程序驱动程序和执行程序日志:
SparkLoggingEvent_CL
| where fabricWorkspaceId_g == "{FabricWorkspaceId}" and artifactId_g == "{ArtifactId}" and fabricLivyId_g == "{LivyId}"
| order by TimeGenerated desc
| limit 100
查询 Apache Spark 指标:
SparkMetrics_CL
| where fabricWorkspaceId_g == "{FabricWorkspaceId}" and artifactId_g == "{ArtifactId}" and fabricLivyId_g == "{LivyId}"
| where name_s endswith "jvm.total.used"
| summarize max(value_d) by bin(TimeGenerated, 30s), executorId_s
| order by TimeGenerated asc
数据限制
Fabric 使用 HTTP 数据收集器 API 将日志数据发送到 Azure Monitor。 发布到 Azure Monitor 数据收集 API 的数据受到某些限制:
- 每次发布到 Azure Monitor 数据收集器 API 的数据最大为 30 MB。 这是对单次发布的大小限制。 如果单次发布的数据超过 30 MB,应将数据拆分为较小的区块,并同时发送它们。
- 字段值最大为 32 KB。 如果字段值大于 32 KB,数据将截断。
- 建议一个给定的类型最多有 50 个字段。 这是从可用性和搜索体验角度考虑的现实限制。
- Log Analytics 工作区中的表最多只支持 500 个列。
- 列名最多包含 45 个字符。
创建和管理警报
用户可以进行查询,以按设置的频率评估指标和日志,并根据结果触发警报。 有关详细信息,请参阅使用 Azure Monitor 创建、查看和管理日志警报。
具有托管虚拟网络的 Fabric 工作区
目前无法选择 Azure Log Analytics 作为托管虚拟网络中 Spark 日志和指标发射的目标,因为托管专用终结点不支持 Log Analytics 作为数据源。