SparkR是AMPLab發布的一個R開發包,為Apache Spark提供了輕量的前端。SparkR提供了Spark中彈性分布式數據集(RDD)的API,用戶可以在集群上通過R shell交互性的運行job。例如,我們可以在HDFS上讀取或寫入文件,也可以使用 lapply 來定義對應每一個RDD元素的運算。
sc <- sparkR.init("local") lines <- textFile(sc, "hdfs://data.txt") wordsPerLine <- lapply(lines, function(line) { length(unlist(strsplit(line, " "))) })
除了常見的RDD函數式算子reduce、reduceByKey、groupByKey和collect之外,SparkR也支持利用 lapplyWithPartition 對每個RDD的分區進行操作。 SparkR也支持常見的閉包(closure)功能:用戶定義的函數中所引用到的變量會自動被發送到集群中其他的機器上。參見一下例子中用戶閉包中引用的 initialWeights 會被自動發送到集群其他機器上。
lines <- textFile(sc, "hdfs://data.txt") initialWeights <- runif(n=D, min = -1, max = 1) createMatrix <- function(line) { as.numeric(unlist(strsplit(line, " "))) %*% t(initialWeights) } # initialWeights is automatically serialized matrixRDD <- lapply(lines, createMatrix)
用戶還可以很容易的在已經安裝了R開發包的集群上使用SparkR。includePackage 命令用於指示在每個集群上執行操作前讀取開發包。以下是個例子:
generateSparse <- function(x) { # Use sparseMatrix function from the Matrix package sparseMatrix(i=c(1, 2, 3), j=c(1, 2, 3), x=c(1, 2, 3)) } includePackage(sc, Matrix) sparseMat <- lapplyPartition(rdd, generateSparse)
下面介紹如何安裝SparkR
第一步,安裝R
參考http://www.myexception.cn/linux-unix/680876.html
由於安裝R依賴比較多,故利用iso文件創建本地yum源,見后【一】利用iso鏡像文件創建本地yum源
1.1 安裝依賴
yum install gcc yum install gcc-c++ yum install gcc-gfortran yum install pcre-devel yum install tcl-devel yum install zlib-devel yum install bzip2-devel yum install libX11-devel yum install readline-devel #否則報”–with-readline=yes (default) and headers/libs are not available”錯誤 yum install libXt-devel #否則報”configure: error: –with-x=yes (default) and X11 headers/libs are not available”錯誤 yum install tk-devel yum install tetex-latex
1.2 下載源碼,編譯安裝R
下載http://mirror.bjtu.edu.cn/cran/src/base/R-3/R-3.1.1.tar.gz
cd /softwares/R tar -zxvf R-3.1.1.tar.gz ./configure --enable-R-shlib (如果使用rJava需要加上 --enable-R-shlib) make && make install
第二步,安裝rjava
參考 http://www.geedoo.info/page/3
在聯網的情況下,可以進入R命令,安裝rJava包:
install.packages(“rJava”)
如果待安裝機器不能上網,可以將源文件下載到本地,然后通過shell命令R CMD INSTALL ‘package_name’來安裝:
R CMD INSTALL “rJava_0.9-5.tar.gz”
下載 rJava_0.9-6.tar.gz http://cran.r-project.org/web/packages/rJava/
cd /app/softwares/R R CMD INSTALL "rJava_0.9-6.tar.gz"
第三步,安裝sbt
下載 http://www.scala-sbt.org/download.html
參考http://www.scala-sbt.org/0.13/tutorial/Manual-Installation.html 進行安裝
cd /softwares/sbt unzip sbt-0.13.5.zip cp sbt/sbt/bin/sbt-launch.jar ~/bin vi2 ~/bin/sbt SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M" java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@" chmod u+x ~/bin/sbt [root@cnsz131016 ~]# mkdir -p /root/.ivy2/local/org.scala-sbt/sbt/0.13.5/jars/ [root@cnsz131016 ~]# cp /tmp/sbt.jar /root/.ivy2/local/org.scala-sbt/sbt/0.13.5/jars/ [root@cnsz131016 ~]# sbt Getting org.scala-sbt sbt 0.13.5 ... :: retrieving :: org.scala-sbt#boot-app confs: [default] 1 artifacts copied, 0 already retrieved (20kB/69ms) Error during sbt execution: No Scala version specified or detected
由於無法連接外網,所以沒有安裝成功。
第四步,安裝 SparkR
下載 SparkR (http://amplab-extras.github.io/SparkR-pkg/)
mkdir SparkRInstall cp amplab-extras-SparkR-pkg-e1f95b6.tar.gz SparkRInstall cd SparkRInstall tar -zxvf amplab-extras-SparkR-pkg-e1f95b6.tar.gz cd amplab-extras-SparkR-pkg-e1f95b6 sh install-dev.sh [root@cnsz031907 amplab-extras-SparkR-pkg-e1f95b6]# ./install-dev.sh * installing *source* package ‘SparkR’ ... ** libs ** arch - ./sbt/sbt assembly Attempting to fetch sbt curl: (6) Couldn't resolve host 'typesafe.artifactoryonline.com' curl: (6) Couldn't resolve host 'repo.typesafe.com' Launching sbt from sbt/sbt-launch-0.12.4.jar Error: Invalid or corrupt jarfile sbt/sbt-launch-0.12.4.jar make: *** [target/scala-2.10/sparkr-assembly-0.1.jar] Error 1 ERROR: compilation failed for package ‘SparkR’ * removing ‘/app/SparkRInstall/amplab-extras-SparkR-pkg-e1f95b6/lib/SparkR’
由於連不上網,不能直接編譯sparkR,故在能聯網的機器上對SparkR進行編譯,之后再上傳使用sbt編譯后的包。上傳編譯后的包之后,使用以下命令進行安裝:
sh install-dev.sh
修改R權限,使所有人都可讀
chmod 755 -R /usr/local/lib64/R /usr/lib64/R /usr/local/bin/R
執行示例:
[hadoop@cnsz031907 SparkR-pkg]$ ./sparkR examples/pi.R local WARNING: ignoring environment value of R_HOME Loading required package: methods Loading required package: rJava [SparkR] Initializing with classpath /app/SparkRInstall/SparkR-pkg/lib/SparkR/sparkr-assembly-0.1.jar 14/09/10 17:08:44 INFO Slf4jLogger: Slf4jLogger started 100000 100000 Pi is roughly 3.13832 Num elements in RDD 200000
修改PATH和CLASSPATH,方便之后使用:
chmod 755 -R /app/SparkRInstall/ chown -R hadoop:hadoop /app/SparkRInstall/ ln -s /app/SparkRInstall/SparkR-pkg /app/sparkR vi2 /etc/profile export SPARKR_HOME=/app/sparkR export PATH=$PATH:$SPARKR_HOME/ source /etc/profile
修改sparkR.profile的權限,因為該文件需要所有用戶都可讀寫。
chmod 777 /tmp/sparkR.profile
【一】利用iso鏡像文件創建本地yum源
1. 創建iso存放目錄和掛載目錄
mkdir /app/iso mkdir /app/cdrom
2. 將iso鏡像文件上傳到/app/iso文件夾下
3. 將/app/iso/下的iso文件掛載到/mnt/cdrom目錄
mount -o loop /app/iso/rhel-server-6.5-x86_64-dvd.iso /app/cdrom
注:掛載完之后對其操作會提示設備繁忙,此時需要umount解開掛載才行
查看是否掛載成功: df -h <用來查看系統中所有掛載的,mount也可以
4.<最關鍵的一步>如果/etc/yum.repos/下面有其它的*.repo文件,先創建個文件夾,將這些*.repo先轉移到文件夾中,自己寫一個.repo的文件
mkdir /etc/yum.repos.d/bak mv *.repo /etc/yum.repos.d/bak
然后創建自己的.repo文件 vi myself.repo 內容如下:
[base] name=RedHat #注:這里的baseurl就是你掛載的目錄,在這里是/mnt/cdrom baseurl=file:///app/cdrom #注:這里的值enabled一定要為1 enabled=1 gpgckeck的值無所謂 gpgckeck=0 #注:這個你cd /mnt/cdrom/可以看到這個key,這里僅僅是個例子 gpgkey=file:///app/cdrom/RPM-GPG-KEY-redhat-release
5. 測試:
yum clean all yum install gcc-gfortran