Блестящие на размещенном сервере RStudio

« Блестящие » — это пакет R, доступный в Cran, который используется для создания интерактивных приложений R и панелей мониторинга. Вы можете использовать блестящие серверы в RStudio , размещенные на кластерах Azure Databricks.

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

В этой статье описывается, как запускать приложения для блестящих RStudio на Azure Databricks и использовать Apache Spark в приложениях для блестящих приложений.

Требования

Важно!

При использовании RStudio Server Pro необходимо отключить проверку подлинности через прокси-сервер. Убедитесь, что отсутствует auth-proxy=1 в /etc/rstudio/rserver.conf .

Приступая к работе с блестящими

  1. Откройте RStudio на Azure Databricks.

  2. В RStudio импортируйте пакет «блестящие» и запустите пример приложения 01_hello следующим образом:

    > library(shiny)
    > runExample("01_hello")
    
    Listening on http://127.0.0.1:3203
    

    Появится новое окно с изображением приложения «блестящие».

    Первое приложение для блестящих приложений

Запуск приложения для блестящих приложений из сценария R

Чтобы запустить приложение для блестящих приложений из скрипта R, Откройте скрипт R в редакторе RStudio и нажмите кнопку Run App (запустить приложение ) в правом верхнем углу.

Приложение для работы с блестящими приложениями

Использование Apache Spark внутри приложения для блестящих приложений

Вы можете использовать Apache Spark при разработке приложений для блестящих Azure Databricks. Вы можете взаимодействовать с Spark с помощью Spark и sparklyr. Для запуска задач Spark требуется по крайней мере один рабочий процесс.

В следующем примере для запуска заданий Spark используется компонент Spark. В примере используется набор данных ggplot2 бубенs для отображения цены ромбов по карата. Диапазон карата можно изменить с помощью ползунка в верхней части приложения, а диапазон оси x диаграммы изменится соответствующим образом.

library(SparkR)
library(sparklyr)
library(dplyr)
library(ggplot2)
sparkR.session()

sc <- spark_connect(method = "databricks")
diamonds_tbl <- spark_read_csv(sc, path = "/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv")

# Define the UI
ui <- fluidPage(
  sliderInput("carat", "Select Carat Range:",
              min = 0, max = 5, value = c(0, 5), step = 0.01),
  plotOutput('plot')
)

# Define the server code
server <- function(input, output) {
  output$plot <- renderPlot({
    # Select diamonds in carat range
    df <- diamonds_tbl %>%
      dplyr::select("carat", "price") %>%
      dplyr::filter(carat >= !!input$carat[[1]], carat <= !!input$carat[[2]])

    # Scatter plot with smoothed means
    ggplot(df, aes(carat, price)) +
      geom_point(alpha = 1/2) +
      geom_smooth() +
      scale_size_area(max_size = 2) +
      ggtitle("Price vs. Carat")
  })
}

# Return a Shiny app object

shinyApp(ui = ui, server = server)

Приложение Spark для блестящих

Вопросы и ответы

Разделы справки установить блестящие Databricks Runtime 6,4 Расширенная поддержка и Databricks Runtime 5,5 LTS?

Установите пакет «блестящие» как библиотеку Azure Databricks в кластере. Использование install.packages(‘shiny’) в консоли RStudio или с помощью диспетчера пакетов RStudio может не работать.

Почему мое приложение "блестящие" неактивное через некоторое время?

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

Чтобы повторно подключиться, обновите страницу приложения "блестящие". Сброс состояния панели мониторинга.

Почему окно «мое средство просмотра» исчезает через некоторое время?

Если окно средства просмотра «блестящие» исчезает после состояние простоя в течение нескольких минут, это происходит из-за того же времени ожидания, что и «серый» вариант.

После запуска приложение аварийно завершает работу, но код имеет правильный вид. если мне нужна команда docker run?

Существует ограничение в 20 МБ на общий объем данных, которые могут отображаться в приложении для блестящих Azure Databricks. Если общий размер данных приложения превышает это ограничение, после запуска произойдет сбой. Чтобы избежать этого, в модулях обработки данных рекомендуется уменьшить размер, например путем понижения количества отображаемых данных или уменьшения разрешения изображений.

Почему длительные задания Spark никогда не возвращаются?

Это также обусловлено временем ожидания простоя. Любое задание Spark, выполняемое дольше указанного ранее времени ожидания, не может обработать его результат, так как соединение закрывается перед возвратом задания.

Как избежать тайм-аута?

  • В этом потоке проблемыпредлагается решение. Обходное решение отправляет пакеты пульса для поддержания активности WebSocket во время бездействия приложения. Однако если приложение блокируется длительными вычислениями, это решение не работает.

  • Блестящие задачи не поддерживают выполнение длительных задач. В записи блога, посвященной публикации, рекомендуется использовать обещания и фьючерсы для асинхронного выполнения длительных задач и предотвращения блокировки приложения. Ниже приведен пример использования пакетов пульса для поддержания работы приложения для блестящих целей и выполнения длительного задания Spark в future конструкции.

    # Write an app that uses spark to access data on Databricks
    # First, install the following packages:
    install.packages(‘future’)
    install.packages(‘promises’)
    
    library(shiny)
    library(promises)
    library(future)
    plan(multisession)
    
    HEARTBEAT_INTERVAL_MILLIS = 1000  # 1 second
    
    # Define the long Spark job here
    run_spark <- function(x) {
      # Environment setting
      library("SparkR", lib.loc = "/databricks/spark/R/lib")
      sparkR.session()
    
      irisDF <- createDataFrame(iris)
      collect(irisDF)
      Sys.sleep(3)
      x + 1
    }
    
    run_spark_sparklyr <- function(x) {
      # Environment setting
      library(sparklyr)
      library(dplyr)
      library("SparkR", lib.loc = "/databricks/spark/R/lib")
      sparkR.session()
      sc <- spark_connect(method = "databricks")
    
      iris_tbl <- copy_to(sc, iris, overwrite = TRUE)
      collect(iris_tbl)
      x + 1
    }
    
    ui <- fluidPage(
      sidebarLayout(
        # Display heartbeat
        sidebarPanel(textOutput("keep_alive")),
    
        # Display the Input and Output of the Spark job
        mainPanel(
          numericInput('num', label = 'Input', value = 1),
          actionButton('submit', 'Submit'),
          textOutput('value')
        )
      )
    )
    server <- function(input, output) {
      #### Heartbeat ####
      # Define reactive variable
      cnt <- reactiveVal(0)
      # Define time dependent trigger
      autoInvalidate <- reactiveTimer(HEARTBEAT_INTERVAL_MILLIS)
      # Time dependent change of variable
      observeEvent(autoInvalidate(), {  cnt(cnt() + 1)  })
      # Render print
      output$keep_alive <- renderPrint(cnt())
    
      #### Spark job ####
      result <- reactiveVal() # the result of the spark job
      busy <- reactiveVal(0)  # whether the spark job is running
      # Launch a spark job in a future when actionButton is clicked
      observeEvent(input$submit, {
        if (busy() != 0) {
          showNotification("Already running Spark job...")
          return(NULL)
        }
        showNotification("Launching a new Spark job...")
        # input$num must be read outside the future
        input_x <- input$num
        fut <- future({ run_spark(input_x) }) %...>% result()
        # Or: fut <- future({ run_spark_sparklyr(input_x) }) %...>% result()
        busy(1)
        # Catch exceptions and notify the user
        fut <- catch(fut, function(e) {
          result(NULL)
          cat(e$message)
          showNotification(e$message)
        })
        fut <- finally(fut, function() { busy(0) })
        # Return something other than the promise so shiny remains responsive
        NULL
      })
      # When the spark job returns, render the value
      output$value <- renderPrint(result())
    }
    shinyApp(ui = ui, server = server)
    

Для модульных блоков можно использовать до 20.

Можно ли использовать версию пакета «блестящие», отличающуюся от версии, установленной в Databricks Runtime?

Да. См. статью исправление версии пакетов R.

Как разработать приложение для блестящих проектов, которое можно опубликовать на сервере и получить доступ к данным на Azure Databricks?

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

Чтобы приложение функционировало вне Azure Databricks, необходимо переписать доступ к данным. Существует несколько вариантов:

  • Используйте JDBC/ODBC для отправки запросов в кластер Azure Databricks.
  • Использование модулями связи.
  • Прямой доступ к данным в хранилище объектов.

Модуль данных рекомендует вам работать с группой решений Azure Databricks, чтобы найти оптимальный подход к имеющимся данным и архитектуре аналитики.

Как сохранить приложения, разработанные на Azure Databricks?

Вы можете сохранить код приложения в DBFS через подключение предохранителя или проверить код в системе управления версиями.

Можно ли разрабатывать приложения для блестящих приложений в записной книжке Azure Databricks?

Да, вы можете разработать приложение для блестящих приложений в записной книжке Azure Databricks. Дополнительные сведения см. в статье Использование «блестящих» в записях Notebooks в модуляхданных.