Сбор журналов и метрик приложений Apache Spark с помощью учетной записи служба хранилища Azure

В этой статье описывается место назначения Хранилище BLOB-объектов Azure внутри Fabric Apache Spark для эмиттера диагностики.

Эмиттер диагностики Apache Spark Fabric предоставляет общую модель конфигурации для диагностики Spark для различных направлений. В этом руководстве описана настройка модели для маршрутизации журналов Apache Spark, журналов событий и метрик в Хранилище BLOB-объектов Azure.

Рекомендации по выбору архитектуры и назначения эмиттера можно найти в разделе Обзор эмиттера диагностики Fabric Apache Spark.

Сбор журналов и метрик в учетную запись хранения

Шаг 1. Создание учетной записи хранения

Для сбора журналов диагностики и метрик можно использовать существующую учетную запись служба хранилища Azure. Если у вас его нет, вы можете создать учетную запись хранения blob-объектов Azure или создать учетную запись хранения для использования с Azure Data Lake Storage 2-го поколения.

Шаг 2. Создание артефакта среды Fabric с помощью конфигурации Apache Spark

Вариант 1. Настройка с помощью URI служба хранилища Azure и ключа доступа

  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.MyStorageBlob.auth: "AccessKey"
    spark.synapse.diagnostic.emitter.MyStorageBlob.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 Key Vault

Примечание.

Убедитесь, что пользователи, отправившие приложения Apache Spark, получают разрешения на чтение секретов. Дополнительные сведения см. в разделе Провиде доступ к ключам Key Vault, сертификатам и секретам Azure с помощью управления доступом на основе ролей.

Чтобы настроить Azure Key Vault для хранения ключа рабочей области:

  1. Создайте и перейдите в хранилище ключей на портале Azure.

  2. На странице параметров хранилища ключей выберите "Секреты", а затем "Создать и импортировать".

  3. На экране Создание секрета выберите следующие значения:

    • Имя — укажите имя секрета.
    • Значение — введите <storage-access-key> для секрета.
    • Оставьте другие значения по умолчанию. Затем выберите Создать.
  4. Создайте артефакт среды Fabric в системе Fabric.

  5. Добавьте следующие параметры Spark. Или выберите Добавить из .yml-файла на ленте, чтобы загрузить yaml-файл примера, который включает следующие свойства Spark.

    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_URI>
    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_URI>, <AZURE_KEY_VAULT_SECRET_KEY_NAME>. Дополнительную информацию о этих параметрах см. в разделе конфигурации служба хранилища Azure.

  6. Сохраните и опубликуйте изменения.

Вариант 3. Настройка с использованием проверки подлинности по сертификату

  1. Регистрация приложения

    1. Войдите на портал Azure и перейдите к Регистрация приложений.

    2. Создайте новую регистрацию приложения для передачи журналов и метрик в учетную запись служба хранилища Azure.

      Снимок экрана: создание регистрации приложения.

  2. Создание сертификата в Key Vault

    1. Перейдите к Key Vault.

    2. Разверните объект и выберите сертификаты.

    3. Щелкните Создать/Импортировать.

      Снимок экрана: создание нового сертификата для приложения.

  3. Доверие к сертификату в приложении

    1. Перейдите к регистрации приложения, созданной в 1 ->Manage ->Manifest.

    2. Добавьте сведения о сертификате в файл манифеста для установления доверия. Это обеспечивает доверие к сертификату на основе субъектной идентичности сервисного учетного объекта.

       "trustedCertificateSubjects": [ 
          { 
             "authorityId": "00000000-0000-0000-0000-000000000001", 
             "subjectName": "Your-Subject-of-Certificate", 
             "revokedCertificateIdentifiers": [] 
          } 
          ] 
      

      Снимок экрана: доверие к сертификату в приложении.

  4. Назначение роли участник данных хранилища BLOB

    1. В учетной записи служба хранилища Azure перейдите к элементу управления доступом (IAM).

    2. Назначьте приложению (служебному регистратору) роль вкладчика данных BLOB-объектов хранилища.

    Снимок экрана, показывающий назначение роли участника с доступом к данным хранилища BLOB-объектов.

  5. Настройка разрешений доступа Azure Key Vault

    1. На портале Azure перейдите к целевому Azure Key Vault.

    2. В разделе управления доступом (IAM) назначьте роль пользователя сертификатов Key Vault приложению (учетной записи службы), используемому издателем диагностики Spark.

