لامعة على Azure Databricks

لامعة هي حزمة R، متاحة على CRAN، وتستخدم لبناء تطبيقات R التفاعلية ولوحات المعلومات. يمكنك استخدام Shiny داخل RStudio Server المستضاف على مجموعات Azure Databricks. يمكنك أيضا تطوير التطبيقات اللامعة واستضافتها ومشاركتها مباشرة من دفتر ملاحظات Azure Databricks.

للبدء مع لامعة، راجع البرامج التعليمية لامعة. يمكنك تشغيل هذه البرامج التعليمية على دفاتر ملاحظات Azure Databricks.

توضح هذه المقالة كيفية تشغيل التطبيقات اللامعة على Azure Databricks واستخدام Apache Spark داخل التطبيقات اللامعة.

لامعة داخل دفاتر ملاحظات R

بدء استخدام دفاتر ملاحظات لامعة داخل R

يتم تضمين الحزمة اللامعة مع Databricks Runtime. يمكنك تطوير واختبار التطبيقات اللامعة بشكل تفاعلي داخل دفاتر ملاحظات Azure Databricks R بشكل مشابه ل RStudio المستضاف.

اتبع الخطوات التالية للبدء:

  1. إنشاء دفتر ملاحظات R.

  2. استيراد الحزمة لامعة وتشغيل مثال التطبيق 01_hello كما يلي:

      library(shiny)
      runExample("01_hello")
    
  3. عندما يكون التطبيق جاهزا، يتضمن الإخراج عنوان URL لتطبيق لامع كارتباط قابل للنقر يفتح علامة تبويب جديدة. لمشاركة هذا التطبيق مع مستخدمين آخرين، راجع مشاركة عنوان URL لتطبيق لامع.

    مثال على تطبيق لامع

إشعار

  • تظهر رسائل السجل في نتيجة الأمر، على غرار رسالة السجل الافتراضية (Listening on http://0.0.0.0:5150) الموضحة في المثال.
  • لإيقاف التطبيق اللامع، انقر فوق إلغاء الأمر.
  • يستخدم التطبيق اللامعة عملية R لدفتر الملاحظات. إذا فصلت دفتر الملاحظات عن نظام المجموعة، أو إذا قمت بإلغاء الخلية التي تقوم بتشغيل التطبيق، فسيتم إنهاء التطبيق لامع. لا يمكنك تشغيل خلايا أخرى أثناء تشغيل التطبيق لامع.

تشغيل تطبيقات لامعة من مجلدات Databricks Git

يمكنك تشغيل التطبيقات اللامعة التي تم التحقق منها في مجلدات Databricks Git.

  1. استنساخ مستودع Git بعيد.

  2. قم بتشغيل التطبيق:

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

تشغيل تطبيقات لامعة من الملفات

إذا كانت التعليمات البرمجية لتطبيقك اللامعة جزءا من مشروع تتم إدارته بواسطة التحكم بالإصدار، يمكنك تشغيله داخل دفتر الملاحظات.

إشعار

يجب استخدام المسار المطلق أو تعيين دليل العمل مع setwd().

  1. تحقق من التعليمات البرمجية من مستودع باستخدام تعليمات برمجية مشابهة ل:

      %sh git clone https://github.com/rstudio/shiny-examples.git
      cloning into 'shiny-examples'...
    
  2. لتشغيل التطبيق، أدخل تعليمة برمجية مشابهة للآتي في خلية أخرى:

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

مشاركة عنوان URL لتطبيق لامع

عنوان URL لتطبيق لامع الذي تم إنشاؤه عند بدء تشغيل تطبيق قابل للمشاركة مع مستخدمين آخرين. يمكن لأي مستخدم Azure Databricks مع إذن CAN ATTACH TO على نظام المجموعة عرض التطبيق والتفاعل معه طالما أن كل من التطبيق والكتلة قيد التشغيل.

إذا تم إنهاء نظام المجموعة الذي يعمل عليه التطبيق، فلن يعود من الممكن الوصول إلى التطبيق. يمكنك تعطيل الإنهاء التلقائي في إعدادات نظام المجموعة.

إذا قمت بإرفاق وتشغيل دفتر الملاحظات الذي يستضيف تطبيق لامع على مجموعة مختلفة، يتغير عنوان URL اللامعة. أيضا، إذا قمت بإعادة تشغيل التطبيق على نفس المجموعة، فقد يختار Shiny منفذا عشوائيا مختلفا. لضمان وجود عنوان URL ثابت، يمكنك تعيين shiny.port الخيار، أو عند إعادة تشغيل التطبيق على نفس المجموعة، يمكنك تحديد الوسيطة port .

لامعة على خادم RStudio المستضاف

المتطلبات

هام

باستخدام RStudio Server Pro، يجب تعطيل المصادقة المدعومة. تأكد من auth-proxy=1 عدم وجود داخل /etc/rstudio/rserver.conf.

بدء استخدام Shiny على خادم RStudio المستضاف

  1. افتح RStudio على Azure Databricks.

  2. في RStudio، قم باستيراد الحزمة Shiny وتشغيل تطبيق 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 داخل التطبيقات اللامعة مع SparkR أو sparklyr.

استخدام SparkR مع لامع في دفتر ملاحظات

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)

