有人玩過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 · GitHubSparkR其實就是給不會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分區的行數 那麼在spark集群上跑Distributing R Computations的前提是啥呢:
## # Source: table&
## # Database: spark_connection
## n
## &
## 1 16
## 2 15
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應該也一樣的當然,內置的包都有
推薦閱讀: