Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

RHadoop を動かしてみました(Hadoopアドベントカレンダー2011 12/4)

こんにちは。
落合です。

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 さんです。