[譯]R語言突破大數據瓶頸:Shiny的Spark之旅
概述
我對如何開發和部署"Shiny-SparkR"的應用一直很感興趣,本文目的將展示如何使用 SparkR 來驅動 Shiny 應用。
什么是SparkR
SparkR是一個為R提供了輕量級的Spark前端的R包。 SparkR提供了一個分布式的data frame數據結構,解決了 R中的data frame只能在單機中使用的瓶頸,它和R中的data frame 一樣支持許多操作,比如 select
, filter
, aggregate
等等。(類似 dplyr
包中的功能)這很好的解決了R的大數據級瓶頸問題。 SparkR也支持分布式的機器學習算法,比如使用 MLib
機器學習庫。
什么是Shiny
Shiny 是一個開源的 R 包,它為使用 R 構建 Web 應用提供了一個優雅有力的 Web 框架。Shiny 幫助你在不需要前端知識的條件下將數據分析轉變為可交互的 Web 應用。
用例
你可能會問自己,“為什么我需要使用SparkR運行我的程序?”。這是一個合乎情理的問題和回答,我們需要理解不同類型的大數據問題。
大數據問題的分類
最近, 在 Reddit 的 AMA頻道 上 , Hadley Wickham (RStudio首席科學家)描繪了一幅清晰的“大數據”定義。他的見解將幫助我們為SparkR和Shiny定義用例。
我認為大數據問題應分類三個主要類:
-
大數據小分析:數據科學家針對某一個特定的業務或研究問題從一個大的原始數據集開始做數據切片和數據抽樣。在大多數項目中,抽樣結果都是小數據集,而這些項目中并不需要用到 SparkR 來驅動 Shiny應用。
-
分片聚合分析:數據科學家需要在多臺機器上分布式地并行計算。Wickham 認為這是一個瑣碎的并行化問題。一個例子就是當大規模計算時,你需要在成千上萬的機器上為每一個機器都擬合一個模型。在這種情況下 SparkR 是一個不錯的選擇,但也可以用 R 的
foreach
等包來解決這個問題。 -
大規模的數據分析:數據科學家需要大數據,可能是因為他們在處理一個復雜的模型擬合。這類問題的一個例子就是推薦系統。因為他們需要捕捉到用戶稀疏的交互,推薦系統確實從大量數據中獲益。當開發 Shiny 應用時,SparkR 可以完美解決這類問題。
內存方面的考慮
此外,當想使用這樣的應用程序時,考慮內存的可用性和大小也是很重要的。這可以用兩種不同的方式:
-
如果您正在運行的應用程序服務器上有足夠的內存來滿足你的大數據需求,你可能根本就不需要 SparkR 了。現在有像 Amazon AWS 一樣的云提供商提供上T的計算內存。
-
如果你的大數據不能裝在一臺機器上,您可能需要分配在幾個機器。SparkR 適合這一問題,因為它提供了分布式算法,可以壓縮不同節點數據并將結果返回給主節點。
一個簡單的例子
在我們開始理解每一塊這樣的應用程序將如何操作,先讓我們下載這個簡單 Shiny-SparkR 并運行應用程序。 項目地址 目錄下的 “shiny-sparkr-demo-1”
可以獲取示例。
準備
-
安裝Spark 1.5 及以上版本。
-
安裝 Java 1.7 及以上版本,并配置環境變量。
啟動應用程序
一旦你下載了應用文件夾,打開項目RStudio并打開 “server.R”
文件。
SPARK_HOME
shiny::runApp()
“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的應用程序中顯示的輸出。
![[譯]R語言突破大數據瓶頸:Shiny的Spark之旅](https://simg.open-open.com/show/0b632aa816bd504ae1913bee715e555e.png)
訪問localhost的4040端口,您可以使用 Spark UI 檢查任務調度的進度。
![[譯]R語言突破大數據瓶頸:Shiny的Spark之旅](https://simg.open-open.com/show/fbd3d49df77e7cf0033d650c26cd1aab.png)
第四步:
當你在應用中修改了輸入值并點擊了 "Predict Sepal Length"
按鈕,這個應用會將你輸入的值作為 Spark Context,用來執行預測函數并且顯示預測值。相比于初始化 Shiny 應用,這個操作只需要很短的時間。
![[譯]R語言突破大數據瓶頸:Shiny的Spark之旅](https://simg.open-open.com/show/450d9bf313631699bd47eff7e8a792cd.png)
展望
這個示例的目的是講解如何學習 SparkR 和 Shiny 的用例;想看看會發生什么還需要你最終在電腦上部署并運行應用一下。
如果你建立了這樣的應用程序,請在評論中分享你的想法和經歷下面的部分。
原文地址: http://blog.sparkiq-labs.com/2015/11/22/using-apache-sparkr-to-power-shiny-applications-part-i/
來自: http://www.thebigdata.cn/QiTa/29156.html