More Related Content Similar to Tokyo.R#16 wdkz
Similar to Tokyo.R#16 wdkz (20) More from Kazuya Wada (11) Tokyo.R#16 wdkz1. Rで大規模解析 aa
Tokyo.R #16
和田 計也
サイバー系
CyberAgent, Inc.
2. サイバー系
アジェンダ
1. 自己紹介
2. SAS 9.3が出た
3. Rをビルドしてみる(高速化できたらいいな)
4. 大規模データを取得してみる
5. 大規模データを扱ってみる
6. 処理の高速化をしてみる
7. 本日のハイライト
2011/08/27 1
3. サイバー系
いまここ
1. 自己紹介
2. SAS 9.3が出た
3. Rをビルドしてみる(高速化できたらいいな)
4. 大規模データを取得してみる
5. 大規模データを扱ってみる
6. 処理の高速化をしてみる
7. 本日のハイライト
2011/08/27 2
4. サイバー系
1.自己紹介
• 和田 計也(@wdkz)
• 静岡県袋井市出身
• サイバー系企業でデータマイニングエンジニア職
• 創立記念日が3月18日
• 社長の出身地が福井県鯖江市
• 前職はバイオベンチャー
• バイオマーカ探索してた
• 学生時代は枯草菌の研究
2011/08/27 3
5. サイバー系
いまここ
1. 自己紹介
2. SAS 9.3が出た
3. Rをビルドしてみる(高速化できたらいいな)
4. 大規模データを取得してみる
5. 大規模データを扱ってみる
6. 処理の高速化をしてみる
7. 本日のハイライト
2011/08/27 4
6. サイバー系
2 SAS 9.3(通称SAS美)が出た.SAS美
という記事が出たが、実際のところ変更点はそこじゃなさげ
↓主な変更点はこんな感じ
• HTML形式が標準の出力になった!
• 新しいプロシージャー(Rでいうpackageみたいなの)がいくつかできた!
• IMLプロシージャー使ってR呼び出せる!
• GROOVYも使える!
• その他!
2011/08/27 5
7. サイバー系
いまここ
1. 自己紹介
2. SAS 9.3が出た
3. Rをビルドしてみる(高速化できたらいいな)
4. 大規模データを取得してみる
5. 大規模データを扱ってみる
6. 処理の高速化をしてみる
7. 本日のハイライト
2011/08/27 6
8. サイバー系
3.1 Rのビルド
• Windows 64bit OSでやってみる
• 案外Windows でのビルド方法って
ドキュメントないのね…
2011/08/27 7
9. サイバー系
3.2 (参考)LinuxでRをコンパイル スコードからコンパイルする・Linux
Linux(CentOS 5)用のRをソースコードからコンパイルする方法。
X11とCairo関係をあらかじめインストールしておく。(しておかないとX関連が
インストールできなくてエラー吐くよ。)
yum groupinstall "X Window System"
yum groupinstall "X Software Development"
yum install cairo-devel
wget http://cran.md.tsukuba.ac.jp/src/base/R-2/R-2.13.1.tar.gz
tar –xvf R-2.13.1.tar.gz
cd R-2.13.1
./configure
make
sudo make install
X関連でエラーがとまらないときは仕方ないので
./configure --with-x=no
make
sudo make install
2011/08/27 8
10. サイバー系
3.3 Rのソースコードをダウンロードースコードからコンパイルする・Win
• 例えば http://cran.md.tsukuba.ac.jp/
• 適当なフォルダ(C:¥tools¥R¥R-2.13.1.tar.gzとか)に置いて展開しておく
2011/08/27 9
11. サイバー系
3.4 ビルドツールをダウンロードコンパイルする・Win
RtoolsをDL
http://www.murdoch-sutherland.com/Rtools/
http://cran.md.tsukuba.ac.jp/
これ
2011/08/27 10
12. サイバー系
3.5 ビルドツール(Rtools)をインストール
64bit版のTcl/Tkを選択
★これ大事★ Rのソースを解凍した
フォルダを指定。例えばC:¥tools¥R
にR-2.13.1.tar.gzを置いて解凍した
場合はC:¥tools¥R¥R-2.13.1となる。
ここ間違うとビルド失敗します。
2011/08/27 11
13. サイバー系
3.6 ビルド準備
• (たぶんRtoolsのインストール時に設定されてるはずだけど)
Rtools¥binとRtools¥minGW64¥binをパスに追加する。
例えばC:¥tools¥Rtools¥bin;C:¥tools¥Rtools¥MinGW64¥bin
• 必要ライブラリの準備
• 以下のlibpng, jpeg and libtiff sourcesをダウンロード
http://www.libpng.org/
http://www.ijg.org/
ftp://ftp.remotesensing.org/pub/libtiff/
• 解凍してR-2.13.1¥src¥gnuwin32¥bitmapに置く
tar -zxf libpng-1.4.5.tar.gz
mv libpng-1.4.5 libpng
tar -zxf jpegsrc.v8c.tar.gz
tar -zxf tiff-3.9.4.tar.gz
mv tiff-3.9.4/libtiff .
rm -rf tiff-3.9.4
2011/08/27 12
14. サイバー系
3.7 ビルド準備・続き
• ビルド設定ファイルの編集
• R-2.13.1¥src¥gnuwin32¥MkRules.distを同一フォルダにコピペして
MkRules.localと名付ける。
• 以下、このMkRules.localを編集
#JPEGDIR = jpeg-8c
#PNGDIR = libpng
#TIFFDIR = libtiff
↑3つのコメントアウトを外す
WIN = 64
↑32を64に変更
TMPDIR=C:¥DMZ
↑環境変数TMPDIRを作成して適当な場所(存在してればどこでも可)を設定
• ビルド時に、MkRules.local + MkRules.rulesがマージされてMkRulesという
ファイルが自動的に生成され、それを基にビルドしていく。
2011/08/27 13
15. サイバー系
3.8 完成させる
• 最後・コマンドプロンプトで
cd C:¥tools¥R¥R-2.13.1¥src¥gnuwin32
make all recommended
Windowsの場合はここまで行ってね
• バイナリ
C:¥tools¥R¥R-2.13.1¥binフォルダ内によく見慣れた一式ができる。
2011/08/27 14
16. サイバー系
3.9 バイトコンパイルする(とRが速くなるという噂)
• MkRules.localを編集(以下の2行を追加)
• R_COMPILE_PKGS=1
• R_COMPILER_SUPPRESS_ALL=1
• コマンドプロンプトで
• make bytecode
• ちなみに、普通のRでも関数単位でバイトコンパイルできます。
library(compiler)
f <- cmpfun(<関数名>)
2011/08/27 15
17. サイバー系
3.10 やったね!
2011年10月登場予定のR次期バージョンは、コンパイル済でやってきます!
2011/08/27 16
18. サイバー系
3.11 BLASライブラリとしてGotoBLASを使う(とRが速くなるという噂)える
http://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/ GotoBLASはメンテ・開発が終了してるので
ここから、生きてるGotoBLASをダウンロード
自分のマシンのCPUに
合ったものをダウンロード
binフォルダ内(64bitならx64内)の
Rblas.dllファイルを置き換える
2011/08/27 17
19. サイバー系
3.12 やる夫の憂鬱
____
/ \
/ ⌒ ⌒\
/ (●) (●) \ ホントはMKLを使うようにビルドしたかったお
| (__人__) | 誰かやりかたわかったら教えてお
/ ∩ノ ⊃ /
( \ / _ノ | |
.\ “ /__| |
\ /___ /
2011/08/27 18
20. サイバー系
3.13 RevolutionR Community Edition
• 無料で利用可能です。
• http://www.revolutionanalytics.com/products/revolution-r.php
• 普通のRと同じように使えます。(アイコンが違うぐらい)
• BLASライブラリ,LAPACKライブラリがMKLのです!!
2011/08/27 19
21. サイバー系
いまここ
1. 自己紹介
2. SAS 9.3が出た
3. Rをビルドしてみる(高速化できたらいいな)
4. 大規模データを取得してみる
5. 大規模データを扱ってみる
6. 処理の高速化をしてみる
7. 本日のハイライト
2011/08/27 20
22. サイバー系
4.1 Hadoopクラスタの概念図
• データストアとしてHadoopを利用していることが多
いかと思います。
• RHIPE使うとか
• 第14回R勉強会@東京(Tokyo.R#14)で『R
が黄色い象に出会った
• http://ml.stat.purdue.edu/rhipe/
2011/08/27 21
23. サイバー系
4.2 Hiveいいね!
• Map-Reduce書いてもいいけど、書きたくない
• HiveQLならSQL likeな記述でデータ扱える
(勝手にMap-Reduceに変換してくれる)
• https://cwiki.apache.org/confluence/display/Hive/Home
• サイバーエージェントさんのようにClouderaのパッケージを導入しているな
らHiveも使えるね
• http://www.slideshare.net/toutouzone/hadoop-conferencejapan2011
2011/08/27 22
24. サイバー系
4.3 RでhiveQLが使えるといいなぁ
• 理想はRODBC
library(RODBC)
conn <- odbcConnect(“testdb”, “tokyor”, “yokkuns”) #繋いで
x <- sqlQuery(conn, “select * from ameba_tbl”) #取得して
odbcClose(conn) #切断する
R
rJava Java
JDBC
(自前クラス) Hive
こんな感じのRHive欲しい Hadoop
2011/08/27 23
25. サイバー系
4.4 rJavaの使い方1(基本編)
#あらかじめJavaはインストールしておく
install.packages(rjava) #rJavaのインストール
library(rJava)
.jinit() #JVMの起動 クラス名 コンストラクタの引数
#インスタンス化 .jnew(“java/lang/String”, “Hello World!”)
# String s = new String(“Hello World!”);
s <- .jnew(“java/lang/String”, “Hello World!”)
インスタンス名 メソッド名(括弧なし)
#メソッド
#s.length()
.jcall(s, “I”, “length”) .jcall(s, ”I”, “length”)
[1] 12
戻り値の型
#文字列は注意 I ; integer D ; double (numeric) J ; long F ; float
print(s) V ; void Z ; boolean C ; char (integer) B ; byte (raw)
[1] "Java-Object: Hello World“
#こうやって取り出す
.jstrVal(s)
[1] "Hello World"
2011/08/27 24
26. サイバー系
4.4 rJavaの使い方2(ちょっとマニアック編)
#クラスパス指定&起動オプション付きでJVMの起動
.jinit(classpath=c(“C:¥¥tokyor¥¥Tokyor.jar”), parameters=c(”-Xms4g”, “-Xmx4g”))
#クラス変数, クラスメソッド
#Math.pi
with(J("java.lang.Math"), pi)
#System.gc()
with(J("java.lang.System"), gc())
#インスタンス化 実際はパッケージ名から書いてね
# TokyoR tokyoR = new TokyoR(); *ちなみに配列の場合は
tokyo.r <- .jnew(“Tokyo.R”) [+型
数値はすべてdouble型で渡されるので [I intの配列
Int型を明示して渡す [S Stringの配列
#メソッド
#tokyoR.setNumber(16) [[I intの2次元配列
.jcall(tokyor “V”, “setNumber”, as.integer(16))
Javaの配列をRで使うには
.jevalArray(x)で変換が必要
#tokyoR.getNumber()
.jcall(tokyor, “I”, “getNumber”)
L + クラス名 + ; Rの配列をJavaに渡すには
[1] 16
とする .jarray(1:10)
#戻り値がクラスの場合
.jcall(tokyor “Ljava/util/ArrayList;”, “getPersonList”) これは何故かint型になる
2011/08/27 25
27. サイバー系
4.5 自作クラスを適当に作成
HiveConnector
• こんな感じのJavaクラスを作って→
- conn : Connection
• Rで関数定義 + init : void
+ connect2Hive ( server: String): void
hiveConnect <- function(server, port=10000){ + hiveQuery(sql: String) : ArrayList<int[]>
library(rJava) + closeConn: void
+ getHeader : int[]
.jinit()
connStr <- .jnew(“java/lang/String”, (paste(“jdbc:hive://”, server, “:”, port, “/default”, sep=“”)))
hiveConn <- .jnew("jp/ameba/rhive/HiveConnector")
.jcall(hiveConn, , "connect2Hive", connStr)
return(hiveConn)
}
hiveqlQuery <- function(hiveConn, query){
header <- .jcall(hiveConn, “[S”, “getHeader”)
res.list <- as.list(.jcall(hiveConn, “Ljava/util/ArrayList;","hiveQuery",.jnew("java/lang/String", query)))
res.matrix<- matrix(unlist(lapply(res.list, function(x){strsplit(.jevalArray(x),",")}))
, ncol=length(header), byrow=TRUE)
return(res.matrix) 注!!実際にはこのまま
} 使うとメモリが足りなくて
爆死します。
hiveClose <- function(hiveConn){ .jcall(hiveConn, "V", "closeHive") }
2011/08/27 26
28. サイバー系
4.6 HiveのJDBCは0.7.1じゃなくて開発版の0.8.0を使う
v 0.7.1(現行版) v 0.8.0-SNAPSHOT(開発版)
<<interface>> <<interface>>
ResultSet ResultSet
HiveBaseResultSet HiveBaseResultSet
{abstract} {abstract}
+setFetchSize(rows : int) : void +setFetchSize(rows : int) : void
HiveQueryResultSet HiveQueryResultSet
-fetchSize : int
+setFetchSize(rows : int) : void
• 現行版のhive-jdbc-0.7.1.jarはfetchの指定ができないし、そもそもしてない
ので我慢ならんくらい遅い。特にHiveは大きなデータを取得することが多い
ためfetchが使える0.8.0を使う(か、0.7.1を修正して使う。)
2011/08/27 27
29. サイバー系
4.7 Rhiveを使ってみる
• hive-jdbc.jarを使うのに必要なjarファイル群*にクラスパスを設定して
• Thrift Serverをサーバ側で起動しておいて
• ローカルマシンのRから使う
source(“Rhive.R”)
hiveConn <- hiveConnect(“サーバ名かIP アドレス”)
ameba_user <- hiveQuery(hiveConn, “select * from ameba_user”)
hiveClose(hiveConn)
必要なのjar
*common-lang3-*.jar, commons-logging-1.*.jar, hadoop-core-0.20*.jar, hive-cli-0.7*.jar, hive-common-0.7*.jar,
hive-contrib-0.7*.jar, hive-exec-0.7*.jar, hive-hwi-0.7*.jar, hive-jdbc-0.8*.jar, hive-metastore-0.7*.jar, hive-service-0.7*.jar,
log4j-1.2*.jar, slf4j-api-1.6*.jar, slf4j-log4j12-1.6*.jar, thrift-0.5*.jar, thrift-fb303-0.5*.jar, RHive.jar
2011/08/27 28
30. サイバー系
4.8 rJavaは困った子(ちょっと注意)
• メモリを解放してくれない
• rm(list=ls()); gc()しても
• Javaで明示的にnull入れるメソッド書いて、それをRから呼び出してJavaのSystem.gc()呼び出しても
メモリ使用量が減らんのですよ
• メモリ解放ソフトウェアを使うしかないかなぁ
→せっかくならmicrosoft社製のがいいかな
1. Windows Server 2003 Resource Kit Toolsをダウンロード
http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en
2. exeファイル(インストーラ)を解凍する
1. 7Zipとか使う http://sevenzip.sourceforge.jp/
2. 「rktools.exeを解凍」→「rktools.msiを解凍」→empty.exeをコピー
3. C:¥WINDOWS¥system32 にコピー&ペースト (64bit OSでもここ)
システム命令をRから呼び出しているだけ
3. Rではこう使う
system(“empty Rgui.exe”)
2011/08/27 29
31. サイバー系
いまここ
1. 自己紹介
2. SAS 9.3が出た
3. Rをビルドしてみる(高速化できたらいいな)
4. 大規模データを取得してみる
5. 大規模データを扱ってみる
6. 処理の高速化をしてみる
7. 本日のハイライト
2011/08/27 30
32. サイバー系
5.1 Rで大規模データを扱いたい
• Rの弱点
• データは基本的にオンメモリ
• 大規模データ管理パッケージ
• bigmemory
• 良い点・・・複数プロセスから同時にアクセスできる。つまりクラスタ処理対応可能。通常の行列の
よう にデータハンドリングできる。x[1:10,]とか
• 悪い点・・・行列のみ。データフレームだめ。基本的に数値型だけ
• ff
• 良い点・・・行列、データフレーム両方いける。因子型もいける。
• 悪い点・・・クラスタ処理できない。(試してないけどたぶんforeachとかで並列処理はできそう。)
データハンドリングの関数が専用
• とりあえず、bigmemoryパッケージを使うわ
• 第10回TokyoWebMining勉強会の資料が詳しい
http://www.slideshare.net/sfchaos/rbigmemory-tokyowebmining10
2011/08/27 31
33. サイバー系
5.2 Rのbigmemoryパッケージ
install.packages(bigmemory);
library(bigmemory)
#Rの行列からbigmemoryへ #あまり使わない
backingfileを指定しないと、実体がディスク上ではなく
ameba <- as.big.matrix(matrix(1:40, 10,4)) Shared memory上に作成されてしまうので注意
#bigmemory行列をあらかじめ作っておいて
ameba <- big.matrix(10000000, 4, type=“integer”, init=-1, backingfile=“ameba.bin”)
#カラム名をつける
options(bigmemory.allow.dimnames=TRUE) 1000万行 x 4列の行列をinteger
colnames(ameba) <- c(“ameba_id”, “create_year”, “create_month”, “create_day”) 型で初期値-1で作るわ。データ
#追加していく の実体はカレントフォルダに
「ameba.bin」でヨロシク!って意
ameba[1:10,] <- matrix(1:40,10,4) 味です。
#csvファイルからbigmemoryへ #これが一番よく使う
ameba <- read.big.matrix(“ameba.csv”, header=TRUE, sep=“,”, backingfile=“ameba.bin”,
descriptorfile=“ameba.desc”)
descriptorfileは省略可能。
その場合はbackingfile名+.descとなる
2011/08/27 32
34. サイバー系
5.3 Rのbigmemoryパッケージ 2
データの実態はこのファイル
#bigmemoryオブジェクトの永続化
ameba <- read.big.matrix(“ameba.csv”, header=TRUE, sep=“,”, backingfile=“ameba.bin”,
descriptorfile=“ameba.desc”)
でも次回、このデータを使う場合はこっちを明示
#Rを再起動後に読み込み
ameba <- attach.big.matrix(“ameba.desc”)
#行列サイズ確認
dim(ameba)
#行列要素にアクセス
ameba[,] #全データ出力だけどやってはダメだよ
ameba[1:10, ] #先頭10行
#集計もできる
library(bigtabulate)
summary(ameba)
bigtable(ameba, “create_year”) #table(ameba[,2])でも同じ結果が得られるけど速度がぜんぜん違う
#glmもできるしk-meansもできる
library(biganalytics)
2011/08/27 33
35. サイバー系
5.4 Rhiveから直接bigmemoryへ
• RHiveで取得するデータって普通はgigabyte越えだから、直接bigmemory化
されるといいね!!でも問題がちらほら…
1. メモリの問題
R上の変数 Java
rJava R上の変数 Java
(オンメモリ) (オンメモリ) rJava
CSVファイル
bigmemory
bigmemory
(ディスク上)
(ディスク上)
2. 型の問題
bigmemoryだと数値 Java側で文字列を数値に変換(変換表はHashMap)
RでそのHashMapを受けとるとかの工夫が必要
2011/08/27 34
36. サイバー系
5.5 ちなみにRのhashパッケージが結構便利
install.packages(hash) Javaなんかでよ
く使うHashみた
library(hash) いなのをがRでも
使えるよって話
h <- hash()
.set(h, “Tokyo.R16”, “DeNA”)
.set(h, a=1, b=2, c=3) #一括でもセットできる。
h <- hash(a=1, b=2, c=3) #生成時に一括セットもできる
values(h, “Tokyo.R16”)
[1] “DeNA”
clear(h) #これしないとメモリ解放しないらしい
rm(h) #だから↑rmする前にclearしておくこと
2011/08/27 35
37. サイバー系
いまここ
1. 自己紹介
2. SAS美の近況
3. Rをビルドしてみる(高速化できたらいいな)
4. 大規模データを取得してみる
5. 大規模データを扱ってみる
6. 処理の高速化をしてみる
7. 本日のハイライト
2011/08/27 36
38. サイバー系
6.1 処理の高速化
• 並列処理して高速化してみる
• Rは基本シングルコアでしか計算しない。
• とはいえ、大規模データ扱うなら(しかもコアが余ってるなら)並列処理したいよね
• めちゃくちゃショボイ例で申し訳ない。
install.packages("foreach")
install.packages(“doSMP”) #Linux, MacOSXはdoMCでもいいけど、WindowsはdoMCが使えないからdoSMPを使う
getDoParWorkers() #現状の使用コア設定数を確認
#[1] 1 #このままだとコア1つしか使わない
w <- startWorkers(4) #並列処理する数を設定
registerDoSMP(w) #これで並列計算用のプロセス(windowsだったらRterm.exe)が多数起動する。
getDoParWorkers() #使用コア設定数が変更されたか確認
#[1] 4 %dopar%を%do%にすると並列計算しないよ
foreach(i = 1:N, .combine = “c”) %dopar% { #for文のかわりにforeach文を使う
sum(rnorm(1e+6))
} cだと戻り値がベクトルになる。ここを例えばcbindにすると横に長いmatrixで戻ってくる
stopWorkers(w) #最後にWorkerを消し去る
#↑これしないとR(windowsだったらRgui.exe)を終了してもプロセス(windowsだったらRterm.exe)が多数残ってしまう。
#これせずにRを終了させて残ってるRterm.exeプロセスをkillしても次回にRを起動してからstartWorkers()呼んだ時に
警告メッセージ:
1: In startWorkers(12) : there is an existing doSMP session using doSMP1
#こんなんでる。その時は↓みたくしてセッションを切るとOK
rmSessions(qnames="doSMP1")
もう仕分け無い
2011/08/27 37
39. サイバー系
6.2 Revolution R Enterprise Editionがなかなかいいかも
http://www.revolutionanalytics.com/why-revolution-r/which-r-is-right-for-me.php
これ、RevoScaleRというパッケージ
なんだが、なかなか良さそう。
1. データはファイルシステムに置く
2. ベクトル、行列、データフレーム使える
(リストはダメっぽい)
3. 数値型、因子型、文字列扱える
4. 計算処理は自動的に並列処理してく
れる
5. もうじきクラスタ計算に対応
2011/08/27 38
40. サイバー系
6.3 Revolution R Enterprise Edition
• $1,000/year/user
• HPCクラスタだといくらかわかんない
2011/08/27 39
41. サイバー系
いまここ
1. 自己紹介
2. SAS美の近況
3. Rをビルドしてみる(高速化できたらいいな)
4. 大規模データを取得してみる
5. 大規模データを扱ってみる
6. 処理の高速化をしてみる
7. 本日のハイライト
2011/08/27 40
42. サイバー系
7. 本日のハイライト
1. 自己紹介
@wdkzはサイバー系
2. SAS 9.3出たよ
SAS 9.3出たけど…
3. Rをビルドしてみる
Windowsマシンは窓から投げ捨てたくなる
4. 大規模データを取得してみる
RでHiveQLを使って直接データ取得する
5. 大規模データを扱ってみる
bigmemoryつかう。HiveQL->bigmemoryとか。
6. 処理の高速化をしてみる
foreachとdoSMPで並列化できる。 RevoScaleRもいいね!
2011/08/27 41