استخدام sparklyr مع لامع في دفتر ملاحظات

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 لامع

الأسئلة الشائعة (FAQ)

لماذا يظهر تطبيقي اللامع باللون الرمادي بعد مرور بعض الوقت؟

إذا لم يكن هناك تفاعل مع التطبيق اللامع، يتم إغلاق الاتصال بالتطبيق بعد حوالي 4 دقائق.

لإعادة الاتصال، قم بتحديث صفحة تطبيق لامع. يتم إعادة تعيين حالة لوحة المعلومات.

لماذا تختفي نافذة العارض اللامعة بعد فترة؟

إذا اختفت نافذة العارض اللامعة بعد الخمول لعدة دقائق، فهذا يرجع إلى نفس المهلة مثل سيناريو "الخروج الرمادي".

لماذا لا تعود وظائف Spark الطويلة أبدا؟

هذا أيضا بسبب مهلة الخمول. أي مهمة Spark تعمل لفترة أطول من المهلات المذكورة سابقا غير قادرة على عرض نتيجتها لأن الاتصال يغلق قبل إرجاع المهمة.

كيف يمكنني تجنب المهلة؟

  • هناك حل بديل مقترح في طلب الميزة: اطلب من العميل إرسال رسالة الاحتفاظ بالحيوية لمنع مهلة TCP على بعض موازنات التحميل على Github. يرسل الحل البديل رسائل كشف أخطاء الاتصال للحفاظ على اتصال 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)
    
  • هناك حد ثابت يبلغ 12 ساعة منذ تحميل الصفحة الأولية، وبعد ذلك سيتم إنهاء أي اتصال، حتى لو كان نشطا. يجب تحديث التطبيق اللامعة لإعادة الاتصال في هذه الحالات. ومع ذلك، يمكن إغلاق اتصال WebSocket الأساسي في أي وقت من خلال مجموعة متنوعة من العوامل بما في ذلك عدم استقرار الشبكة أو وضع السكون للكمبيوتر. توصي Databricks بإعادة كتابة التطبيقات اللامعة بحيث لا تتطلب اتصالا طويل الأمد ولا تعتمد اعتمادا مفرطا على حالة جلسة العمل.

يتعطل تطبيقي مباشرة بعد بدء التشغيل، ولكن يبدو أن التعليمات البرمجية صحيحة. ماذا يحدث؟

هناك حد 50 ميغابايت على إجمالي كمية البيانات التي يمكن عرضها في تطبيق لامع على Azure Databricks. إذا تجاوز إجمالي حجم بيانات التطبيق هذا الحد، فسيتعطل مباشرة بعد بدء التشغيل. لتجنب ذلك، توصي Databricks بتقليل حجم البيانات، على سبيل المثال عن طريق تقليل حجم البيانات المعروضة أو تقليل دقة الصور.

توصي Databricks بما يصل إلى 20.

هل يمكنني استخدام إصدار مختلف من الحزمة اللامعة عن الإصدار المثبت في Databricks Runtime؟

نعم. راجع إصلاح إصدار حزم R.

كيف يمكنني تطوير تطبيق لامع يمكن نشره إلى خادم لامع والوصول إلى البيانات على Azure Databricks؟

بينما يمكنك الوصول إلى البيانات بشكل طبيعي باستخدام SparkR أو sparklyr أثناء التطوير والاختبار على Azure Databricks، بعد نشر تطبيق لامع إلى خدمة استضافة مستقلة، فإنه لا يمكنه الوصول مباشرة إلى البيانات والجداول على Azure Databricks.

لتمكين تطبيقك من العمل خارج Azure Databricks، يجب إعادة كتابة كيفية الوصول إلى البيانات. هناك بعض الخيارات:

  • استخدم JDBC/ODBC لإرسال الاستعلامات إلى مجموعة Azure Databricks.
  • استخدم الاتصال Databricks.
  • الوصول مباشرة إلى البيانات على تخزين الكائن.

توصي Databricks بالعمل مع فريق حلول Azure Databricks للعثور على أفضل نهج للبيانات الحالية وبنية التحليلات.

هل يمكنني تطوير تطبيق لامع داخل دفتر ملاحظات Azure Databricks؟

نعم، يمكنك تطوير تطبيق لامع داخل دفتر ملاحظات Azure Databricks.

كيف يمكنني حفظ التطبيقات اللامعة التي طورتها على خادم RStudio المستضاف؟

يمكنك إما حفظ التعليمات البرمجية للتطبيق الخاص بك على DBFS أو التحقق من التعليمات البرمجية الخاصة بك في التحكم بالإصدار.