[譯]打造大數據產品:Shiny的Spark之旅

微信號: harryzhustudio

商業使用請聯繫作者。

概述

我對如何開發和部署"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」文件。

  1. 改變SPARK_HOME環境變數的路徑,使之指向安裝Spark的位置。

  1. 運行應用程序. 通過使用這個命令 shiny::runApp()運行應用程序。在分析的結果顯示出來之前,SparkR初始化需要一些時間。

  1. 這是「server.R」的代碼。

# 首先一次安裝shiny庫nlibrary(shiny)nn# 設置系統環境變數nSys.setenv(SPARK_HOME = "/home/emaasit/Desktop/Apache/spark-1.5.2")n.libPaths(c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"), .libPaths()))nn# 載入Sparkr庫nlibrary(SparkR)nn# 創建一個 Spark Context 和 SQL Contextnsc <- sparkR.init(master = "local")nsqlContext <- sparkRSQL.init(sc)nn# 為「iris」數據集創建一個 sparkR DataFrameniris_DF <- createDataFrame(sqlContext, iris)ncache(iris_DF)nn# 定義需要預測 sepal length 的後端邏輯nshinyServer(function(input, output) {nn # 機器學習n n model_fit <- glm(Sepal_Length ~ Species + Petal_Width + Petal_Length, data = iris_DF, family = "gaussian")n n output$summary_model <- renderPrint({summary(model_fit)})n n output$predict_new_value <- renderText({n n input$predictSepalLengthn n isolate({n Species <- as.character(input$species) n Petal_Width <- as.double(input$petalWidth)n Petal_Length <- as.double(input$petalLength)n n n n new_data_frame <- data.frame(Species = Species, n Petal_Width = Petal_Width,n Petal_Length = Petal_Length)n n newDataFrame <- createDataFrame(sqlContext, new_data_frame)n n predicted_value <- predict(model_fit, newData = newDataFrame)n n unlist(head(select(predicted_value, "prediction")))n })n })n n n})n

結果

第一步:

當您運行這個應用程序, 顯示的用戶界面中不會有文字渲染或者模型總結數據。

第二步:

與此同時,在你的電腦後台的節點(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 翻譯。

英文原文地址:blog.sparkiq-labs.com/2

作為分享主義者(sharism),本人所有互聯網發布的圖文均遵從CC版權,轉載請保留作者信息並註明作者 Harry Zhu 的 FinanceR 專欄:FinanceR - SegmentFault,如果涉及源代碼請註明GitHub地址:harryprince (HarryZhu) · GitHub。微信號: harryzhustudio

商業使用請聯繫作者。

推薦閱讀:

矽谷之路54:深入淺出Spark(七)如何排序100TB
大數據那些事(9):起早貪黑竹籃打水的18摸(IBM)
深度剖析Spark分散式執行原理
一般而言常見的Spark的性能瓶頸有哪些?

TAG:shiny | Spark | R编程语言 |