使用 Azure 存储帐户收集 Apache Spark 应用程序日志和指标(预览版)

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

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

将日志和指标收集到存储帐户

步骤 1:创建存储帐户

若要收集诊断日志和指标,可以使用现有的 Azure 存储帐户。 如果没有帐户,可以创建一个 Azure Blob 存储帐户,或创建一个用于 Azure Data Lake Storage Gen2 的存储帐户

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

选项 1:使用 Azure 存储 URI 和访问密钥进行配置

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

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

    spark.synapse.diagnostic.emitters: MyStorageBlob
    spark.synapse.diagnostic.emitter.MyStorageBlob.type: "AzureStorage"
    spark.synapse.diagnostic.emitter.MyStorageBlob.categories: "DriverLog,ExecutorLog,EventLog,Metrics"
    spark.synapse.diagnostic.emitter.MyStorageBlob.uri:  "https://<my-blob-storage>.blob.core.windows.net/<container-name>/<folder-name>"
    spark.synapse.diagnostic.emitter.MyDestination1.auth: "AccessKey"
    spark.synapse.diagnostic.emitter.MyDestination1.secret: <storage-access-key>
    spark.fabric.pools.skipStarterPools: "true" //Add this Spark property when using the default pool.
    

    在配置文件中填写以下参数:<my-blob-storage><container-name><folder-name><storage-access-key>。 有关这些参数的更多详细信息,请参阅 Azure 存储配置

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

注意

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

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

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

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

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

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

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

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

    spark.synapse.diagnostic.emitters: <MyStorageBlob>
    spark.synapse.diagnostic.emitter.MyStorageBlob.type: "AzureStorage"
    spark.synapse.diagnostic.emitter.MyStorageBlob.categories: "DriverLog,ExecutorLog,EventLog,Metrics"
    spark.synapse.diagnostic.emitter.MyStorageBlob.uri:  "https://<my-blob-storage>.blob.core.windows.net/<container-name>/<folder-name>"
    spark.synapse.diagnostic.emitter.MyStorageBlob.auth: "AccessKey"
    spark.synapse.diagnostic.emitter.MyStorageBlob.secret.keyVault: <AZURE_KEY_VAULT_NAME>
    spark.synapse.diagnostic.emitter.MyStorageBlob.secret.keyVault.secretName: <AZURE_KEY_VAULT_SECRET_KEY_NAME>
    spark.fabric.pools.skipStarterPools: "true" //Add this Spark property when using the default pool.
    

    在配置文件中填写以下参数:<my-blob-storage><container-name><folder-name><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 工作区设置

步骤 4:查看 Azure 存储帐户中的日志文件

将作业提交到配置的 Spark 会话后,可以查看目标存储帐户中的日志和指标文件。 日志根据 <workspaceId>.<fabricLivyId> 所标识的不同应用程序存储在相应的路径中。 所有日志文件都采用 JSON 行格式(也称为换行符分隔的 JSON 或 ndjson),便于数据处理。

“可用配置”

配置 说明
spark.synapse.diagnostic.emitters 必需。 诊断发射器以逗号分隔的目标名称。 例如: MyDest1,MyDest2
spark.synapse.diagnostic.emitter.<destination>.type 必需。 内置目标类型。 若要启用 Azure 存储目标,此字段中需要包含 AzureStorage
spark.synapse.diagnostic.emitter.<destination>.categories 可选。 以逗号分隔的选定日志类别。 可用的值包括 DriverLogExecutorLogEventLogMetrics。 如果未设置,则默认值为“所有”类别。
spark.synapse.diagnostic.emitter.<destination>.auth 必需。 AccessKey 表示使用存储帐户访问密钥授权。 SAS 表示共享访问签名授权。
spark.synapse.diagnostic.emitter.<destination>.uri 必需。 目标 Blob 容器文件夹 URI。 应匹配模式 https://<my-blob-storage>.blob.core.windows.net/<container-name>/<folder-name>
spark.synapse.diagnostic.emitter.<destination>.secret 可选。 机密(AccessKey 或 SAS)内容。
spark.synapse.diagnostic.emitter.<destination>.secret.keyVault 如果未指定 .secret,则为必需项。 存储机密(AccessKey 或 SAS)的 Azure Key Vault 名称。
spark.synapse.diagnostic.emitter.<destination>.secret.keyVault.secretName 如果指定了 .secret.keyVault,则该参数是必需的。 存储机密(AccessKey 或 SAS)的 Azure Key Vault 机密名称。
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,以触发库来发出日志和指标。

日志数据示例

下面是 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 Blob 存储创建托管专用终结点。 有关详细说明,请参阅在 Microsoft Fabric 中创建和使用托管专用终结点 - Microsoft Fabric

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

后续步骤