こんにちは。
落合です。
Hadoopアドベントカレンダー2011 12/4 の担当と言うことで、
Hadoop World NYC 2011 の
で紹介されていた、
「R言語のインタフェースからHadoop のMapReduceジョブを動かす」
というのを実際にやってみた結果を書きます。
R言語とは
オープンソースの統計解析向けプログラミング言語で、
統計解析に適した命令体系を持ちます。
世界中のRユーザが
「CRAN(Comprehensive R Archive Network)」
でライブラリを提供しており、
統計計算の様々なライブラリが使用可能です。
R言語は200万人以上のユーザを持つため、
- Rプログラマが簡単にHadoop上のデータを扱い、MapReduceで処理できるようにしたい
- Rを、Hadoop上で、Hadoopの中身を意識せずとも動かせるようにしたい
という動機で、Revolution Analytics が RHadoop の開発を進めています。
一般に公開されており、利用可能です。
https://github.com/RevolutionAnalytics/RHadoop/wiki
RHadoop は、
rhdfs | RのインタフェースでHDFS操作 |
rhbase | RのインタフェースでHBase操作 |
rmr | RのインタフェースでMapReduceを実行 |
という3つを行います。
今回は、
rhdfsとrmrのインストールについて書きます。
インストール
CentOS 6.0の仮想環境上に作ったHadoop疑似分散モードの環境に、
R と rhdfs とrmrをインストールします。
必要なものは以下です。
・rhdfs
- NameNodeにRをインストール
- NameNodeにrhdfs(Rのライブラリ)をインストール
- rhfsを入れるには、Rのライブラリ rJava が必要
・rmr
- Hadoop の全ノードにRをインストール
- Hadoop の全ノードにrmr(Rのライブラリ)をインストール
- rmrを入れるには、Rのライブラリ RJSONIO, itertools, iterators, digest が必要
Rは
http://pkgs.repoforge.org/R/
から
R-2.13.0-2.el6.rf.i686.rpm
を、
rJava, RJSONIO, itertools, iterators, digest は、
http://cran.r-project.org/web/packages/available_packages_by_name.html
から、
rhdfs と rmr は
https://github.com/RevolutionAnalytics/RHadoop/wiki/Downloads
から落としました。
Rのインストール
依存性チェックで引っかかったため、
以下をまず入れました。
# yum install cairo-devel # yum install python-devel # yum install gcc-gfortran # yum install tk-devel # yum install libicu # yum install blas # yum install lapack
※全部はいらないかもしれません。
http://www.revolutionanalytics.com/downloads/
の「Revolution R Community」をインストールしようと思って
入れたものもあります。
RHEL5.4と5.5の対応だということがわかって、
「Revolution R Community」ではなくて
R-2.13.0-2.el6.rf.i686.rpm を入れる方針に切り替えました。
# rpm -ivh R-2.13.0-2.el6.rf.i686.rpm
これでインストール完了です。
# R
と打ってRのプロンプトが開けば成功です。
Rのライブラリのインストール
Rのライブラリのインストールの前に、
JAVA_HOMEの設定を行いました。
参考:
http://ameblo.jp/kurabeat/entry-10593444983.html
次に、RのJava設定を行います。
# R CMD javareconf # R CMD INSTALL rJava_0.9-2.tar.gz
RJSONIOに必要だったため、
以下を行いました。
# yum install gcc-c++
ライブラリのインストールです。
# R CMD INSTALL digest_0.5.1.tar.gz # R CMD INSTALL iterators_1.0.5.tar.gz # R CMD INSTALL itertools_0.1-1.tar.gz # R CMD INSTALL RJSONIO_0.96-0.tar.gz
rhdfs, rmr のインストール
# export HADOOP_HOME=/usr/lib/hadoop # export HADOOP_CONF=/etc/hadoop/conf # R CMD INSTALL rhdfs_1.0.1.tar.gz # R CMD INSTALL rmr_1.0.1.tar.gz
環境変数 HADOOP_HOME と HADOOP_CONF がインストールには必要です。
rmrの実行
「R」でRのプロンプトを開いてから、
「library(rmr)」と打つことで、
rmrコマンドが使えるようになります。
https://github.com/RevolutionAnalytics/RHadoop/wiki/Tutorial
にある、
最初の実行例を試してみます。
# R > library(rmr) 要求されたパッケージ RJSONIO をロード中です 要求されたパッケージ itertools をロード中です 要求されたパッケージ iterators をロード中です 要求されたパッケージ digest をロード中です > small.ints = to.dfs(1:10) > out = mapreduce(input = small.ints, map = function(k,v) keyval(k, k^2)) packageJobJar: [/tmp/RtmpUO5rt7/rhstr.map3603b15b, /tmp/RtmpUO5rt7/rmrParentEnv, /tmp/RtmpUO5rt7/rmrLocalEnv, /var/lib/hadoop-0.20/cache/root/hadoop-unjar7013228099777030938/] [] /tmp/streamjob4057535115853530894.jar tmpDir=null 11/12/04 19:09:13 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 11/12/04 19:09:13 WARN snappy.LoadSnappy: Snappy native library not loaded 11/12/04 19:09:13 INFO mapred.FileInputFormat: Total input paths to process : 1 11/12/04 19:09:13 INFO streaming.StreamJob: getLocalDirs(): [/var/lib/hadoop-0.20/cache/root/mapred/local] 11/12/04 19:09:13 INFO streaming.StreamJob: Running job: job_201112041433_0001 11/12/04 19:09:13 INFO streaming.StreamJob: To kill this job, run: 11/12/04 19:09:13 INFO streaming.StreamJob: /usr/lib/hadoop/bin/hadoop job -Dmapred.job.tracker=localhost:8021 -kill job_201112041433_0001 11/12/04 19:09:13 INFO streaming.StreamJob: Tracking URL: http://localhost.localdomain:50030/jobdetails.jsp?jobid=job_201112041433_0001 11/12/04 19:09:14 INFO streaming.StreamJob: map 0% reduce 0% 11/12/04 19:09:22 INFO streaming.StreamJob: map 100% reduce 0% 11/12/04 19:09:32 INFO streaming.StreamJob: map 100% reduce 100% 11/12/04 19:09:33 INFO streaming.StreamJob: Job complete: job_201112041433_0001 11/12/04 19:09:33 INFO streaming.StreamJob: Output: /tmp/RtmpUO5rt7/file3844c8b3
MapReduceのMapperのみを指定、つまり、
Reduceは何もせずにそのまま出力するパターンです。
HDFS上にファイルが作成されているのを確認しました。
-bash-4.1$ hadoop fs -ls /tmp/RtmpUO5rt7/file3844c8b3 Found 3 items -rw-r--r-- 1 root supergroup 0 2011-12-04 19:09 /tmp/RtmpUO5rt7/file3844c8b3/_SUCCESS drwxr-xr-x - root supergroup 0 2011-12-04 19:09 /tmp/RtmpUO5rt7/file3844c8b3/_logs -rw-r--r-- 1 root supergroup 220 2011-12-04 19:09 /tmp/RtmpUO5rt7/file3844c8b3/part-00000 -bash-4.1$ hadoop fs -cat /tmp/RtmpUO5rt7/file3844c8b3/part-00000 [ 1 ] [ 1 ] [ 2 ] [ 4 ] [ 3 ] [ 9 ] [ 4 ] [ 16 ] [ 5 ] [ 25 ] [ 6 ] [ 36 ] [ 7 ] [ 49 ] [ 8 ] [ 64 ] [ 9 ] [ 81 ] [ 10 ] [ 100 ]
というわけで動きました!
今の例では、mapreduce(input, map)のみの指定でしたが、
mapreduce(input, output, map, reduce)
と言う形で、
入力元、出力先ディレクトリ、mapで行う処理、reduceで行う処理
を記述することができます。
mapやreduceで、
R言語が持つ豊富な統計計算ライブラリを使えるのが魅力、というわけですね。
以上、紹介でした!
明日12/5(月)は @hishidama さんです。