有人玩過sparkR嗎?sparkR能直接調用cran上的包嗎?


研究了好幾天源碼,終於弄懂了。來嘚瑟的回答一下。

如果不能用R包,那SparkR有什麼卵用

首先明確幾個確定的問題:

1.R中的幾乎所有包都是可以在SparkR中使用的,因為所有的函數能被spark平台進行M/R操作作用到RDD的前提是這個函數是closure(閉包)的;

2.SparkR本身會有R Function Name Conflicts(函數名稱衝突)的問題,所以很多函數是需要在調用命令前加上包名前綴,特別是base包的一些常用函數;

3.自己編寫的函數如果是閉包的話,可以直接被map或mapply;如果要調用其他包的話,為了讓map除去的函數命令都是閉包的,需要在開始進行類似於broadcast(廣播)的操作。includePackage(sc, packages name),同時,集群的每台機器安裝相應的r包;

稍後把工作忙完,就補上自己的栗子。

spark 1.6.2

R 2.2.5

---------------------------更新2017/4/14---------------------------------

以下是一個簡單的例子,計算經緯度距離SparkR:::includePackage(sqlContext, SoDA)
pairs &<- list(1,2,3,4,5,6) rdd &<-SparkR:::parallelize(sc, pairs) rows &<- SparkR:::flatMap(rdd, function(x){ library(SoDA) x &<- geoDist(x,x+1,x+2,x+3) })

或者github:

下面是一個我做的Repositorie,和sparkR的官方Repositorie

https://github.com/HOHOOO/Persona

https://github.com/HOHOOO/SparkR-pkg

機器學習是一個很大的概念,比如來說,你要做個隨機森林,只要你的所有計算結點都安裝好相應的包,調用的函數實現閉包且函數名無衝突,RDD內做計算是可以實現的。

但是會稍微麻煩點。推薦使用sparkling water或者深度學習平台Deep water。


加個備註 看了hoho的說明,我發現下面的說明有點歪樓 也怪我沒說清楚。我指的是直接調r的自帶的機器學習是不能進行分散式的

------------------------------------------------------------根據我最近對sparkR的研究,很遺憾,直接調用R自帶的機器學習是不行的。

SparkR總體上來說還是spark,所以要在上面跑演算法的話,就是spark上面對RDD的操作。而R自帶的演算法對這些都是不支持。

我考慮過將RDD類型的數據放入到R的演算法包裡面跑,這點我再去驗證一下。要使用sparkR的話,沒有的機器學習的演算法的話需要你自己去實現。

---------------------------------------------------------------------------------------------------------------------

看了一下源碼,我用的是1.5版本的sparkR,裡面的機器學習只有glm,glm是調用的spark裡面的機器學習的包。如果直接調用cran上面的包的話,是不會進行分散式的。

有興趣的話可以自己看源碼: (這兩個是相關的)

spark/LinearRegression.scala at branch-1.5 · apache/spark · GitHub

spark/mllib.R at branch-1.5 · apache/spark · GitHub


SparkR其實就是給不會scala, python的R用戶一個前端界面。方便R用戶和spark集群交互,提升R用戶的生產力。畢竟有大量的數據分析人員熟悉R,對scala, python精通的不太多。SparkR提供了一系列函數可以直接操作Spark DataFrame, 語法也保持了R用戶比較熟悉的風格.

一個比較容易理解的工作流程是,R用戶通過SparkR提供函數在spark集群上做各種數據處理或者ml, 最後把結果collect過來變成一個R data frame, 之後所有cran上的包就都能用上了。

最後我安利一下RStudio出品的sparklyr包全面整合了dplyr語法和spark mllib, 感覺比SparkR更好用。還可以通過RStudio直接管理連接上的spark cluster. sparklyr — R interface for Apache Spark

# 11/08/2017 EST 更新一把 (終於沒有hold住,做了手機綁定,LOL) ----------------------

sparklyr 0.6版本引進了Distributing R Computations(分散式R計算)的功能,可以將自定義的R code通過spark_apply()函數傳遞到spark集群上的spark dataframe object上進行運算。

以下官方的定義:

sparklyr provides support to run arbitrary R code at scale within your Spark Cluster through spark_apply().

下面看一個官方example:

# 定義一個spark dataframe object, 並分成兩個分區(partition)
trees_tbl &<- sdf_copy_to(sc, trees, repartition = 2) # apply R 函數nrow() 到每個分區 trees_tbl %&>% spark_apply(function(e) nrow(e), names = "n")

# 返回每一個spark dataframe分區的行數
## # Source: table& [?? x 1]
## # Database: spark_connection
## n
## &
## 1 16
## 2 15

那麼在spark集群上跑Distributing R Computations的前提是啥呢:

1. spark cluster上的每個節點(nodes), 都要有R runtime和相對應的R packages

2. spark集群應該是同質的(Homogeneous Cluster),即集群每個節點都應該是同樣的系統架構。

最後官方說明看這裡: Distributing R Computations


你只能用sparkR package的API,因為spark的DataFrame和R本地的data.frame還是不一樣,是spark的lazy模式object。除非collect到本地,那你可以盡情用R local package


sparkr源碼注釋里寫的要在集群的每台機器安裝要用的r包

python應該也一樣的

當然,內置的包都有


推薦閱讀:

TAG:R編程語言 | Spark |