通过 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 文件,该文件已包含所需属性。
<EMITTER_NAME>
:发射器的名称。<LOG_ANALYTICS_WORKSPACE_ID>
:Log Analytics 工作区 ID。<LOG_ANALYTICS_WORKSPACE_KEY>
:Log Analytics 密钥。 若要查找此项,请在 Azure 门户中转到“Azure Log Analytics 工作区”“代理”>“主密钥”。
spark.synapse.diagnostic.emitters: <EMITTER_NAME> spark.synapse.diagnostic.emitter.<EMITTER_NAME>.type: "AzureLogAnalytics" spark.synapse.diagnostic.emitter.<EMITTER_NAME>.categories: "Log,EventLog,Metrics" spark.synapse.diagnostic.emitter.<EMITTER_NAME>.workspaceId: <LOG_ANALYTICS_WORKSPACE_ID> spark.synapse.diagnostic.emitter.<EMITTER_NAME>.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 密钥保管库
注意
对于将提交 Apache Spark 应用程序的用户,需要向其授予读取机密权限。 有关详细信息,请参阅使用 Azure 基于角色的访问控制提供对密钥保管库密钥、证书和机密的访问权限。
若要配置 Azure 密钥保管库以存储工作区密钥,请执行以下步骤:
在 Azure 门户中转到你的密钥保管库。
在密钥保管库的设置页面上,选择“机密”,然后选择“生成/导入”。
在“创建机密”屏幕上,输入以下值:
- 名称:输入机密的名称。 对于默认设置,请输入
SparkLogAnalyticsSecret
。 - 值:输入机密的
<LOG_ANALYTICS_WORKSPACE_KEY>
。 - 让其他值保留默认设置。 然后选择“创建”。
- 名称:输入机密的名称。 对于默认设置,请输入
在 Fabric 中创建 Fabric 环境项目
将以下 Spark 属性及其相应值添加到环境项目,或者在环境项目的功能区上选择“从 .yml 添加”,以下载包含以下 Spark 属性的示例 yaml 文件。
<EMITTER_NAME>
:发射器的名称。<LOG_ANALYTICS_WORKSPACE_ID>
:日志分析工作区 ID。<AZURE_KEY_VAULT_URI>
:配置的密钥保管库 URI。<AZURE_KEY_VAULT_SECRET_KEY_NAME>
(可选):工作区密钥的密钥保管库中的机密名称。 默认为SparkLogAnalyticsSecret
。
// Spark properties for EMITTER_NAME spark.synapse.diagnostic.emitters <EMITTER_NAME> spark.synapse.diagnostic.emitter.<EMITTER_NAME>.type: "AzureLogAnalytics" spark.synapse.diagnostic.emitter.<EMITTER_NAME>.categories: "Log,EventLog,Metrics" spark.synapse.diagnostic.emitter.<EMITTER_NAME>.workspaceId: <LOG_ANALYTICS_WORKSPACE_ID> spark.synapse.diagnostic.emitter.<EMITTER_NAME>.secret.keyVault: <AZURE_KEY_VAULT_URI> spark.synapse.diagnostic.emitter.<EMITTER_NAME>.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_URI> 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 机密名称。保存并发布更改。
步骤 3:将环境项目附加到笔记本或 Spark 作业定义,或将其设置为工作区默认值
若要将环境附加到笔记本或 Spark 作业定义,请执行以下操作:
- 导航到你在 Fabric 中的笔记本或 Spark 作业定义。
- 选择“主页”选项卡上的“环境”菜单,然后选择已配置的环境。
- 启动 Spark 会话后将应用配置。
将环境设置为工作区默认值:
- 导航到 Fabric 中的工作区设置。
- 在工作区设置中找到“Spark 设置”(工作区设置 -> 数据工程/科学 -> Spark 设置)
- 选择“环境”选项卡,选择已配置诊断 spark 属性的环境,然后单击“保存”。
提交 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
创建和管理警报
用户可以进行查询,以按设置的频率评估指标和日志,并根据结果触发警报。 有关详细信息,请参阅使用 Azure Monitor 创建、查看和管理日志警报。
具有托管虚拟网络的 Fabric 工作区
目前无法选择 Azure Log Analytics 作为托管虚拟网络中 Spark 日志和指标发射的目标,因为托管专用终结点不支持 Log Analytics 作为数据源。
可用的 Apache Spark 配置
使用 spark.synaspe.diagnostic.emitter.*
前缀配置 Log Analytics 信息。
配置 | 说明 |
---|---|
spark.synapse.diagnostic.emitters |
必填。 诊断发射器的目标名称(逗号分隔)。 例如,MyDest1 ,MyDest2 。 |
spark.synapse.diagnostic.emitter.<destination>.type |
必填。 内置目标类型。 若要启用 Azure Log Analytics 目标,需要将 AzureLogAnalytics 包含在此字段中。 |
spark.synapse.diagnostic.emitter.<destination>.categories |
可选。 以逗号分隔的选定日志类别。 可用值包括 Log 、EventLog 、Metrics 。 如果未设置,则默认值为“所有”类别。 |
spark.synapse.diagnostic.emitter.<destination>.workspaceId |
必填。 目标 Log Analytics 工作区 ID。 |
spark.synapse.diagnostic.emitter.<destination>.secret |
可选。 工作区机密内容。 |
spark.synapse.diagnostic.emitter.<destination>.secret.keyVault |
如果未指定 .secre t,则为必需。 存储机密的 Azure 密钥保管库 URI。 |
park.synapse.diagnostic.emitter.<destination>.secret.keyVault.secretName |
如果指定了 .secret.keyVault ,则该参数是必需的。 存储 LA 工作区机密的 Azure 密钥保管库机密名称。 |
spark.synapse.diagnostic.emitter.<destination>.filter.eventName.match |
可选。 逗号分隔的 Spark 事件名称,你可以指定要收集的事件。 例如: SparkListenerApplicationStart,SparkListenerApplicationEnd 。 |
spark.synapse.diagnostic.emitter.<destination>.filter.loggerName.match |
可选。 可以通过以逗号分隔的 log4j 记录器名称来指定要收集的日志。 例如: org.apache.spark.SparkContext,org.example.Logger 。 |
spark.synapse.diagnostic.emitter.<destination>.filter.metricName.match |
可选。 逗号分隔的 Spark 指标名称后缀,你可以指定要收集的指标。 例如: jvm.heap.used 。 |
spark.fabric.pools.skipStarterPools |
必填。 此 Spark 属性用于强制按需 Spark 会话。 使用默认池时,应将值设置为 true ,以触发库来发出日志和指标。 |
使用 spark.synapse.logAnalytics.*
前缀配置 Log Analytics 信息。
配置名称 | 默认值 | 说明 |
---|---|---|
spark.synapse.logAnalytics.enabled |
false | 若要为 Spark 应用程序启用 Log Analytics 接收器,则为 true。 否则为 false。 |
spark.synapse.logAnalytics.workspaceId |
- | 目标 Log Analytics 工作区 ID。 |
spark.synapse.logAnalytics.secret |
- | 目标 Log Analytics 工作区机密。 |
spark.synapse.logAnalytics.keyVault.name |
- | Log Analytics ID 和密钥的密钥保管库 URI。 |
spark.synapse.logAnalytics.keyVault.key.workspaceId |
SparkLogAnalyticsWorkspaceId | Log Analytics 工作区 ID 的密钥保管库机密名称。 |
spark.synapse.logAnalytics.keyVault.key.secret |
SparkLogAnalyticsSecret | Log Analytics 工作区的 Key Vault 机密名称。 |
spark.synapse.logAnalytics.uriSuffix |
ods.opinsights.azure.com | 目标 Log Analytics 工作区的 URI 后缀。 如果工作区不在 Azure 全球中,则需要根据相应的云更新 URI 后缀。 |
spark.synapse.logAnalytics.filter.eventName.match |
- | 可选。 逗号分隔的 Spark 事件名称,你可以指定要收集的事件。 例如: SparkListenerJobStart,SparkListenerJobEnd 。 |
spark.synapse.logAnalytics.filter.loggerName.match |
- | 可选。 逗号分隔的 log4j 记录器名称,你可以指定要收集的日志。 例如: org.apache.spark.SparkContext,org.example.Logger 。 |
spark.synapse.logAnalytics.filter.metricName.match |
- | 可选。 逗号分隔的 Spark 指标名称后缀,你可以指定要收集的指标。 例如: jvm.heap.used 。 |
spark.fabric.pools.skipStarterPools |
是 | 必填。 此 Spark 属性用于强制按需 Spark 会话。 |
注意
- 对于由世纪互联运营的 Microsoft Azure,
spark.synapse.logAnalytics.uriSuffix
参数应为be ods.opinsights.azure.cn
。 - 对于 Azure 政府,
spark.synapse.logAnalytics.uriSuffix
参数应为ods.opinsights.azure.us
。 - 对于除 Azure 以外的任何云,
spark.synapse.logAnalytics.keyVault.name
参数应为 Key Vault 的完全限定的域名 (FQDN)。 例如,对于 AzureUSGovernment 应是AZURE_KEY_VAULT_NAME.vault.usgovcloudapi.net
。
常见问题解答
为什么我的 Log Analytics 未接收日志或未生成客户表?
如果 Log Analytics 工作区未收到日志或未生成 Customer 表,请使用以下步骤进行故障排除:
验证 Log Analytics 配置:确保已在 Spark 应用程序中正确配置 Log Analytics 工作区信息。 若要验证配置,请导航到 Spark UI 或 Spark History Server,转到“环境”选项卡,并查看“Spark 属性”下的设置。
检查权限:
- 确认 Log Analytics 具有必要的写入权限。
- 如果涉及 KeyVault,请确保将 KeyVault 读取权限正确分配给相关服务或用户。
检查数据限制:Fabric 使用 HTTP 数据收集器 API 将日志数据发送到 Azure Monitor。 发布到 Azure Monitor 数据收集 API 的数据受到某些限制:
- 每次发布到 Azure Monitor 数据收集器 API 的数据最大为 30 MB。 这是单次发布的大小限制。 如果单次发布的数据超过 30 MB,应将数据拆分为较小的区块,并同时发送它们。
- 字段值最大为 32 KB。 如果字段值大于 32 KB,数据将截断。
- 建议一个特定的类型最多有 50 个字段。 这是从可用性和搜索体验角度考虑的现实限制。
- Log Analytics 工作区中的表最多只支持 500 个列。
- 列名最多包含 45 个字符。
如何确认 Log Analytics 权限是否已正确配置?
若要确保 Log Analytics 可以接收日志,请验证以下权限:
Log Analytics 写入权限:
- 登录到 Azure 门户并导航到 Log Analytics 工作区。
- 在“访问控制(IAM)”部分中,确认您的用户、服务主体或应用程序已被分配“日志分析贡献者”或“贡献者”角色。
KeyVault 读取权限(如果适用):
- 如果日志涉及 KeyVault,请转到 KeyVault 的“访问策略”或“访问控制(IAM)”部分。
- 确保相关用户或服务主体具有读取权限,例如“密钥保管库读取者”角色。 如果权限配置不当,请联系 Azure 管理员来调整角色分配并等待权限同步(这可能需要几分钟时间)。
配置这些 Spark 属性后启动 Spark 会话为何变慢?
之所以发生这种情况,是因为已配置 spark.fabric.pools.skipStarterPool:true,这会跳过初学者池(实时池的类型),而是使用按需池启动 Spark 会话。 在按需池中启动 Spark 会话通常需要大约 3 分钟才能创建和初始化。
原因是诊断库要求在 Spark 会话启动时应用特定的配置,而这只能通过按需池来实现,因为它们是在启动时动态创建的。 相比之下,实时池会话是预先启动的,无法在初始化期间应用这些配置。 有关 Fabric Spark 计算的更多详细信息,请参阅 适用于数据工程和数据科学的 Apache Spark 计算。