Поделиться через


Пакет SDK Databricks для R

Примечание.

В этой статье рассматривается пакет SDK Databricks для R databricks Labs, который находится в экспериментальном состоянии. Чтобы предоставить отзывы, задать вопросы и сообщить о проблемах, используйте вкладку "Проблемы " в пакете SDK Databricks для репозитория R в GitHub.

В этой статье вы узнаете, как автоматизировать операции в рабочих областях Azure Databricks и связанных ресурсах с помощью пакета SDK Databricks для R. Эта статья дополняет пакет SDK Databricks для R.

Примечание.

Пакет SDK Databricks для R не поддерживает автоматизацию операций в учетных записях Azure Databricks. Для вызова операций на уровне учетной записи используйте другой пакет SDK Databricks, например:

Подготовка к работе

Прежде чем приступить к использованию пакета SDK Databricks для R, компьютер разработки должен иметь следующее:

  • Личный маркер доступа Azure Databricks для целевой рабочей области Azure Databricks, которую требуется автоматизировать.

    Примечание.

    Пакет SDK Databricks для R поддерживает только проверку подлинности маркера личного доступа Azure Databricks.

  • R и, при необходимости, интегрированная среда разработки с совместимостью R. Databricks рекомендует RStudio Desktop и использует его в инструкциях этой статьи.

Начало работы с пакетом SDK Databricks для R

  1. Создайте URL-адрес рабочей области Azure Databricks и личный маркер доступа для сценариев проекта R. Например, можно добавить следующий код в файл проекта .Renviron R. Замените <your-workspace-url> URL-адрес рабочей области, напримерhttps://adb-1234567890123456.7.azuredatabricks.net. Замените <your-personal-access-token> личные маркеры доступа Azure Databricks, например dapi12345678901234567890123456789012.

    DATABRICKS_HOST=<your-workspace-url>
    DATABRICKS_TOKEN=<your-personal-access-token>
    

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

    1. В рабочей области Azure Databricks щелкните имя пользователя Azure Databricks в верхней строке и выберите Параметры в раскрывающемся списке.
    2. Щелкните "Разработчик".
    3. Рядом с маркерами доступа нажмите кнопку "Управление".
    4. Щелкните Generate new token (Создание нового маркера).
    5. (Необязательно) Введите комментарий, который поможет определить этот маркер в будущем и изменить время существования маркера по умолчанию в течение 90 дней. Чтобы создать маркер без времени существования (не рекомендуется), оставьте поле время существования (дни) пустым (пустым).
    6. Щелкните Создать.
    7. Скопируйте отображаемый маркер в безопасное расположение и нажмите кнопку "Готово".

    Примечание.

    Не забудьте сохранить скопированный маркер в безопасном расположении. Не делитесь скопированным маркером с другими пользователями. Если вы потеряете скопированный маркер, вы не сможете повторно создать тот же маркер. Вместо этого необходимо повторить эту процедуру, чтобы создать новый маркер. Если вы потеряете скопированный маркер или считаете, что маркер скомпрометирован, Databricks настоятельно рекомендует немедленно удалить этот маркер из рабочей области, щелкнув значок корзины (отозвать) рядом с маркером на странице маркеров доступа.

    Если вы не можете создавать или использовать маркеры в рабочей области, это может быть связано с тем, что администратор рабочей области отключил маркеры или не предоставил вам разрешение на создание или использование маркеров. Обратитесь к администратору рабочей области или следующему:

    Дополнительные способы предоставления URL-адреса рабочей области Azure Databricks и личного маркера доступа см. в статье "Проверка подлинности " в пакете SDK Databricks для репозитория R в GitHub.

    Внимание

    Не добавляйте .Renviron файлы в системы управления версиями, так как это рискует предоставлять конфиденциальную информацию, например личные маркеры доступа Azure Databricks.

  2. Установите пакет SDK Databricks для R. Например, в RStudio Desktop в представлении консоли (просмотр фокуса на консоль) выполните следующие команды:>

    install.packages("devtools")
    library(devtools)
    install_github("databrickslabs/databricks-sdk-r")
    

    Примечание.

    Пакет SDK Databricks для R недоступен в CRAN.

  3. Добавьте код для ссылки на пакет SDK Databricks для R и список всех кластеров в рабочей области Azure Databricks. Например, в файле проекта main.r код может быть следующим:

    require(databricks)
    
    client <- DatabricksClient()
    
    list_clusters(client)[, "cluster_name"]
    
  4. Запустите скрипт. Например, в RStudio Desktop в редакторе скриптов с активным файлом проекта main.r щелкните источник > или источник с помощью Echo.

  5. Появится список кластеров. Например, в RStudio Desktop это в представлении консоли .

