使用 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 密钥保管库

注意

确保提交 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_URI>
    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_URI><AZURE_KEY_VAULT_SECRET_KEY_NAME>。 有关这些参数的更多详细信息,请参阅 Azure 事件中心配置

  6. 保存并发布更改。

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

注意

  • 只有工作区管理员可以将环境指定为工作区的默认值。
  • 设置后,它将成为工作区中所有笔记本和 Spark 作业定义的默认环境。 有关详细信息,请参阅 Fabric 工作区设置

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

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

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

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

“可用配置”

配置 说明
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 Key Vault URI。
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
spark.fabric.pools.skipStarterPools 必需。 此 Spark 属性用于强制按需 Spark 会话。 使用默认池时,应将该值设置为 true,以便触发库发出日志和指标。

注意

Azure EventHub 实例连接字符串应始终包含 EntityPathAzure 事件中心实例的名称。

日志数据示例

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

{
  "timestamp": "2025-02-28T09:13:57.978Z",
  "category": "Log|EventLog|Metrics",
  "fabricLivyId": "<fabric-livy-id>",
  "applicationId": "<application-id>",
  "applicationName": "<application-name>",
  "executorId": "<driver-or-executor-id>",
  "userId": "<the-submitter-user-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": "2025-02-28T09:13:57.941Z",
    "message": "ApplicationAttemptId: appattempt_1740734011890_0001_000001",
    "logger_name": "org.apache.spark.deploy.yarn.ApplicationMaster",
    "level": "INFO",
    "thread_name": "main"
    // ...
  }
}

向 Azure 事件中心发出诊断后,可以将该 事件中心用作 Fabric 事件流中的源 来处理或路由数据。

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

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

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

后续步骤