Снимок экрана, показывающий назначение роли пользователя для сертификатов хранилища ключей.

  1. Создайте артефакт среды Fabric в Fabric и добавьте следующие свойства Spark с соответствующими значениями в артефакт среды.

    • < >EMITTER_NAME: имя эмитера.
    • < >CERTIFICATE_NAME. Имя сертификата, созданное в хранилище ключей.
    • <KEY_VAULT_URL>: URI хранилища ключей Azure (например, https://{keyvault-name}.vault.azure.net/).
    • <STORAGE_URI>: целевой путь Хранилище BLOB-объектов (например, https://{account-name}.blob.core.windows.net/{container-name}).
    • <SERVICE_PRINCIPAL_TENANT_ID>: идентификатор клиента сервисного субъекта можно найти в Регистрация приложений > название вашего приложения > Обзор -> Directory (идентификатор клиента)
    • < >SERVICE_PRINCIPAL_CLIENT_ID: Идентификатор клиента сервисного принципала можно найти в регистрациях > имени вашего приложения > в разделе Обзор > Идентификатор приложения (клиента)
       "spark.synapse.diagnostic.emitters": "<EMITTER_NAME>",
       "spark.synapse.diagnostic.emitter.<EMITTER_NAME>.type": "AzureStorage",
       "spark.synapse.diagnostic.emitter.<EMITTER_NAME>.categories": "DriverLog,ExecutorLog,EventLog,Metrics",
       "spark.synapse.diagnostic.emitter.<EMITTER_NAME>.uri": "<STORAGE_URI>",
       "spark.synapse.diagnostic.emitter.<EMITTER_NAME>.auth": "ServicePrincipalCert",
       "spark.synapse.diagnostic.emitter.<EMITTER_NAME>.certificate.keyVault.certificateName": "<CERTIFICATE_NAME>",
       "spark.synapse.diagnostic.emitter.<EMITTER_NAME>.certificate.keyVault": "<KEY_VAULT_URL>",
       "spark.synapse.diagnostic.emitter.<EMITTER_NAME>.tenantId": "<SERVICE_PRINCIPAL_TENANT_ID>",
       "spark.synapse.diagnostic.emitter.<EMITTER_NAME>.clientId": "<SERVICE_PRINCIPAL_CLIENT_ID>",
       "spark.fabric.pools.skipStarterPools": "true"
    

Шаг 3. Присоедините артефакт среды к записным книжкам или спецификациям заданий Spark, или установите его в качестве стандарта для рабочей области.

Примечание.

Только администраторы рабочих областей могут назначать среду как среду по умолчанию для рабочей области.

После установки она становится средой по умолчанию для всех записных книжек и определений заданий Spark в рабочей области. Дополнительные сведения см. в разделе Fabric Параметры рабочей области.

Чтобы подключить среду к определениям заданий Spark и записных книжек, выполните следующие действия.

  1. Перейдите к определенной записной книжке или определению задания Spark в Fabric.
  2. Выберите меню "Среда" на вкладке "Главная" и выберите среду с настроенными свойствами Диагностика Spark.
  3. Конфигурация применяется при запуске сеанса Spark.

Чтобы задать среду в качестве рабочей области по умолчанию, выполните следующие действия.

  1. Перейдите к параметрам рабочей области в Fabric.
  2. Найдите параметры Spark в параметрах рабочей области (параметры рабочей области>Инженерия/Наука о данных>параметры Spark).
  3. Выберите вкладку "Среда", выберите среду с настроенными свойствами диагностики Spark, и нажмите кнопку "Сохранить".

Шаг 4. Отправка приложения Apache Spark и просмотр журналов и метрик

Для записи настраиваемых журналов можно использовать библиотеку Apache Log4j.

Пример для 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")

Шаг 5. Просмотр файлов журналов в учетной записи хранения Azure

После отправки задания в настроенный сеанс Spark можно просмотреть файлы журналов и метрик в целевой учетной записи хранения. Журналы хранятся в соответствующих путях, которые зависят от разных приложений, указанных через <workspaceId>.<fabricLivyId>. Все файлы журнала находятся в формате строк JSON (также известных как json с разделителями newline или ndjson), что удобно для обработки данных.

Доступные конфигурации

Настройка Описание
spark.synapse.diagnostic.emitters Обязательное. Имена мест назначения диагностических передатчиков, разделенные запятой. Например: MyDest1,MyDest2
spark.synapse.diagnostic.emitter.<destination>.type Обязательное. Встроенный тип назначения. Чтобы включить назначение хранилища Azure, необходимо включить AzureStorage в это поле.
spark.synapse.diagnostic.emitter.<destination>.categories Необязательно. Выбранные категории журнала, разделенные запятой. Доступные значения: DriverLog, ExecutorLog, EventLog, Metrics. Если значение по умолчанию не задано, это все категории.
spark.synapse.diagnostic.emitter.<destination>.auth Обязательное. AccessKey для использования авторизации с помощью ключа доступа к учетной записи хранилища. SAS для авторизации подписей с общим доступом. ServicePrincipalCert для использования авторизации через AAD с применением принципала службы и сертификата.
spark.synapse.diagnostic.emitter.<destination>.uri Обязательное. URI папки целевого контейнера BLOB-объектов. Ожидается соответствие шаблону https://<my-blob-storage>.blob.core.windows.net/<container-name>/<folder-name>.
spark.synapse.diagnostic.emitter.<destination>.secret Необязательно. Содержимое секрета (AccessKey или SAS). Требуется, если используется .auth = AccessKey или используется SAS, но .secret.keyVault не указан.
spark.synapse.diagnostic.emitter.<destination>.secret.keyVault Требуется, если используется .auth = AccessKey или используется SAS, но .secret не указан. URI хранилища ключей Azure Key Vault, где хранится секрет (AccessKey или SAS).
spark.synapse.diagnostic.emitter.<destination>.secret.keyVault.secretName Обязателен, если указан ключ .secret.keyVault. Имя секрета Azure Key Vault, в котором хранится секрет (AccessKey или SAS).
spark.synapse.diagnostic.emitter.<destination>.tenantId Обязательный при использовании .auth = ServicePrincipalCert. Идентификатор клиента Azure Active Directory субъекта-службы.
spark.synapse.diagnostic.emitter.<destination>.clientId Обязательный при использовании .auth = ServicePrincipalCert. Идентификатор приложения (клиента) субъекта-службы.
spark.synapse.diagnostic.emitter.<destination>.certificate.keyVault.certificateName Обязательный при использовании .auth = ServicePrincipalCert. Имя сертификата, хранящееся в Azure Key Vault, используемое для проверки подлинности на основе сертификата субъекта-службы.
spark.synapse.diagnostic.emitter.<destination>.certificate.keyVault Обязательный при использовании .auth = ServicePrincipalCert. URL-адрес Azure Key Vault, в котором хранится сертификат.
spark.synapse.diagnostic.emitter.<destination>.filter.eventName.match Необязательно. Имена событий Apache 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": "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"
    // ...
  }
}

Рабочие области Fabric с управляемой виртуальной сетью

Создайте управляемую частную конечную точку для целевого Хранилище BLOB-объектов Azure. Подробные инструкции см. статью Создание и использование управляемых частных конечных точек в Microsoft Fabric - Microsoft Fabric.

После того как управляемая частная конечная точка будет утверждена, пользователи могут начать отправлять журналы и метрики в целевое хранилище Azure Blob.

Следующие шаги