Примеры кода

В следующих примерах кода показано, как использовать пакет SDK Databricks для R для создания и удаления кластеров и создания заданий.

Создание кластера

В этом примере кода создается кластер с указанной версией Databricks Runtime и типом узла кластера. Этот кластер имеет одну рабочую роль, а кластер автоматически завершает работу через 15 минут времени простоя.

require(databricks)

client <- DatabricksClient()

response <- create_cluster(
  client = client,
  cluster_name = "my-cluster",
  spark_version = "12.2.x-scala2.12",
  node_type_id = "Standard_DS3_v2",
  autotermination_minutes = 15,
  num_workers = 1
)

# Get the workspace URL to be used in the following results message.
get_client_debug <- strsplit(client$debug_string(), split = "host=")
get_host <- strsplit(get_client_debug[[1]][2], split = ",")
host <- get_host[[1]][1]

# Make sure the workspace URL ends with a forward slash.
if (endsWith(host, "/")) {
} else {
  host <- paste(host, "/", sep = "")
}

print(paste(
  "View the cluster at ",
  host,
  "#setting/clusters/",
  response$cluster_id,
  "/configuration",
  sep = "")
)

Окончательное удаление пользователя

Этот пример кода окончательно удаляет кластер с указанным идентификатором кластера из рабочей области.

require(databricks)

client <- DatabricksClient()

cluster_id <- readline("ID of the cluster to delete (for example, 1234-567890-ab123cd4):")

delete_cluster(client, cluster_id)

Создание задания

В этом примере кода создается задание Azure Databricks, которое можно использовать для запуска указанной записной книжки в указанном кластере. По мере выполнения этого кода он получает путь к существующей записной книжке, существующий идентификатор кластера и связанные параметры задания от пользователя в консоли.

require(databricks)

client <- DatabricksClient()

job_name <- readline("Some short name for the job (for example, my-job):")
description <- readline("Some short description for the job (for example, My job):")
existing_cluster_id <- readline("ID of the existing cluster in the workspace to run the job on (for example, 1234-567890-ab123cd4):")
notebook_path <- readline("Workspace path of the notebook to run (for example, /Users/someone@example.com/my-notebook):")
task_key <- readline("Some key to apply to the job's tasks (for example, my-key):")

print("Attempting to create the job. Please wait...")

notebook_task <- list(
  notebook_path = notebook_path,
  source = "WORKSPACE"
)

job_task <- list(
  task_key = task_key,
  description = description,
  existing_cluster_id = existing_cluster_id,
  notebook_task = notebook_task
)

response <- create_job(
  client,
  name = job_name,
  tasks = list(job_task)
)

# Get the workspace URL to be used in the following results message.
get_client_debug <- strsplit(client$debug_string(), split = "host=")
get_host <- strsplit(get_client_debug[[1]][2], split = ",")
host <- get_host[[1]][1]

# Make sure the workspace URL ends with a forward slash.
if (endsWith(host, "/")) {
} else {
  host <- paste(host, "/", sep = "")
}

print(paste(
  "View the job at ",
  host,
  "#job/",
  response$job_id,
  sep = "")
)

