About connecting the dots.

data science related trivial things

RStudio + sparklyr on EMRでスケーラブル機械学習

前回に引き続き分析環境ネタ第2弾*1.今回はEMRでRStudioを立ててみます.

RStudioの構築

やり方自体は,AWS Big Data Blogにまとまっているので,別に難しくはなかったり.RStudioとか関連コンポーネントは,例のごとくS3に便利スクリプトがあるので,これをブートストラップで読み込んであげればOK.

s3://aws-bigdata-blog/artifacts/aws-blog-emr-rstudio-sparklyr/rstudio_sparklyr_emr5.sh --sparklyr --rstudio --sparkr --rexamples --plyrmr

あとはSSHトンネルを掘って,RStudioのWebページにつないであげればOK.8787ポートでつながります.

sparklyrでSparkと連携

sparklyrは,RStudioの人たちが作っている,RからSparkを扱うためのパッケージになります.ちょうどタイムリーにyamano357さんが,sparklyrの記事をあげていたりしますね*2

qiita.com

基本的にリファレンスページが非常にまとまっているので,それを読むだけで一通りの操作ができますが,とりあえず自分でも試してみましょう.sparklyrは read_from_csv() を使ってS3から直接ファイルを読み込むことができます.便利ですね.試してはいないのですが,以下のパッケージを併せて使えば,RでRedshiftからもSparkにデータを読み出せるっぽいです.

github.com

あとは,リファレンスに従って,定番処理を試してみましょう.読み込むデータは前回と一緒のabaloneです.

library(sparklyr)
library(dplyr)

# create Spark Context
sc <- spark_connect(master = "yarn-client", version = "2.0.2")

# create dataset in Spark
abalone <- spark_read_csv(sc, "abalone", path="s3://XXXXXXXX/abalone.csv")
names(abalone) = c("sex", "length", "diameter", "height", "whole_height", "shucked_height", "viscera_height", "shell_height", "rings")
head(abalone)
tbl_cache(sc, "abalone")

# execute query
abalone %>%
  dplyr::group_by(sex) %>%
  dplyr::count()

# separate dataset
partitions <- abalone %>%
  sdf_partition(training = 0.9, test = 0.1, seed = 123)

# execute regression model
fit <- partitions$training %>%
  ml_linear_regression(
    response = "rings",
    features = c("sex", "length", "diameter", "height", "whole_height", "shucked_height", "viscera_height", "shell_height")
  )
summary(fit)
original_value <- partitions$test %>%
    dplyr::select(rings)
predicted_value <- predict(fit, partitions$test)

ということで,慣れると非常に簡単に処理できますね.すばらしい.Sparklyrはチートシートもあるので,慣れるのも割とすぐな感じです.これをみる感じ,ビジュアライズはさすがにRのメモリ側にデータを持ってこないとダメみたいですね.あとは,ML Pipelineの各Transformerに対応するメソッドが揃っていたり,かなり力入れて開発されてるなぁ感がすごいですね.

所感

と,ささっと触って思ったのは,同じことやるならZeppelinで直接DataFrameいじったほうが早い気がするなぁということでした.結局sparklyrでできるのは,RのインタフェースでML Pipelineを扱えるというだけのことで,ロジック自体は実質的にML Pipelineを知らないと書けないし,結果の可視化もZeppelinで十分に対応可能です.

その上で,じゃあどういう使い方をすると良いかなぁと考えると,やっぱりRを使うメリットは高速なプロトタイピングってところに尽きるのかなぁと思ったり.つまり,大規模なデータを前処理して,Rの機械学習モデルに落とし込んでいろいろ試行錯誤する,という使い方かなぁと.なので,有賀さんが前にibisの話ししてたのと同じイメージで使うと,色々捗りそうな気がしています.

www.slideshare.net

2017/1/31追記

sparklyr0.5に合わせて,公式ページに Deploying sparklyr という形で基本的なセットアップと使い方がまとめられてます.そのサンプル読んでると,実は ml_linear_regression() とか x ~ y のR式の記述ができたということに気がつきました.便利だ...

*1:第3弾があるかは謎

*2:Athenaが東京リージョンにくるの待たなくても,オレゴンで立ち上げて,東京リージョンのS3バケットにクエリしちゃえばいいのに,とか思ったりしますが