2015年7月27日月曜日

LinuxでR、RからMySQL接続、MacのX端末化

R の環境を Linux サーバーに構築した。今回の大きな課題は次の二つ。
  • LinuxサーバーのMySQLデータベースにRスクリプトからアクセス
  • Linuxサーバーの R で作成したチャートを ssh 接続元のクライアントに表示

Linux へ R

Linux サーバーに yum を使って R をインストールした最大の弊害は、インストール前の Java 8 の環境を Java 6 に変えられてしまうこと。おかげで、同じサーバで Java 8 でコンパイルしていたシステムは動かなくなった...。この原因に気づくまで、めっちゃ焦った。環境構築て地味だが意外と落とし穴が多い(苦手な作業...)。

どの R パッケージが Java環境に影響したかは不明だが、以下のコマンドで Java 8 に変えれば大丈夫。

# alternatives --config java

R 自体にも問題があった。初期パッケージを入れただけでは、回帰分析で「収束できません」のようなエラーが出る。この回避には、以下のコマンドで R パッケージをアップデートする。

update.pakages()


R から MySQL接続

Linux サーバにRを入れる最大の目的がこれ。DBアクセスを外部から許可する案は、セキュリティー上の理由から外した。また、サーバー上のシステムを R と連携させる案もあるので、R 環境をサーバーに構築するのが妥当と考えた。

以下、R から MySQL のDBへのアクセス結果。

> library(RMySQL)
> con <- dbConnect(dbDriver("MySQL"), dbname="DB名", user="ユーザー名", password="DBパスワード")
> mytb <- dbGetQuery(con, "select * from テーブル名")
 警告メッセージ: 
1:  .local(conn, statement, ...) で: 
  Unsigned INTEGER in col 0 imported as numeric
2:  .local(conn, statement, ...) で: 
  unrecognized MySQL field type 7 in column 2 imported as character
3:  .local(conn, statement, ...) で: 
  Unsigned INTEGER in col 17 imported as numeric
4:  .local(conn, statement, ...) で: 
  Unsigned INTEGER in col 18 imported as numeric
> class(mytb)
[1] "data.frame"
> ncol(mytb)
[1] 19
> nrow(mytb)
[1] 9304

テーブルアクセスの際に出る警告は今のところは無視...。

clsss()コマンドの結果から、DBテーブルを R の dataフレームとして扱えるのは嬉しい。19カラム、9,304行のテーブルに正しくアクセスできていることを確認。これにより、直接DBからデータ取得して、リアルタイムのデータ分析が可能になるのは、非常に大きい。


X クライアント表示

久しぶりに、Unix(厳密には Linux)の X アプリケーションを、クライアント表示した。どういうことかというと、リモートの UnixサーバーでGUIアプリの動作結果を、接続元のクライアントの端末に表示するもの。今時こんなことをする人は少ないのかもしれないが、未だに面白い技術だと思う。

とはいえ、Mac の端末からこれを行うのは初めてで、少し手間取った。そもそもこれをやることになった理由は、Linuxのサーバーで R を動かして、その動作を確認するため。単に R で統計計算するのであれば必要ないが、チャート表示の確認をするにはどうしても必要。

iMac と MacBookAir、どちらもOS は OS X Yosemite(10.10.4)なのだが、微妙に挙動が違った(勘違いかもしれないが...)。MacBookAir が面倒だったので、そちらを優先して書くが、iMac での操作も一部書いた。

ssh 接続は付属のコンソールを使うが、サーバーの結果をGUI表示するには、XQuartz が必要。これは、デフォルトは入っていない模様。
http://xquartz.macosforge.org/landing/

以下、コンソールで実行。

$ Xquartz &
(私の iMac では、以下の xhost コマンドで自動に XQuarz は起動した)
$ export DISPLAY="localhost:0.0"
$ xhost +
$ ssh -X ユーザー@サーバーアドレス

サーバーからの表示ができない場合は、左のように XQuarz の「ネットワーク・クライアントからの接続を許可」の設定をする必要があるかもしれない。

以降は、サーバーにログイン後の実行。

$ export DISPLAY="クライアントアドレス:0.0"

これ以降、サーバーでGUIアプリはクライアントに表示する、xclock コマンドなどで試すことができる。今回の Linuxサーバーには X関連のアプリケーションを入れていないので、以前 iMac で実行した「ロジスティック回帰分析」を、先にインストール済みの R で分析結果を表示する。なお、ggplot2 の Rパッケージはインストール済み。

$ R
> library(MASS)
> b <- biopsy
> b$classn[b$class=="benign"] <- 0 # 分類化
> b$classn[b$class=="malignant"] <- 1 # 分類化
> ans_v1 <- glm(classn ~ V1, family=binomial(link="logit"), data=b)
> library(ggplot2)
> ggplot(b, aes(x=V1, y=classn)) +
  geom_point(position=position_jitter(width=0.3, height=0.06), alpha=0.4, shape=21, size=1.5) +
  stat_smooth(method=glm, family=binomial)

以下のように、前回と同じ結果を表示。R のパッケージをアップデートしたので回帰分析のエラーも出なくなった。この描画が徐々に表示されるのを見ながら、遠く離れたネットワーク経由のことを改めて思った(笑)

0 件のコメント:

コメントを投稿