لامعة على Azure Databricks
لامعة هي حزمة R، متاحة على CRAN، وتستخدم لبناء تطبيقات R التفاعلية ولوحات المعلومات. يمكنك استخدام Shiny داخل RStudio Server المستضاف على مجموعات Azure Databricks. يمكنك أيضا تطوير التطبيقات اللامعة واستضافتها ومشاركتها مباشرة من دفتر ملاحظات Azure Databricks.
للبدء مع لامعة، راجع البرامج التعليمية لامعة. يمكنك تشغيل هذه البرامج التعليمية على دفاتر ملاحظات Azure Databricks.
توضح هذه المقالة كيفية تشغيل التطبيقات اللامعة على Azure Databricks واستخدام Apache Spark داخل التطبيقات اللامعة.
يتم تضمين الحزمة اللامعة مع Databricks Runtime. يمكنك تطوير واختبار التطبيقات اللامعة بشكل تفاعلي داخل دفاتر ملاحظات Azure Databricks R بشكل مشابه ل RStudio المستضاف.
اتبع الخطوات التالية للبدء:
إنشاء دفتر ملاحظات R.
استيراد الحزمة لامعة وتشغيل مثال التطبيق
01_hello
كما يلي:library(shiny) runExample("01_hello")
عندما يكون التطبيق جاهزا، يتضمن الإخراج عنوان URL لتطبيق لامع كارتباط قابل للنقر يفتح علامة تبويب جديدة. لمشاركة هذا التطبيق مع مستخدمين آخرين، راجع مشاركة عنوان URL لتطبيق لامع.
ملاحظة
- تظهر رسائل السجل في نتيجة الأمر، على غرار رسالة السجل الافتراضية (
Listening on http://0.0.0.0:5150
) الموضحة في المثال. - لإيقاف التطبيق اللامع، انقر فوق إلغاء الأمر.
- يستخدم التطبيق اللامعة عملية R لدفتر الملاحظات. إذا فصلت دفتر الملاحظات عن نظام المجموعة، أو إذا قمت بإلغاء الخلية التي تقوم بتشغيل التطبيق، إنهاء التطبيق لامع. لا يمكنك تشغيل خلايا أخرى أثناء تشغيل التطبيق لامع.
يمكنك تشغيل التطبيقات اللامعة التي تم التحقق منها في مجلدات Databricks Git.
استنساخ مستودع Git بعيد.
قم بتشغيل التطبيق:
library(shiny) runApp("006-tabsets")
إذا كانت التعليمات البرمجية لتطبيقك اللامعة جزءا من مشروع تتم إدارته بواسطة التحكم بالإصدار، يمكنك تشغيله داخل دفتر الملاحظات.
ملاحظة
يجب استخدام المسار المطلق أو تعيين دليل العمل مع setwd()
.
تحقق من التعليمات البرمجية من مستودع باستخدام تعليمات برمجية مشابهة ل:
%sh git clone https://github.com/rstudio/shiny-examples.git cloning into 'shiny-examples'...
لتشغيل التطبيق، أدخل تعليمة برمجية مشابهة للآتي في خلية أخرى:
library(shiny) runApp("/databricks/driver/shiny-examples/007-widgets/")
عنوان URL لتطبيق لامع الذي تم إنشاؤه عند بدء تشغيل تطبيق قابل للمشاركة مع مستخدمين آخرين. يمكن لأي مستخدم Azure Databricks مع إذن CAN ATTACH TO على نظام المجموعة عرض التطبيق والتفاعل معه طالما أن كل من التطبيق والكتلة قيد التشغيل.
إذا تم إنهاء نظام المجموعة الذي يعمل عليه التطبيق، فلن يعود من الممكن الوصول إلى التطبيق. يمكنك تعطيل الإنهاء التلقائي في إعدادات نظام المجموعة.
إذا قمت بإرفاق وتشغيل دفتر الملاحظات الذي يستضيف تطبيق لامع على مجموعة مختلفة، يتغير عنوان URL اللامعة. أيضا، إذا قمت بإعادة تشغيل التطبيق على نفس المجموعة، فقد يختار Shiny منفذا عشوائيا مختلفا. لضمان وجود عنوان URL ثابت، يمكنك تعيين shiny.port
الخيار، أو عند إعادة تشغيل التطبيق على نفس المجموعة، يمكنك تحديد الوسيطة port
.
هام
باستخدام RStudio Server Pro، يجب تعطيل المصادقة المدعومة.
تأكد من auth-proxy=1
عدم وجود داخل /etc/rstudio/rserver.conf
.
افتح RStudio على Azure Databricks.
في RStudio، قم باستيراد الحزمة Shiny وتشغيل تطبيق
01_hello
المثال كما يلي:> library(shiny) > runExample("01_hello") Listening on http://127.0.0.1:3203
تظهر نافذة جديدة تعرض التطبيق اللامعة.
لتشغيل تطبيق لامع من برنامج نصي R، افتح البرنامج النصي R في محرر RStudio وانقر فوق الزر Run App في أعلى اليمين.
يمكنك استخدام Apache Spark داخل التطبيقات اللامعة مع SparkR أو sparklyr.
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)
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 الطويلة أبدا؟
- كيف يمكنني تجنب المهلة؟
- يتعطل تطبيقي مباشرة بعد بدء التشغيل، ولكن يبدو أن التعليمات البرمجية صحيحة. ماذا يحدث؟
- كم عدد الاتصالات التي يمكن قبولها لارتباط تطبيق لامع واحد أثناء التطوير؟
- هل يمكنني استخدام إصدار مختلف من الحزمة اللامعة عن الإصدار المثبت في Databricks Runtime؟
- كيف يمكنني تطوير تطبيق لامع يمكن نشره إلى خادم لامع والوصول إلى البيانات على Azure Databricks؟
- هل يمكنني تطوير تطبيق لامع داخل دفتر ملاحظات Azure Databricks؟
- كيف يمكنني حفظ التطبيقات اللامعة التي طورتها على خادم RStudio المستضاف؟
إذا لم يكن هناك تفاعل مع التطبيق اللامع، يتم إغلاق الاتصال بالتطبيق بعد حوالي 4 دقائق.
لإعادة الاتصال، قم بتحديث صفحة تطبيق لامع. يتم إعادة تعيين حالة لوحة المعلومات.
إذا اختفت نافذة العارض اللامعة بعد الخمول لعدة دقائق، فهذا يرجع إلى نفس المهلة مثل سيناريو "الخروج الرمادي".
هذا أيضا بسبب مهلة الخمول. أي مهمة 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.
نعم. راجع إصلاح إصدار حزم R.
بينما يمكنك الوصول إلى البيانات بشكل طبيعي باستخدام SparkR أو sparklyr أثناء التطوير والاختبار على Azure Databricks، بعد نشر تطبيق لامع إلى خدمة استضافة مستقلة، فإنه لا يمكنه الوصول مباشرة إلى البيانات والجداول على Azure Databricks.
لتمكين تطبيقك من العمل خارج Azure Databricks، يجب إعادة كتابة كيفية الوصول إلى البيانات. هناك بعض الخيارات:
- استخدم JDBC/ODBC لإرسال الاستعلامات إلى مجموعة Azure Databricks.
- استخدم Databricks Connect.
- الوصول مباشرة إلى البيانات على تخزين الكائن.
توصي Databricks بالعمل مع فريق حلول Azure Databricks للعثور على أفضل نهج للبيانات الحالية وبنية التحليلات.
نعم، يمكنك تطوير تطبيق لامع داخل دفتر ملاحظات Azure Databricks.
يمكنك إما حفظ التعليمات البرمجية للتطبيق الخاص بك على DBFS أو التحقق من التعليمات البرمجية الخاصة بك في التحكم بالإصدار.