AWS上でRを実行する
既に多くのAWSのお客様が、ビッグデータ分析とデータサイエンスのために、オープンソースの統計ソフトウェアとして人気のあるRを使っています。その一方で、AWS上でRを実行する手順とベストプラクティスについて質問されます。数ヶ月前、HadoopマスターノードにRStudioをインストールし、 rm2やplyrmrのような Rパッケージを使って、公開されている巨大な気象データを分析する手順を、RからAmazon EMRに接続する方法としてブログ記事に書きました。本記事では、RとRStudio ServerとShiny ServerをAWSにインストールして実行する方法について説明します。
RStudioは、商用ライセンスもしくはAGPLv3でライセンスされ、Rとともに使われることが多い人気のあるIDEです。サーバにSSHで接続してviのようなコードエディタで分析したくない、という方に最適です。RStudioにはデスクトップバージョンと、ウェブブラウザ経由でRにアクセスできるサーバーバージョンがあります。
分析したあと、その結果を可視化したいと考えるかと思います。Shiny は商用もしくはAGPLv3でライセンスされる素晴らしいRパッケージで、インタラクティブなダッシュボードを作るために利用できます。ShinyはRのためのウェブアプリケーションフレームワークを提供します。HTML, CSS, JavaScriptの知識が不要で、インタラクティブなウェブアプリケーションへ分析作業を移せます。Shiny ServerはRの可視化を皆様のお客様にウェブブラウザ経由で配信でき、裏でデータベースへ問い合わせをするようなR関数を実行できます。
この記事では例として、CCAFS-Climate Dataという6TBの高解像度の気象データのAWS パブリックデータセットを使い、主に農業での気象変更の影響を評価します。下図はそのアーキテクチャです。
AWS(EC2インスタンス)上でサーバを開始するには、使用開始を参照すると簡単です。最初のステップは、EC2インスタンスの起動です。この記事では、AWS上のRの分析環境に重要となる、5つの起動ステップに注目します:
- Amazon Machine Imageを選択する
- インスタンスタイプを選択する
- インスタンスの詳細を設定する(IAM role)
- インスタンスの詳細を設定する(user data)
- セキュリティグループを設定する
その後に、Amazon S3上のデータを分析する方法と、Shiny Serverの設定方法を紹介します。
R用のAmazon Machine Imageを選択する
インスタンスを起動する際は、インスタンスを開始するために必要な全ての情報を保持しているAmazon Machine Image(AMI)を選択する必要があります。例えば、AMIはどのオペレーティングシステムをEC2上にインストールし、どのソフトウェアを含めるか、といったことを定義しています。
追加コスト無しで使えリポジトリに安定版のRがあるAmazon Linux AMIを選択できます。このAMIはAWSが保守しており、AWSやその他のソフトウェアとシームレスに統合できるパケッケージや設定を含んでいます。
R用のインスタンスタイプを選択する
データサイズや分析に必要な計算能力にマッチするEC2インスタンスタイプを選択します。デフォルトではRは1コアのみで動作し、多くの場合、大量のメモリを必要とします。
プログラミングと開発用途では、汎用 T2インスタンスタイプで十分かつ安価ですし、t2.microは無料枠で使えます。どのインスタンスタイプを選択してよいか分からないなら、 t2.mediumで始めましょう。
M4インスタンスタイプはRの処理に調度良いことが多いです。 並列処理用に foreach, parallel, snow といったRパッケージを使う場合は、CPU性能とメモリのバランスがとれている大きめのM4インスタンスタイプを使うことを薦めます。
AWSのドキュメントには、インスタンスタイプについての詳細な説明があります。AWSを使う利点は、最初に選んだインスタンスタイプに縛られない、ということです。数分でインスタンスタイプを変更できます: インスタンスを停止し、インスタンスタイプを変更し、インスタンスを再度スタートするだけです。
RStudio Serverを使うことで、 Rベースの分析サーバを複数のサイエンティストと共有できます。各サイエンティストにLinuxユーザを払い出すことでサイエンティストは同一マシン上で作業が可能です。各ユーザは少なくとも1CPUと一定のメモリを必要とします: 複数ユーザで共有するなら少なくともM4.2xlargeインスタンスタイプを使ってください。
インスタンスの詳細を設定する(user data)
EC2インスタンスを起動する際に、user dataを渡し一般的な設定タスクを自動で実行したり、インスタンス起動後にインストール作業のスクリプトを実行したりできます。EC2起動ウィザードの「インスタンスの詳細の設定」ステップにある「高度な詳細」メニューを広げます。
#!/bin/bash #install R yum install -y R #install RStudio-Server wget https://download2.rstudio.org/rstudio-server-rhel-0.99.465-x86_64.rpm yum install -y --nogpgcheck rstudio-server-rhel-0.99.465-x86_64.rpm #install shiny and shiny-server R -e "install.packages('shiny', repos='http://cran.rstudio.com/')" wget https://download3.rstudio.org/centos5.9/x86_64/shiny-server-1.4.0.718-rh5-x86_64.rpm yum install -y --nogpgcheck shiny-server-1.4.0.718-rh5-x86_64.rpm #add user(s) useradd username echo username:password | chpasswd
ユーザ名とパスワードは、皆さんの要件に基いて変更してください。また、最新のRStudio Serverと Shiny Serverのバージョンを確認してください。複数ユーザ環境にするには、この時点でユーザをさらに追加してください。
インスタンスの詳細の設定(IAM roles)
このダイアログボックスにて、EC2インスタンスに IAM role も追加できます。
IAM role で、EC2上のアプリケーション(この例ではR)が、AWSセキュリティクレデンシャルの管理をせずにAPIリクエストを安全に実行したりAWSサービスにアクセスすることができるようになります。
Rベースのデータサイエンス環境では、用意したS3バケットからデータを読む権限をEC2インスタンスに与える様にしてください。以下の IAM policy は、”rstas”ロールに “rstatsdata"バケットからファイルを読む権限を付与する方法を示しています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::rstatsdata"] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": ["arn:aws:s3:::rstatsdata/*"] } ] }
セキュリティグループの設定
EC2起動ウィザード内で、複数のインスタンスのトラフィックを制御する仮想ファイアウォールとして振る舞うセキュリティグループを設定します。 Rベースの分析環境では、RStudio Server用に8787ポート、Shiny Server用に3838ポートを開ける必要があります。
AWS上のRベースの環境にデータをロードする
EC2インスタンスが起動したら、ウェブブラウザで RStudio ServerとRに接続できます。ログインするために、新しく作ったユーザとパスワードを使います。URLは以下のようになっています
EC2コンソールではパブリックDNSについての詳細を確認できます。Linuxユーザのパスワードを変更するには、Tools > Shell を選択し、Linuxコマンドpassedを実行してください。
ほとんどの作業を RStudio Serverを使って行えますが、SSHでEC2インスタンスにログインする必要があるかもしれません。たとえば、あるRパッケージがLinuxパッケージに依存している場合です。次のステップでは、Linuxパッケージ のcurl-devel をインストールします。SSHでインスタンスに接続し、以下のコマンドを実行します:
sudo yum install curl-devel
これでRサーバーがセットアップされましたので、データをロードしてRのコードを取得しましょう。
Gitは人気のあるコードバージョニングシステムです。GitHub と Amazon CodeCommit はマネージドのGitサービスを提供しています。RStudioは異なるサービスとうまく連携します。皆さんのコードをGitリポジトリに置くことをお薦めします。そうすることで、同僚とコードを共有したり、ラップトップからAWSへコードを簡単にコピーしたり、コードの変更を追跡できるようになります。
S3にデータを保存する
Amazon S3 はセキュアで耐久性があり非常にスケーラブルなオブジェクトストレージです。シンプルなウェブサービスインターフェースを使って、どこからでも任意の量のデータを簡単に保存・読み出しができます。S3の始め方を見てください。It’s easy to get started with S3.分析対象のデータをS3に移動させ、次にAWS command line interface でデータをEC2インスタンスにコピーし、Rで読み込みます。S3オブジェクトのパーミッションを”Everyone”にしている場合は、 RCurlパッケージを使ってRから直接読み込めます。ただし、データのセキュリティにご注意ください。
> install.packages("RCurl") > library("RCurl") > data head(data) X1.15.2014 X395.87 X2677150 X398.94 X399.31 X392.534 1 1/14/2014 397.54 2339458 392.13 398.630 391.29 2 1/13/2014 390.98 2843810 397.98 399.780 388.45 3 1/10/2014 397.66 2678085 402.53 403.764 393.80 4 1/9/2014 401.01 2103029 403.71 406.890 398.44 5 1/8/2014 401.92 2316220 398.47 403.000 396.04 6 1/7/2014 398.03 1916017 395.04 398.470 394.29 > >#copy files via aws cli to your EC2 server >system('aws s3 get rstatsdata/amzn.csv ~/.')
この例では、CCAFS-Climateデータを読み込み、データフレームの先頭を表示しています。
Shiny Serverの設定
Shiny Serverを使うには、少し設定変更が必要です。EC2インスタンスに接続し、以下のコマンドを実行してください。
sudo /opt/shiny-server/bin/deploy-example user-dirs mkdir ~/ShinyApps
この設定では、全ユーザが各自のアプリケーションを各自のホームディレクトリ内の “ShinyApps”ディレクトリにホストできるようにします。 Shiny Serverの設定は, Shiny Server Professional v1.4.0 Administrator's Guideの Quick Start 章を参照ください。
デフォルトではShiny Serverは 3838番ポートをリスンしていますので、新しいアプリケーションは以下のURLで確認できます。ここで<your_username>はLinuxユーザ名です:
http://ec2-YOUR-IP.REGION.compute.amazonaws.com:3838/<your_username>/MyApp
Shiny ダッシュボードを作りShinyAppsフォルダーに配置できます。Shinyダッシュボード作成のアドバイスとして、Teach Yourself Shinyチュートリアルを参照ください。
使わない時はEC2インスタンスを停止することを忘れないで下さい。止めることでコストを下げますし、インスタンスの開始は5分以内です。インスタンスを削除するのではなく停止を検討してください。インスタンスの削除はインスタンス上の全てのデータとコードを削除します。
まとめ
AWSで、最大244GBメモリもしくは最大40CPUのサーバを使え、ハードウェアの制限やRによる分析時間の制約が無くなります。Amazon Linux AMIは分析環境を設定する良い開始点となります。数分でインスタンスタイプを変更できるので、要件に応じてインフラストラクチャを最適化できます。さらに、RJDBCや dplyrといったAWSのビッグデータサービスに接続できる多くのRパッケージがあります。AWSはデータ分析をR, RStudio Server, Shiny Serverで行うために効率的にスケールするインフラストラクチャを提供します。
質問や提案があればコメントをお願いします。
関連記事
コメント