sparkrをつかってみた(japan.r)
TRANSCRIPT
SparkRを使ってみたただそれだけ
自己紹介
@__john_smith__ (じょんすみす)
どこにでもいる普通のアル中なぜかTwitterでビアドベントカレンダーを一人でやってる
※ビアドベントカレンダーとはアドベントカレンダーの要領で毎日ビールを紹介紹介するビールは必ずその日飲むこと
SparkRってなんぞ?
SparkをRから操作するためのもの
Sparkってなんぞ?って話はしません
Rってなんぞ?って話は必要ありません
ただし書き
今回は本当にただ使ってみただけです
まじでサンプル実行した程度です
localで動かしているので分散しません
分散しないのでRのライブラリと速度比較で来ません
分散しないのでin-memoryでも使えるデータサイズはRと多分変わりません
やってみたこと
Word Count
Hadoopのせいで最初にやってみることの代表格になった
分散処理界のHallo, World的な存在
SparkのREADME.md
Spark界隈ではなぜかチュートリアルで扱うファイルはこいつ
まずは
普通にSparkで
$ ./bin/spark-shell
scala> val textFile = sc.textFile(“README.md”)
scala> val fm = textFile.flatMap(_.split(“ “))
scala> val m = fm.map((_, 1))
scala> val rk = m.reduceByKey(_ + _)
scala> rk.collect()
まずは
普通にSparkで
$ ./bin/spark-shell
scala> val textFile = sc.textFile(“README.md”)
scala> val fm = textFile.flatMap(_.split(“ “))
scala> val m = fm.map((_, 1))
scala> val rk = m.reduceByKey(_ + _)
scala> rk.collect()
ね?簡単でしょ?
Rでやる
SparkRのインストール
# この辺入ってなければ入れる
install.packages("rJava")
install.packages("devtools")
library(devtools)
# githubから持ってくる
install_github("amplab-extras/SparkR-pkg", subdir="pkg”)
Rでやる
読み込み
library(SparkR)
sc <- sparkR.init(“local”)
lines <- textFile(sc, “README.md”)
Rでやる
単語で区切る
library(SparkR)
sc <- sparkR.init(“local”)
lines <- textFile(sc, “README.md”)
words <- flatMap(function(line) { strsplit(line, “ “)[[1]] })
Rでやる
各単語の出現回数に1を入れる
library(SparkR)
sc <- sparkR.init(“local”)
lines <- textFile(sc, “README.md”)
words <- flatMap(function(line) { strsplit(line, “ “)[[1]] })
wordCount <- lapply(words, function(word) { list(word, 1) }
Rでやる
合計して出現回数を求める
library(SparkR)
sc <- sparkR.init(“local”)
lines <- textFile(sc, “README.md”)
words <- flatMap(function(line) { strsplit(line, “ “)[[1]] })
wordCount <- lapply(words, function(word) { list(word, 1) }
count <- reduceByKey(wordCount, “+”, 2L)
Rでやる
出力
library(SparkR)
sc <- sparkR.init(“local”)
lines <- textFile(sc, “README.md”)
words <- flatMap(function(line) { strsplit(line, “ “)[[1]] })
wordCount <- lapply(words, function(word) { list(word, 1) }
count <- reduceByKey(wordCount, “+”, 2L)
output <- collect(count)
for (item in output) {
cat(item[[1]], “ \t“ item[[2]], “\n”)
}
Rでやる
出力
library(SparkR)
sc <- sparkR.init(“local”)
lines <- textFile(sc, “README.md”)
words <- flatMap(function(line) { strsplit(line, “ “)[[1]] })
wordCount <- lapply(words, function(word) { list(word, 1) }
count <- reduceByKey(wordCount, “+”, 2L)
output <- collect(count)
for (item in output) {
cat(item[[1]], “ \t“ item[[2]], “\n”)
}
ね?簡単でしょ?
対応関係
Spark R
sc.textFile textFile
flatMap flatMap
map lapply
reduceByKey reduceByKey
ほぼほぼ同じ関数がそのまま使える
具体的な処理はRで書ける
words <- flatMap(function(line) { strsplit(line, “ “)[[1]] })
でも...
そのままRの変数としては使えないっぽいです
RDDオブジェクト
irisをRDDにしてRのlm関数とか使えなかった ...
結論
今後に期待