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 |
如果未指定 .secret,则为必需。 存储机密的 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 计算。