Tokyo.R#16 wdkz

8,648 views
8,501 views

Published on

Rで大規模解析

ソースコードからのコンパイルとか
rJavaの使い方とか
Hiveとか

Published in: Technology
0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,648
On SlideShare
0
From Embeds
0
Number of Embeds
52
Actions
Shares
0
Downloads
0
Comments
0
Likes
14
Embeds 0
No embeds

No notes for slide

Tokyo.R#16 wdkz

  1. 1. Rで大規模解析 aa Tokyo.R #16 和田 計也サイバー系 CyberAgent, Inc.
  2. 2. サイバー系 アジェンダ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト2011/08/27 1
  3. 3. サイバー系 いまここ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト2011/08/27 2
  4. 4. サイバー系 1.自己紹介 • 和田 計也(@wdkz) • 静岡県袋井市出身 • サイバー系企業でデータマイニングエンジニア職 • 創立記念日が3月18日 • 社長の出身地が福井県鯖江市 • 前職はバイオベンチャー • バイオマーカ探索してた • 学生時代は枯草菌の研究2011/08/27 3
  5. 5. サイバー系 いまここ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト2011/08/27 4
  6. 6. サイバー系 2 SAS 9.3(通称SAS美)が出た.SAS美 という記事が出たが、実際のところ変更点はそこじゃなさげ ↓主な変更点はこんな感じ • HTML形式が標準の出力になった! • 新しいプロシージャー(Rでいうpackageみたいなの)がいくつかできた! • IMLプロシージャー使ってR呼び出せる! • GROOVYも使える! • その他!2011/08/27 5
  7. 7. サイバー系 いまここ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト2011/08/27 6
  8. 8. サイバー系 3.1 Rのビルド • Windows 64bit OSでやってみる • 案外Windows でのビルド方法って ドキュメントないのね…2011/08/27 7
  9. 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 install2011/08/27 8
  10. 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. 11. サイバー系 3.4 ビルドツールをダウンロードコンパイルする・Win RtoolsをDL http://www.murdoch-sutherland.com/Rtools/ http://cran.md.tsukuba.ac.jp/ これ2011/08/27 10
  12. 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. 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.42011/08/27 12
  14. 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. 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. 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. 17. サイバー系 3.10 やったね! 2011年10月登場予定のR次期バージョンは、コンパイル済でやってきます!2011/08/27 16
  18. 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. 19. サイバー系 3.12 やる夫の憂鬱 ____ / \ / ⌒ ⌒\ / (●) (●) \ ホントはMKLを使うようにビルドしたかったお | (__人__) | 誰かやりかたわかったら教えてお / ∩ノ ⊃ / ( \ / _ノ | | .\ “ /__| | \ /___ /2011/08/27 18
  20. 20. サイバー系 3.13 RevolutionR Community Edition • 無料で利用可能です。 • http://www.revolutionanalytics.com/products/revolution-r.php • 普通のRと同じように使えます。(アイコンが違うぐらい) • BLASライブラリ,LAPACKライブラリがMKLのです!!2011/08/27 19
  21. 21. サイバー系 いまここ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト2011/08/27 20
  22. 22. サイバー系 4.1 Hadoopクラスタの概念図 • データストアとしてHadoopを利用していることが多 いかと思います。 • RHIPE使うとか • 第14回R勉強会@東京(Tokyo.R#14)で『R が黄色い象に出会った • http://ml.stat.purdue.edu/rhipe/2011/08/27 21
  23. 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-conferencejapan20112011/08/27 22
  24. 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欲しい Hadoop2011/08/27 23
  25. 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. 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. 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. 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. 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.jar2011/08/27 28
  30. 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. 31. サイバー系 いまここ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト2011/08/27 30
  32. 32. サイバー系 5.1 Rで大規模データを扱いたい • Rの弱点 • データは基本的にオンメモリ • 大規模データ管理パッケージ • bigmemory • 良い点・・・複数プロセスから同時にアクセスできる。つまりクラスタ処理対応可能。通常の行列の よう にデータハンドリングできる。x[1:10,]とか • 悪い点・・・行列のみ。データフレームだめ。基本的に数値型だけ • ff • 良い点・・・行列、データフレーム両方いける。因子型もいける。 • 悪い点・・・クラスタ処理できない。(試してないけどたぶんforeachとかで並列処理はできそう。) データハンドリングの関数が専用 • とりあえず、bigmemoryパッケージを使うわ • 第10回TokyoWebMining勉強会の資料が詳しい http://www.slideshare.net/sfchaos/rbigmemory-tokyowebmining102011/08/27 31
  33. 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. 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. 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. 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. 37. サイバー系 いまここ 1. 自己紹介 2. SAS美の近況 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト2011/08/27 36
  38. 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. 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. 40. サイバー系 6.3 Revolution R Enterprise Edition • $1,000/year/user • HPCクラスタだといくらかわかんない2011/08/27 39
  41. 41. サイバー系 いまここ 1. 自己紹介 2. SAS美の近況 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト2011/08/27 40
  42. 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

×