使用 Azure 事件中心收集 Apache Spark 应用程序日志和指标(预览)

Fabric Apache Spark 诊断发射器扩展是一个库,通过该库,Apache Spark 应用程序能够将日志、事件日志和指标发送到各个目标(包括 Azure Log Analytics、Azure 存储和 Azure 事件中心)。

在本教程中,你将了解如何使用 Fabric Apache Spark 诊断发射器扩展将 Apache Spark 应用程序日志、事件日志和指标发送到 Azure 事件中心。

将日志和指标收集到 Azure 事件中心

步骤 1:创建 Azure 事件中心实例

若要收集诊断日志和指标,可以使用现有的 Azure 事件中心实例。 如果没有,可创建一个事件中心

步骤 2:使用 Apache Spark 配置创建 Fabric 环境项目

选项 1:使用 Azure 事件中心连接字符串进行配置

  1. 在 Fabric 中创建 Fabric 环境项目

  2. 将以下 Spark 属性及其相应值添加到环境项目,或者选择功能区中的“从 .yml 添加”以下载示例 yaml 文件,该文件已包含以下属性。

    spark.synapse.diagnostic.emitters: MyEventHub
    spark.synapse.diagnostic.emitter.MyEventHub.type: "AzureEventHub"
    spark.synapse.diagnostic.emitter.MyEventHub.categories: "Log,EventLog,Metrics"
    spark.synapse.diagnostic.emitter.MyEventHub.secret: <connection-string>
    spark.fabric.pools.skipStarterPools: "true" //Add this Spark property when using the default pool.
    

    在配置文件中填写 <connection-string> 参数。 有关详细信息,请参阅 Azure 事件中心配置

选项 2:配置 Azure 密钥保管库

注意

已知问题:无法使用选项 2 临时启动会话。 目前,将机密存储在密钥保管库中会阻止 Spark 会话启动。 请优先使用选项 1 中概述的方法对其进行配置。

确保提交 Apache Spark 应用程序的用户被授予读取机密权限。 有关详细信息,请参阅使用 Azure 基于角色的访问控制提供对密钥保管库密钥、证书和机密的访问权限

若要配置 Azure Key Vault 以存储工作区密钥,请执行以下操作:

  1. 在 Azure 门户中,创建并转到密钥保管库。

  2. 在密钥保管库的设置页面上,选择“机密”,然后选择“生成/导入”。

  3. 在“创建机密”屏幕上,选择以下值:

    • 名称:输入机密的名称。
    • :输入机密的 <connection-string>
    • 让其他值保留默认设置。 然后选择“创建”。
  4. 在 Fabric 中创建 Fabric 环境项目。

  5. 添加以下 Spark 属性。 或者在功能区上选择“从 .yml 添加”,以下载包含以下 Spark 属性的示例 yaml 文件

    spark.synapse.diagnostic.emitters: MyEventHub
    spark.synapse.diagnostic.emitter.MyEventHub.type: "AzureEventHub"
    spark.synapse.diagnostic.emitter.MyEventHub.categories: "Log,EventLog,Metrics"
    spark.synapse.diagnostic.emitter.MyEventHub.secret.keyVault: <AZURE_KEY_VAULT_NAME>
    spark.synapse.diagnostic.emitter.MyEventHub.secret.keyVault.secretName: <AZURE_KEY_VAULT_SECRET_KEY_NAME>
    spark.fabric.pools.skipStarterPools: "true" //Add this Spark property when using the default pool.
    

    在配置文件中填写以下参数:<AZURE_KEY_VAULT_NAME><AZURE_KEY_VAULT_SECRET_KEY_NAME>。 有关这些参数的更多详细信息,请参阅 Azure 事件中心配置

  6. 保存并发布更改。

步骤 3:将环境项目附加到笔记本或 Spark 作业定义,或将其设置为工作区默认值

将环境附加到笔记本或 Spark 作业定义

  1. 导航到 Fabric 中的特定笔记本或 Spark 作业定义。
  2. 选择“主页”选项卡上的“环境”菜单,然后选择具有已配置诊断 Spark 属性的环境。
  3. 启动 Spark 会话时会应用配置。

将环境设置为工作区默认值:

  1. 导航到 Fabric 中的“工作区设置”。
  2. 在“工作区设置”中找到“Spark 设置”(“工作区设置”->“数据工程/科学”->“Spark 设置”)
  3. 选择“环境”选项卡,选择已配置诊断 spark 属性的环境,然后单击“保存”。

注意

只有工作区管理员可以管理工作区配置。 此处所做的更改将应用到附加到工作区设置的所有笔记本和 Spark 作业定义。 有关详细信息,请参阅 Fabric 工作区设置

“可用配置”

配置 说明
spark.synapse.diagnostic.emitters 必需。 诊断发射器的目标名称(以逗号分隔)。
spark.synapse.diagnostic.emitter.<destination>.type 必需。 内置目标类型。 要启用 Azure 事件中心目标,该值应为 AzureEventHub
spark.synapse.diagnostic.emitter.<destination>.categories 可选。 以逗号分隔的选定日志类别。 可用的值包括 DriverLogExecutorLogEventLogMetrics。 如果未设置,则默认值为类别“所有”。
spark.synapse.diagnostic.emitter.<destination>.secret 可选。 Azure 事件中心实例连接字符串。 此字段应与模式 Endpoint=sb://<FQDN>/;SharedAccessKeyName=<KeyName>;SharedAccessKey=<KeyValue>;EntityPath=<PathName> 匹配
spark.synapse.diagnostic.emitter.<destination>.secret.keyVault 如果未指定 .secret,则为必需项。 存储机密(连接字符串)的 Azure 密钥保管库名称。
spark.synapse.diagnostic.emitter.<destination>.secret.keyVault.secretName 如果指定了 .secret.keyVault,则该参数是必需的。 存储机密(连接字符串)的 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

注意

Azure Eventhub 实例连接字符串应始终包含 EntityPath,它是 Azure 事件中心实例的名称。

日志数据示例

下面是 JSON 格式的示例日志记录:

{
  "timestamp": "2024-09-06T03:09:37.235Z",
  "category": "Log|EventLog|Metrics",
  "fabricLivyId": "<fabric-livy-id>",
  "applicationId": "<application-id>",
  "applicationName": "<application-name>",
  "executorId": "<driver-or-executor-id>",
  "fabricTenantId": "<my-fabric-tenant-id>",
  "capacityId": "<my-fabric-capacity-id>",
  "artifactType": "SynapseNotebook|SparkJobDefinition",
  "artifactId": "<my-fabric-artifact-id>",
  "fabricWorkspaceId": "<my-fabric-workspace-id>",
  "fabricEnvId": "<my-fabric-environment-id>",
  "executorMin": "<executor-min>",
  "executorMax": "<executor-max>",
  "isHighConcurrencyEnabled": "true|false",
  "properties": {
    // The message properties of logs, events and metrics.
    "timestamp": "2024-09-06T03:09:37.235Z",
    "message": "Initialized BlockManager: BlockManagerId(1, vm-04b22223, 34319, None)",
    "logger_name": "org.apache.spark.storage.BlockManager",
    "level": "INFO",
    "thread_name": "dispatcher-Executor"
    //...
  }
}

具有托管虚拟网络的 Fabric 工作区

为目标 Azure 事件中心创建托管专用终结点。 有关详细说明,请参阅在 Microsoft Fabric 中创建和使用托管专用终结点 - Microsoft Fabric

一旦托管专用终结点获得批准,用户就可以开始向目标 Azure 事件中心发出日志和指标。

后续步骤