我對如何開發和部署"Shiny-SparkR"的應用一直很感興趣,本文將展現如何使用 SparkR 來驅動 Shiny 應用。前端
SparkR是一個爲R提供了輕量級的Spark前端的R包。 SparkR提供了一個分佈式的data frame數據結構,解決了 R中的data frame只能在單機中使用的瓶頸,它和R中的data frame 同樣支持許多操做,好比select
,filter
,aggregate
等等。(相似dplyr
包中的功能)這很好的解決了R的大數據級瓶頸問題。 SparkR也支持分佈式的機器學習算法,好比使用MLib
機器學習庫。java
Shiny 是一個開源的 R 包,它爲使用 R 構建 Web 應用提供了一個優雅有力的 Web 框架。Shiny 幫助你在不須要前端知識的條件下將數據分析轉變爲可交互的 Web 應用。git
你可能會問本身,「爲何我須要使用SparkR運行個人程序?」。這是一個合乎情理的問題和回答,咱們須要理解不一樣類型的大數據問題。github
最近,在 Reddit 的 AMA頻道 上, Hadley Wickham(RStudio首席科學家)描繪了一幅清晰的「大數據」定義。他的看法將幫助咱們爲SparkR和Shiny定義用例。算法
我認爲大數據問題應分類三個主要類:sql
大數據小分析:數據科學家針對某一個特定的業務或研究問題從一個大的原始數據集開始作數據切片和數據抽樣。
在大多數項目中,抽樣結果都是小數據集,而這些項目中並不須要用到 SparkR 來驅動 Shiny應用。apache
分片聚合分析:數據科學家須要在多臺機器上分佈式地並行計算。Wickham 認爲這是一個瑣碎的並行化問題。一個例子就是當大規模計算時,你須要在成千上萬的機器上爲每個機器都擬合一個模型。在這種狀況下 SparkR 是一個不錯的選擇,但也能夠用 R 的 foreach
等包來解決這個問題。segmentfault
大規模的數據分析:數據科學家須要大數據,多是由於他們在處理一個複雜的模型擬合。這類問題的一個例子就是推薦系統。由於他們須要捕捉到用戶稀疏的交互,推薦系統確實從大量數據中獲益。當開發 Shiny 應用時,SparkR 能夠完美解決這類問題。後端
此外,當想使用這樣的應用程序時,考慮內存的可用性和大小也是很重要的。這能夠用兩種不一樣的方式:服務器
若是您正在運行的應用程序服務器上有足夠的內存來知足你的大數據需求,你可能根本就不須要 SparkR 了。如今有像 Amazon AWS 同樣的雲提供商提供上T的計算內存。
若是你的大數據不能裝在一臺機器上,您可能須要分配在幾個機器。SparkR 適合這一問題,由於它提供了分佈式算法,能夠壓縮不一樣節點數據並將結果返回給主節點。
在咱們開始理解每一塊這樣的應用程序將如何操做,先讓咱們下載這個簡單 Shiny-SparkR 並運行應用程序。項目地址目錄下的「shiny-sparkr-demo-1」
能夠獲取示例。
安裝Spark 1.5 及以上版本。
安裝 Java 1.7 及以上版本,並配置環境變量。
一旦你下載了應用文件夾,打開項目RStudio並打開「server.R」
文件。
改變SPARK_HOME
環境變量的路徑,使之指向安裝Spark的位置。
運行應用程序. 經過使用這個命令 shiny::runApp()
運行應用程序。在分析的結果顯示出來以前,SparkR初始化須要一些時間。
這是「server.R」
的代碼。
# 首先一次安裝shiny庫 library(shiny) # 設置系統環境變量 Sys.setenv(SPARK_HOME = "/home/emaasit/Desktop/Apache/spark-1.5.2") .libPaths(c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"), .libPaths())) # 加載Sparkr庫 library(SparkR) # 建立一個 Spark Context 和 SQL Context sc <- sparkR.init(master = "local") sqlContext <- sparkRSQL.init(sc) # 爲「iris」數據集建立一個 sparkR DataFrame iris_DF <- createDataFrame(sqlContext, iris) cache(iris_DF) # 定義須要預測 sepal length 的後端邏輯 shinyServer(function(input, output) { # 機器學習 model_fit <- glm(Sepal_Length ~ Species + Petal_Width + Petal_Length, data = iris_DF, family = "gaussian") output$summary_model <- renderPrint({summary(model_fit)}) output$predict_new_value <- renderText({ input$predictSepalLength isolate({ Species <- as.character(input$species) Petal_Width <- as.double(input$petalWidth) Petal_Length <- as.double(input$petalLength) new_data_frame <- data.frame(Species = Species, Petal_Width = Petal_Width, Petal_Length = Petal_Length) newDataFrame <- createDataFrame(sqlContext, new_data_frame) predicted_value <- predict(model_fit, newData = newDataFrame) unlist(head(select(predicted_value, "prediction"))) }) }) })
當您運行這個應用程序, 顯示的用戶界面中不會有文字渲染或者模型總結數據。
與此同時,在你的電腦後臺的節點(s)上,java使用Spark-submit啓動文件,而後SparkR庫加載SparkR初始化。
而後SparkR命令在"server.R"
的代碼中執行,最後在 Shiny的應用程序中顯示的輸出。
訪問localhost的4040端口,您可使用 Spark UI 檢查任務調度的進度。
當你在應用中修改了輸入值並點擊了"Predict Sepal Length"
按鈕,這個應用會將你輸入的值做爲 Spark Context,用來執行預測函數而且顯示預測值。相比於初始化 Shiny 應用,這個操做只須要很短的時間。
這個示例的目的是講解如何學習 SparkR 和 Shiny 的用例;想看看會發生什麼還須要你最終在電腦上部署並運行應用一下。
若是你創建了這樣的應用程序,請在評論中分享你的想法和經歷下面的部分。
本文已得到原做者:Daniel Emaasit 受權,並由 HarryZhu 翻譯。
英文原文地址:http://blog.sparkiq-labs.com/2015/11/22/using-apache-sparkr-to-power-shiny-applications-part-i/
做爲分享主義者(sharism),本人全部互聯網發佈的圖文均聽從CC版權,轉載請保留做者信息並註明做者 Harry Zhu 的 FinanceR 專欄:https://segmentfault.com/blog/harryprince,若是涉及源代碼請註明GitHub地址:https://github.com/harryprince。微信號: harryzhustudio商業使用請聯繫做者。