Ведение журнала

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

  1. Установите пакет logging. Например, в рабочем столе RStudio в представлении консоли (просмотр > фокуса на консоль) выполните следующие команды:

    install.packages("logging")
    library(logging)
    
  2. Загрузите пакет ведения журнала, установите место для регистрации сообщений и задайте уровень ведения журнала. Например, следующий код регистрирует все ERROR сообщения и ниже в results.log файл.

    basicConfig()
    addHandler(writeToFile, file="results.log")
    setLevel("ERROR")
    
  3. При необходимости регистрируют сообщения. Например, следующий код регистрирует ошибки, если код не может пройти проверку подлинности или перечислить имена доступных кластеров.

    require(databricks)
    require(logging)
    
    basicConfig()
    addHandler(writeToFile, file="results.log")
    setLevel("ERROR")
    
    tryCatch({
      client <- DatabricksClient()
    }, error = function(e) {
      logerror(paste("Error initializing DatabricksClient(): ", e$message))
      return(NA)
    })
    
    tryCatch({
      list_clusters(client)[, "cluster_name"]
    }, error = function(e) {
      logerror(paste("Error in list_clusters(client): ", e$message))
      return(NA)
    })
    

Тестирование

Для тестирования кода можно использовать платформы тестирования R, такие как testthat. Чтобы протестировать код в имитированных условиях без вызова конечных точек REST API Azure Databricks или изменения состояния учетных записей Или рабочих областей Azure Databricks, можно использовать библиотеки R, такие как насмешка.

Например, учитывая следующий файл с именем helpers.r , содержащий createCluster функцию, которая возвращает сведения о новом кластере:

library(databricks)

createCluster <- function(
  databricks_client,
  cluster_name,
  spark_version,
  node_type_id,
  autotermination_minutes,
  num_workers
) {
  response <- create_cluster(
    client = databricks_client,
    cluster_name = cluster_name,
    spark_version = spark_version,
    node_type_id = node_type_id,
    autotermination_minutes = autotermination_minutes,
    num_workers = num_workers
  )
  return(response)
}

И учитывая следующий файл с именем main.R , который вызывает функцию createCluster :

library(databricks)
source("helpers.R")

client <- DatabricksClient()

# Replace <spark-version> with the target Spark version string.
# Replace <node-type-id> with the target node type string.
response = createCluster(
  databricks_client = client,
  cluster_name = "my-cluster",
  spark_version = "<spark-version>",
  node_type_id = "<node-type-id>",
  autotermination_minutes = 15,
  num_workers = 1
)

print(response$cluster_id)

Следующий файл с именем test-helpers.py проверяет, возвращает ли createCluster функция ожидаемый ответ. Вместо того чтобы создать кластер в целевой рабочей области, этот тест макетирует DatabricksClient объект, определяет параметры макетированного объекта, а затем передает макетируемый объект в функцию createCluster . Затем тест проверка, возвращает ли функция ожидаемый идентификатор нового макетированного кластера.

# install.packages("testthat")
# install.pacakges("mockery")
# testthat::test_file("test-helpers.R")
lapply(c("databricks", "testthat", "mockery"), library, character.only = TRUE)
source("helpers.R")

test_that("createCluster mock returns expected results", {
  # Create a mock response.
  mock_response <- list(cluster_id = "abc123")

  # Create a mock function for create_cluster().
  mock_create_cluster <- mock(return_value = mock_response)

  # Run the test with the mock function.
  with_mock(
    create_cluster = mock_create_cluster,
    {
      # Create a mock Databricks client.
      mock_client <- mock()

      # Call the function with the mock client.
      # Replace <spark-version> with the target Spark version string.
      # Replace <node-type-id> with the target node type string.
      response <- createCluster(
        databricks_client = mock_client,
        cluster_name = "my-cluster",
        spark_version = "<spark-version>",
        node_type_id = "<node-type-id>",
        autotermination_minutes = 15,
        num_workers = 1
      )

      # Check that the function returned the correct mock response.
      expect_equal(response$cluster_id, "abc123")
    }
  )
})

Дополнительные ресурсы

Дополнительные сведения см. в разделе: