Azure Databricks'te Shiny

Shiny , ETKILEŞIMLI R uygulamaları ve panoları oluşturmak için kullanılan CRAN üzerinde kullanılabilen bir R paketidir. Azure Databricks kümelerinde barındırılan RStudio Server'ın içinde Shiny kullanabilirsiniz. Ayrıca, doğrudan bir Azure Databricks not defterinden Shiny uygulamaları geliştirebilir, barındırabilir ve paylaşabilirsiniz.

Shiny ile çalışmaya başlamak için Bkz . Shiny öğreticileri. Bu öğreticileri Azure Databricks not defterlerinde çalıştırabilirsiniz.

Bu makalede, Azure Databricks'te Shiny uygulamalarını çalıştırma ve Shiny uygulamalarında Apache Spark'ın nasıl kullanılacağı açıklanmaktadır.

R not defterlerinin içinde parlak

R not defterleri içinde Shiny ile çalışmaya başlama

Shiny paketi Databricks Runtime'a dahildir. Azure Databricks R not defterleri içinde barındırılan RStudio'ya benzer şekilde Shiny uygulamaları etkileşimli olarak geliştirebilir ve test edebilirsiniz.

Başlamak için şu adımları izleyin:

  1. R not defteri oluşturun.

  2. Shiny paketini içeri aktarın ve örnek uygulamayı 01_hello aşağıdaki gibi çalıştırın:

      library(shiny)
      runExample("01_hello")
    
  3. Uygulama hazır olduğunda çıkış, tıklanabilir bağlantı olarak Shiny uygulama URL'sini içerir ve bu da yeni bir sekme açar. Bu uygulamayı diğer kullanıcılarla paylaşmak için bkz . Parlak uygulama URL'sini paylaşma.

    Örnek Shiny uygulaması

Not

  • Günlük iletileri, örnekte gösterilen varsayılan günlük iletisine (Listening on http://0.0.0.0:5150) benzer şekilde komut sonucunda görünür.
  • Shiny uygulamasını durdurmak için İptal'e tıklayın.
  • Shiny uygulaması not defteri R işlemini kullanır. Not defterini kümeden ayırırsanız veya uygulamayı çalıştıran hücreyi iptal ederseniz, Shiny uygulaması sonlandırılır. Shiny uygulaması çalışırken diğer hücreleri çalıştıramazsınız.

Databricks Git klasörlerinden Shiny uygulamaları çalıştırma

Databricks Git klasörlerine iade edilmiş Shiny uygulamalarını çalıştırabilirsiniz.

  1. Uzak git deposunu kopyalayın.

  2. Uygulamayı çalıştırın.

    library(shiny)
    runApp("006-tabsets")
    

Dosyalardan Shiny uygulamaları çalıştırma

Shiny uygulama kodunuz sürüm denetimi tarafından yönetilen bir projenin parçasıysa, bunu not defteri içinde çalıştırabilirsiniz.

Not

Mutlak yolu kullanmanız veya çalışma dizinini ile setwd()ayarlamanız gerekir.

  1. Aşağıdakine benzer bir kod kullanarak bir depodaki kodu gözden geçirin:

      %sh git clone https://github.com/rstudio/shiny-examples.git
      cloning into 'shiny-examples'...
    
  2. Uygulamayı çalıştırmak için başka bir hücreye aşağıdakine benzer bir kod girin:

    library(shiny)
    runApp("/databricks/driver/shiny-examples/007-widgets/")
    

Parlak uygulama URL'sini paylaşma

Uygulamayı başlattığınızda oluşturulan Shiny uygulama URL'si diğer kullanıcılarla paylaşılabilir. Kümede CAN ATTACH TO iznine sahip tüm Azure Databricks kullanıcıları, hem uygulama hem de küme çalıştığı sürece uygulamayı görüntüleyebilir ve uygulamayla etkileşimde bulunabilir.

Uygulamanın üzerinde çalıştığı küme sonlandırılırsa, uygulamaya artık erişilemez. Küme ayarlarında otomatik sonlandırmayı devre dışı bırakabilirsiniz.

Shiny uygulamasını barındıran not defterini farklı bir kümede ekleyip çalıştırırsanız, Shiny URL'si değişir. Ayrıca uygulamayı aynı kümede yeniden başlatırsanız, Shiny farklı bir rastgele bağlantı noktası seçebilir. Kararlı bir URL sağlamak için seçeneğini ayarlayabilir shiny.port veya uygulamayı aynı kümede yeniden başlatırken bağımsız değişkenini port belirtebilirsiniz.

Barındırılan RStudio Sunucusu'nda parlak

Gereksinimler

Önemli

RStudio Server Pro ile proksid kimlik doğrulamayı devre dışı bırakmanız gerekir. içinde /etc/rstudio/rserver.confolmadığından emin auth-proxy=1 olun.

Barındırılan RStudio Server'da Shiny ile çalışmaya başlama

  1. Azure Databricks'te RStudio'yu açın.

  2. RStudio'da Shiny paketini içeri aktarın ve örnek uygulamayı 01_hello aşağıdaki gibi çalıştırın:

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

    Shiny uygulamasını görüntüleyen yeni bir pencere görüntülenir.

    İlk Shiny uygulaması

R betiğinden Shiny uygulaması çalıştırma

Bir R betiğinden Shiny uygulaması çalıştırmak için R betiğini RStudio düzenleyicisinde açın ve sağ üstteki Uygulamayı Çalıştır düğmesine tıklayın.

Shiny run Uygulaması

Spark uygulamalarının içinde Apache Spark kullanma

SparkR veya sparklyr ile Spark uygulamaları içinde Apache Spark kullanabilirsiniz.

SparkR'ı not defterinde Shiny ile kullanma

library(shiny)
library(SparkR)
sparkR.session()

ui <- fluidPage(
  mainPanel(
    textOutput("value")
  )
)

server <- function(input, output) {
  output$value <- renderText({ nrow(createDataFrame(iris)) })
}

shinyApp(ui = ui, server = server)

Not defterinde Sparklyr'ı Shiny ile kullanma

library(shiny)
library(sparklyr)

sc <- spark_connect(method = "databricks")

ui <- fluidPage(
  mainPanel(
    textOutput("value")
  )
)

server <- function(input, output) {
  output$value <- renderText({
    df <- sdf_len(sc, 5, repartition = 1) %>%
      spark_apply(function(e) sum(e)) %>%
      collect()
    df$result
  })
}

shinyApp(ui = ui, server = server)
library(dplyr)
library(ggplot2)
library(shiny)
library(sparklyr)

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 Shiny uygulaması

Sık sorulan sorular (SSS)

Bir süre sonra Shiny uygulamam neden gri görünüyor?

Shiny uygulamasıyla etkileşim yoksa, uygulama bağlantısı yaklaşık 4 dakika sonra kapanır.

Yeniden bağlanmak için Shiny uygulama sayfasını yenileyin. Pano durumu sıfırlanır.

Shiny görüntüleyici pencerem neden bir süre sonra kayboluyor?

Parlak görüntüleyici penceresi birkaç dakika boyunca aylak gezdikten sonra kaybolursa, bunun nedeni "gri çıkış" senaryosuyla aynı zaman aşımıdır.

Uzun Spark işleri neden hiç geri dönmez?

Bunun nedeni de boşta kalma zaman aşımıdır. Daha önce bahsedilen zaman aşımlarından daha uzun süre çalışan herhangi bir Spark işi, iş dönmeden önce bağlantı kapandığından sonucunu işleyemiyor.

Zaman aşımını nasıl önleyebilirim?

  • Özellik isteğinde önerilen geçici bir çözüm vardır: Github'daki bazı yük dengeleyicilerde TCP zaman aşımını önlemek için istemcinin etkin tutma iletisi göndermesini sağlayın. Geçici çözüm, uygulama boşta olduğunda WebSocket bağlantısını canlı tutmak için sinyaller gönderir. Ancak, uygulama uzun süre çalışan bir hesaplama tarafından engellenirse, bu geçici çözüm çalışmaz.

  • Shiny uzun süre çalışan görevleri desteklemez. Shiny blog gönderisi, uzun görevleri zaman uyumsuz olarak çalıştırmak ve uygulamanın engelini kaldırmak için vaatlerin ve vadeli işlemlerin kullanılmasını önerir. Burada, Shiny uygulamasını canlı tutmak için sinyalleri kullanan ve bir yapıda uzun süre çalışan bir Spark işi çalıştıran bir future örnek verilmiştir.

    # 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)
    
  • İlk sayfa yüklemesinin ardından etkin olsa bile herhangi bir bağlantı sonlandırılacağından bu yana 12 saatlik sabit bir sınır vardır. Bu durumlarda yeniden bağlanmak için Shiny uygulamasını yenilemeniz gerekir. Ancak, temel alınan WebSocket bağlantısı, ağ kararlılığı veya bilgisayar uyku modu gibi çeşitli faktörlerle herhangi bir zamanda kapanabilir. Databricks, Parlak uygulamaların uzun süreli bir bağlantı gerektirmemesi ve oturum durumuna aşırı güvenmemesi için yeniden yazılmasını önerir.

Uygulamam başlatıldıktan hemen sonra kilitleniyor, ancak kod doğru görünüyor. Ne var ne yok?

Azure Databricks'teki Bir Shiny uygulamasında görüntülenebilen toplam veri miktarı üzerinde 50 MB sınırı vardır. Uygulamanın toplam veri boyutu bu sınırı aşarsa, başlatıldıktan hemen sonra kilitlenir. Bunu önlemek için Databricks, örneğin görüntülenen verileri aşağı örnekleyerek veya görüntülerin çözünürlüğünü azaltarak veri boyutunu azaltmanızı önerir.

Databricks en fazla 20 önerir.

Shiny paketinin Databricks Runtime'da yüklü olandan farklı bir sürümünü kullanabilir miyim?

Evet. Bkz . R Paketlerinin Sürümünü Düzeltme.

Bir Shiny sunucusunda yayımlanabilen ve Azure Databricks'te verilere erişebilen bir Shiny uygulamasını nasıl geliştirebilirim?

Azure Databricks'te geliştirme ve test sırasında SparkR veya sparklyr kullanarak verilere doğal olarak erişebilirsiniz ancak Bir Shiny uygulaması tek başına barındırma hizmetinde yayımlandıktan sonra Azure Databricks'te verilere ve tablolara doğrudan erişemez.

Uygulamanızın Azure Databricks dışında çalışmasını sağlamak için verilere erişme şeklinizi yeniden yazmanız gerekir. Birkaç seçenek vardır:

  • Azure Databricks kümesine sorgu göndermek için JDBC/ODBC kullanın.
  • Databricks Bağlan kullanın.
  • Nesne depolamadaki verilere doğrudan erişin.

Databricks, mevcut veri ve analiz mimariniz için en iyi yaklaşımı bulmak için Azure Databricks çözüm ekibinizle birlikte çalışmanızı önerir.

Azure Databricks not defteri içinde Shiny uygulaması geliştirebilir miyim?

Evet, Azure Databricks not defteri içinde Bir Shiny uygulaması geliştirebilirsiniz.

Barındırılan RStudio Server'da geliştirdiğim Shiny uygulamalarını nasıl kaydedebilirim?

Uygulama kodunuzu DBFS'ye kaydedebilir veya kodunuzu sürüm denetimine denetleyebilirsiniz.