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

Hadoopソースコードリーディング 第7回 でしゃべってきました

こんにちは。
落合です。

11/28(月)に開かれた「Hadoopソースコードリーディング 第7回」 で、
「Hadoop World NYC 2011 参加レポート」 という形で
阪本、落合が発表してきました。

会場提供、準備、当日の運営、ピザ・ビール(!)で、
濱野さんを始め、データの方々にはお世話になりました。
ありがとうございました!

自分たちの分も含めて、
今日の内容を記録しようと思います。

なお、
「Hadoopソースコードリーディング」は、
諸々の事情から一年前より開催が滞っていましたが、
今後は継続的に開催されるそうです。

次回は1/12(木)が候補ということなので、
今回参加できなかった方はぜひ!

「Hadoop World NYC 2011 参加レポート その1」 by NTTデータ 下垣さん

言わずと知れた、
Hadoop 徹底入門 著者の一人である、下垣さんの発表です。

5個の基調講演の内容、
注目のディズニーの講演の内容等を中心に、
Hadoop World 2011 の全体感を発表してくれました。

・1400人、560企業からの参加
 →来年は3000人、ラスベガスで開催か!?

・HBase のセッションが多かった

・大手ベンダーのアピール合戦
 Big Data 対応で、「うちはここが強い」
 を各社アピール。
 Netezza, Cisco, Dell, ・・・。
 ただし、Oracle だけは「NoSQL も Hadoop も BIツールも全部任せろ」
 強気。すごい。
 hpは・・・

・Informatica による基調講演は難関
 スライドが象徴的な絵のみで字がなく、
 しゃべり倒す講演。
 日本人にはきつい。
 Hadoop World 2011 のAgenda のページに、ビデオが公開されているので、
 挑戦してみては?

「Hadoop's Life in Enterprise Systems」by NTTデータ 政谷さん

Hadoop World で発表した内容を、
この会の中で紹介してくれました!

・比較的少量のデータ(数TBまで)を扱う領域と、大量のデータ(数PB)を扱う場合で、
 Life cycle が異なる。
 少量のデータを扱う場合、small siblings をたくさん作る、
 大量のデータを扱う場合、Big Mother cluster と Children を作る、
 がよい。

PostgreSQL Sqoop connecter

GPGPU

POSIX ファイルシステム

などなど

「Hadoop Trouble Shooting 101」 by Cloudera 嶋内さん

「Hadoop Trouble Shooting 101」の内容を、
スライドを全部日本語に訳した上で紹介してくれました!

設定ではまるポイント満載なので、
環境構築、運用を行う前には必ず読んだ方がいい内容ですね。

・重要なので、机に貼っておくこと
  Total RAM
= (Mappers + Reducers)Child Task Heap
+ DN heap
+ TT heap
+ 3GB
+ RS heap
+ Other Services' heap

特に、「3GB」が重要。
必ず確保すること。

設定ミスは原因究明が困難な問題となることが多いので、
気をつけましょう。

「Hadoop World NYC 2011 参加レポート その2」 by Acroquest 阪本、落合

The Powerful Marriage of R and Hadoop
David Champagne, Revolution Analytics

Indexing the Earth – Large Scale Satellite Image Processing Using Hadoop
Oliver Guinan, Skybox Imaging

Hadoop as a Service in Cloud
Junping Du, VMware
Richard McDougall, VMware

の3つを紹介しました。

「Big Data だ! Hadoop を使うぞ! MapReduce を書こう!」
という使い方は古い、という話です。

Hadoop はインフラとして使い、
その上で既存の資産を生かすのがよいでしょう。

ただ、
内容以上に好評だったのが、
New York の空港の免税店で買った、
象のラベルのお酒「Amarula」でした。

http://www.youtube.com/watch?v=3h9e4Y2MlIg&feature=player_embedded&noredirect=1

あと、2人で掛け合いっぽく発表したのが珍しかったようです。

次は内容で勝負・・・いけるか?

Hadoop World 2011 New York に行ってきます!

こんにちは。
落合です。

11/8(火)、11/9(水) にニューヨークで開催される、
Hadoop World 2011 に行ってきます!

時差が14時間なので、
日本時間の11/8(火)22:30 から講演開始です。

Acroquest社員は、
@taro_x

@frutescens
が参加します。

「ハッシュタグ
 #hw2011jp
 でつぶやきましょう!」

と、向こうで日本人に会ったら声をかけるので、
タグを追ってもらえれば情報が入ってくるかもしれません。

また、Hadoop World 2011 のFacebookページ
https://www.facebook.com/groups/hw2011jp/
もあります。

公開ページですので、
Hadoop World に興味のある方は気軽に参加してみてください。

セッションの情報

セッションの情報は以下のページにあります。
http://www.hadoopworld.com/agenda/

5会場×6ターン×2日間=60セッション

多いですね!
基調講演も1日目に3つ、2日目に2つあります。

講演数が60もあるので、
ざっとキーワードだけ抜き出して表にしてみました。

HadoopWorld2011講演一覧_1.pdf 直
HadoopWorld2011講演一覧_2.pdf 直

どれを見て来ようかな〜。

フィードバック会を開く予定です

日程は未定ですが、
今のところ、候補は12/2(金)。

参加者は集まるでしょうか?


それではまた。

Hadoop Conference Japan 2011 Fall に参加しました

Hadoop Conference Japan 2011 Fall に参加したので、
報告を書こうと思います。

これだけのイベントを開催してくださった、
運営のリクルートさん、主催のHadoopユーザ会のみなさんに感謝です。
昨日も深夜まで準備をしていたと聞きました。ありがとうございます。

個人的には、
「帰ってブログを書くまでがカンファレンスです」
という太田さんのコメントが秀逸だったかな、と。

ということで、リンクを貼っておきます:
Hadoop Conference Japan 2011 FALLで使用された資料やつぶやき #hcj11f
Attending Hadoop Conference Japan 2011 Fall in Shinbashi, Bellesalle Shiodome! #hcj11f
Hadoopカンファレンスが開催、本格普及を見据えた支援サービスや先進事例が充実

前回(2月)とは違う雰囲気

今回は参加者が300名→1000名と増えたこともありますが、
リクルートさんの運営ということで大分雰囲気が違いました。

・会場を流れる音楽
・スポットライトで壁に映し出される象
・カラフルなステージの照明
・豪華なオープニングムービー

と、さすがリクルートさん。

半数以上の参加者はHadoopを未使用

申込1100名のうち600名はHadoopを未使用、
残りの半分も使い始めてまだ半年以内ということで、
まだまだ「これから」という注目の集まり方のようですね。

Hadoopはまだまだ伸びる!

セッションの内容

私が聞いていたセッションの情報を書いておきます。

10:05〜10:35『The role of the Distribution in the Apache Hadoop Ecosystem』 Cloudera Inc, Todd Lipcon

CDHの説明。
「SCM Express」
を紹介していました。
https://ccp.cloudera.com/display/CDHDOC/Installing+CDH3+with+Service+and+Configuration+Manager+Express+Edition

CDHをウィザードに従ってインストールできるツール。
50ノードまではフリー。
うちの社内ではまだ誰も使ってないはずなので、
今度試してみよう。

10:45〜11:15『About Hortonworks』 Hortonworks, Owen O'Malley

Hortonworks の紹介。
Hortonworks はYahoo!のHadoop部門が2011年6月に独立した組織。
「世界の半分のデータをHadoop上に」というヴィジョンを掲げていました。

内容は、Yahoo!のHadoopに対する取り組みが中心。

Yahoo! は、42,000台のマシンをHadoopに使っており、
それらを1000人を超えるエンジニアが利用しているとのこと。

Yahoo! のApache Hadoop に対する圧倒的なコミット数、つまりHadoopへの貢献度の高さをアピール。
これからもHadoopの進化に対する取り組みを続けていく模様。

11:25〜11:55『How Hadoop needs to evolve and integrate into the enterprise』 MapR Technology Inc, Ted Dunning

MapR は、分散ファイルシステムC++ で実装したもので、
その上でHadoopのMapReduce やHive, Pig, HBase などを動作させる事が可能。

特徴は、

・Hadoopより3〜5倍の処理性能を持つ(Random read/write, MapReduce job)。
 特に、Hadoopが苦手とする「小さいサイズの多数のファイル」の扱いでは圧倒的な差
・NameNodeの冗長化など、SPOFの排除
・MapR fs は、外部のサーバから直接NFSマウントして読み書きすることが可能。
 つまり、Hadoop外のアプリケーション、Webサーバが直接参照可能
(http://www.mapr.com/products)

MapRは、OEM relationship を EMCと結んでおり、「Greenplum HD」の名前で販売します。
今日は、講演したMapRのTed Dunning氏の他に、
EMC Japan のスタッフが会場のカフェスペースでブースを構えていらっしゃったので、ご挨拶しました。

なお、リクルートがGreenplum HDを日本で初めて採用したとのことです。

講演の中で強調していた点は、
「スタートアップ(創業間もないベンチャー企業)と違い、
 成熟企業のIT戦略では過去のIT資産との互換性が重要」
ということ。

MapRを使うと、
レガシーシステムとのシームレスな連携を取る事ができ、
過去のデータをHDFSに"ジャンプ"させる必要がない、と。

12:10〜13:00 ライトニングトーク

DeNA

分析のニーズが増大。
「3日で分析して」等の要望が急増し、人手が足りない。
分析を担当のエンジニア達が引き受けるのではなく
「Hive, Pig を自分で書いて」
と各ゲームの製作部門に投げることに。

そこで現れた問題が、アクセス権限。
例:Aゲーム担当者には、Bゲームの売り上げ情報は見せない

Hueの機能、Hueに追加したプラグイン、
LDAPによるアカウント管理の独自実装によって、
アクセス権限の付与を実現。

なお、Hueのプラグイン作成は、
Python(Django), js, JFrame の知識が必要で、なかなか難しいらしい。

ブレインパッド

パネルログ分析について。

普通のWebログは、
特定サイトのログ、
あるいは、
いくつかのサイトのログを集めたもの。

パネルログは、
「人」の行動ログ。
つまり、
一人の人がどこのサイトからどこのサイトへ行ったか、行動を追うことができる。

ブレインパッドでは、
パネルログの解析をMapReduceで実装している。
複数の処理を1ジョブで実行しているため、HiveやPigは使うことができなかった。

玉川竜司氏

「象本」の翻訳者の方です。
10/1発売予定で、本日の会場で割引先行販売していた
『Hadoop MapReduce デザインパターン』の翻訳者でもあります。

私は玉川さんの話が終わるか終らないかくらいの時間に2Fに駆け上がって、
他の人の分もまとめて『Hadoop MapReduce デザインパターン』を2冊買いました。
そのあとはやっぱり行列が。

13:00〜13:45 『Apache HBase: an Introduction』Cloudera Inc, Todd Lipcon

HBase の紹介。

HBaseの最大データサイズは1PB, 1000ノードまで。
制限と言うより、「これ以上大きなものを見た事がない」ということらしい

ランダム書き込み、ランダム読み込みがないのなら、HDFSを使うべき。

また、
FacebookでのHBaseの利用は、
「一つのクラスタ
ではなくて、
「100台程度のクラスタを複数」
使っているらしい。

13:50〜14:35 『Architectural details and implications of MapR technology』MapR Technology Inc, Ted Dunning

午前の説明の項にこの講演の内容も含めたため省略。

14:40〜15:25 『基幹バッチ処理から見たHadoop』ノーチラス・テクノロジーズ, 神林 飛志

「基幹バッチをHadoopで」
をテーマに、Hadoopによるバッチ処理フレームワーク「Asakusa」普及活動に余念のない、
ノーチラス・テクノロジーズ神林さんの講演。

Hadoopが良く使われるBIツールと、
基幹システムとの違い。

BI 基幹
金額 30M〜100M円 100M円〜1B円 桁が一つ違う
潜在的な案件の数 その差は20倍。市場が大きい
処理内容 単純 複雑 基幹バッチはHiveやPigでは実現不可
開発方式 職人 チーム 50人、100人体制が必要
求められる品質 そこそこ 高い 試験が最重要。工数の7割が試験に当てられることも


(1)西鉄ストア
(2)アンデルセンサービス
(3)名古屋の某流通業者

の事例を紹介。


(1)西鉄ストア
データの総量は100〜500GB。
少ない!
ただし、件数、種類が圧倒的に多い。
中間データの種類は500〜600。

管理会計の方法を、
売価還元法(在庫の棚卸結果と比較。商品カテゴリごとの集計)から、
個別原価法(商品一つ一つの仕入れ値、売価から利益を確定)に変更することは、
集計のコスト(ホストコンピュータを何台も入れなければならない)がかかりすぎることにより、
今まで見送られてきたとのことです。
個別原価法にした場合の計算量は1000倍にも及ぶんだとか。

Hadoopによるバッチ処理でこれを低コスト・短時間で実現できれば、
他の小売業者に与える影響も大きい。

(2)アンデルセンサービス
パンの原価計算に、今までは4時間かかっていたそうです。
それをなんと20分で実現!
(もっと速くなるらしいです)

これにより、
原材料や商品ラインナップの変更に対するシミュレーションが行えるようになりました。
経営に与えるインパクトが大きい。

実現にはAmazon VPC を利用。
Hadoop 環境を自社に構築する手間がいらず、
「SIを劇的に変える」ツール、と神林さん。

Amazon VPC には注目せねば。

(3)名古屋の某流通業者
LSP(レイバースケジュールプラン:人員の配置)をHadoopで実現。
30分に1回データを集める。

データ総量は1〜2GBと少ない。

驚いたことに、
分散しないHadoopということで、スレーブ1ノードで動かしているんだそうです。
その代わり、今後データ量が増えても大丈夫(確実に増える事が見込まれている)。
「備えあれば憂いなし」

そして、注目すべき点:
・基幹バッチは設計が大事
・「人力」をシステム化した処理は、分散が可能。
 元は複数人でやっていた処理をシステムによって効率化したのだから、
 原理的に分散処理が可能なはず
 →10年、20年使われているシステムはほとんどみな対象となる

15:45〜16:30 『NTTデータ流 Hadoop活用のすすめ 〜インフラ構築・運用の勘所〜』NTTデータ, 猿田 浩輔

・マスタノードの可用性向上について
 →従来の技術でOK。Pacemaker(旧 Heartbeat)
・大量サーバの運用効率化
 →PXEブート+Kickstart
  Puppet
  100台のサーバ群の構築に90分、設定変更に3分
クラスタのリソース使用状況監視
 →ガングリアを使う

16:35〜17:20『Hadoop 0.23 and MapReduce v2』HortonWorks, Owen O'Malley

Hadoop 0.23 の目指すものについて。

HDFS Federation でNameNodeを複数にする。

従来のJobTrackerは、
  - 4,000ノードまで
  - 40,000 concurrent tasks
  - Wire compatibility の問題(バージョンが違うと動かない)
  - Iterative Application が10倍遅い(K-Means, PageRankなど)
 これを、
  - 6,000から10,000ノードまでを可能に
  - 100,000 concurrent tasks, 10,000 concurrent jobs を実現
  - Wire compatibility の解消
  - MapReduce 以外の programming paradigms をサポート
 とする。
キーワードは、
Resource Management, Application life-cycle management の分離。

17:25〜18:10 『MapReduceによる大規模データ処理 at Yahoo! JAPAN』ヤフー, 角田 直行 吉田 一星

Yahoo! JAPAN のHadoop利用事例における、
MapReduceプログラミングの手法について。

(1)地図の緯度・経度情報と、住所とを結びつける処理
(2)Web検索のための indexing
(3)機械学習によるページのランキング

@IT に連載あり
http://www.atmarkit.co.jp/fjava/rensai4/hadoop_tm02/01.html


Hadoopの今後にさらに期待ですね!
それでは。

Hadoop × リアルタイムストリーミング= Storm?

こんばんは、kimukimuです。

今日はいつものAndroidではなくて、Hadoopで最近調べていることを書きます!

1. 最近Hadoopは熱いんです!

最近、Hadoopを用いたビジネスがひたすら熱いです。

『Big Data』を扱う新たな情報分析プラットフォームとして、
破壊的なまでの広がりを見せています。

これまで1日かかっていたデータの集計が、
15分で出来るようになり、より素早い意思決定が可能になる。。。。
それを特別なハードは使わず、マシンを束ねてやってのけるというのはすごいですよね。

2〜3年前にAmazon Elastic MapReduceが登場したころに弄ってみて、
価値が理解できずに投げ出した過去の自分を蹴り飛ばしたいくらいに。

しかも、ついこの間次世代MapReduce(Hadoop-0.23)も発表されて、さらに勢いが増しています。
ただ、これはどうやら現在のHadoopの真っ当な後継のようです。

なので、Hadoop-0.23も気になりますが、
今日はちょっと変わり種の「Storm」について書いてみます。

2. Stormって?

Stormと聞くと、まず浮かぶのは下の画像のような光景ですよね。

どうやらStormは嵐を呼ぶプロダクトのようです。 ・・・冗談ですよ、冗談。

Stormとは、Hadoopのような分散並列処理を常時実施し、
結果をストリーミングのような形で随時発行可能なOSSです。

有名どころでいえば、Twitterのバックグラウンドで使用されているようです。
元はTwitterが買収したBackTypeの技術です。

3.Stormの特徴は?

特徴としては、
「Hadoopと同じ分散並列処理をデータがある限り延々と続け、終わった分だけ結果を生成し続けることができる」
のようです。

HadoopはMapReduceJob(MapタスクとReduceタスクからなる)という形で、1回実行したら基本処理は終わりです。

対して、Stormは下記の2つの要素から成り立っており、
『流し込むデータが存在する限り』継続して処理し、リアルタイムに結果を生成できます。

  1. Storm : 変換するためのデータを流し込む処理
  2. Bolt : データの変換処理(Boltを複数経由させることで、複雑なデータ処理も可能)

常に処理するデータがあるという前提で、
処理&結果算出を常時行うことができます。

4.Hadoopと比べてどんなアプリケーション/システムに向いているの?

これは個人的な意見になりますが、下記のような住み分けなのかな、と考えています。

  • Hadoop

統計、集計といった、
『データを全て読んで、結果を生成する』必要があるアプリケーション。

  • Storm

データ加工、変換といった、
『その時点のデータを読んで、結果を生成すれば済む』アプリケーション

・・・なんですが、実はこのStorm、まだ全然詳細は発表されていません。

来月の9月18日に「Strange Loop」というイベントがあり、
そこで初めてソースコード公開と新規機能発表がされるようです。

今スグにどうこうというわけではなさそうですが、
今後リアルタイムなアプリケーションを作るときは参考になりそうですね!

Hadoopの環境にあると便利なツール(parallel-ssh)

こんばんは、はじめまして、
Skipperです。

今日は、Hadoopに関連して、
Hadoopの環境にあると便利なツールの1つを紹介します。
 #他にもKickStart、puppet、WOLなどあるのですが、書ききれないので
 #1つに絞りました。

parallel-ssh

Hadoopで性能出すためには、
マシンを最低10台必要だと言われています。

ですが、仮に10台のマシンを用意したとして、
 1台1台ログインしてログ集めたり、Hadoopのサービスを再起動したり…
というのは面倒ですよね。

このparallel-sshは、そんな面倒な操作をすべて1回でやってくれます。

私もこれで複数台のPCを一度にシャットダウンの画面にしたときは、
ちょっと感動しました。

使い方

使い方はいたって簡単。
一度に操作したいマシンのホスト名(IPアドレス)をファイルに書き出し、
[hostlist]

centos
ubuntu
redhat

*1

以下のコマンドを1回だけ実行します。
そうすると、ファイルに書いたマシン全てで、指定したユーザでコマンドを実行してくれます。

 pssh -h hostlist -l (実行するときのユーザ名) -i (実行するコマンド)

もし、parallel-sshを実行するPCとparallel-sshで実行されるPCとの間で
sshで通信した事がない場合は、「-A」オプションをつけてください。
そうすれば、指定したユーザのパスワードを求められ、
正しく入力すれば実行できるようになります。
また同じパスワードならば、1回入力すれば全てのマシンで同時に認証されます。

また、フォルダを指定した操作(lsやmvなど)で相対パスを使用する場合、
指定したユーザのホームディレクトリからの相対パスになるようです。


実はparallel-sshには他にも以下のコマンドが用意されています。
 pscp(ファイルの転送:scpの複数台版)
 prsync(フォルダの同期:rsyncの複数台版)
 pnuke(プロセスのkill)
 pslurp(ファイルの取得:scpの複数台版)
使い方はpssh同様、
 「-h」オプション ⇒ ホスト名を書いたファイルを指定
 「-l」オプション ⇒ 実行したいユーザを指定
 「-A」オプション ⇒ パスワード認証
オプションの後には、フォルダを指定したりプロセス名を指定すればOK。
もっと具体的な使い方を知りたい方はこちらの記事を参照してください。

インストール

インストール方法(Centos)は以下の通りです。
1.pythonをインストール
以下のコマンドでできます。

yum install python

もしくはpythonのrpmをDVDから取得して、以下のコマンドを実行します。
*2

rpm -Uvh (pythonのrpm)

2.psshのtarを解凍
parallel-sshをプロジェクトページからダウンロードして、
インストールしたいディレクトリで解凍します。
*3

 gunzip pssh-x-x-x.tar.gz
 tar -xvf pssh-x-x-x.tar

3.psshのインストール
解凍してできたフォルダに移動し、以下のコマンドを実行します。

 python setup.py install

以上でparallel-sshが使えるようになります。

*1:ファイル名は任意ですが、ココではhostlistとします

*2:Centos5(64bit)のイメージはこちら:http://centos.mirrors.atwab.net/5/os/x86_64/CentOS/

*3:parallel-sshのダウンロードページ:http://code.google.com/p/parallel-ssh/downloads/list

MRUnitでHadoop MapReduceの試験を

こんにちは。
落合です。

MRUnit を使った、
Hadoop MapReduce のテスト方法をご紹介します。

MRUnitとは

MRUnitは、Hadoop MapReduce のテストのためのライブラリです。
これを使うと、Hadoop MapReduce の JUnitテストを行うことができます。
Context を自分で作る必要もないため、
Mapper や Reducer の in と out の確認が簡単にできます。

開発環境を作る

本ブログ執筆時点で最新の、Cloudera のディストリビューション CDH3u1 を使いました。
以下のサイトでTarball(hadoop-0.20.2-cdh3u1.tar.gz)をダウンロードし解凍します。
https://ccp.cloudera.com/display/SUPPORT/Downloads

解凍したら、libの下と、hadoop-core-0.20.2-cdh3u1.jar を Eclipse のビルドパスに追加しておきます。

さらに、MRUnitを使うために、
contrib\mrunit の下の、hadoop-mrunit-0.20.2-cdh3u1.jar もビルドパスに追加します。

テスト対象の Mapper, Reducer の用意

今回はとりあえず、先ほどダウンロードしたファイル中に保存されている、WordCount.java を使います。

hadoop-0.20.2-cdh3u1\src\examples\org\apache\hadoop\examples\WordCount.java

パッケージ名だけ変えてあります。

確認しやすいように、Eclipse の Refactor 機能で
Mapper と Reducer を別ファイルに切り出しました。

Mapperのテスト

TokenizerMapper では、入力文字列をスペースで分割し、、
<単語,1> のペアをキー、バリューの組として出力とします。

public class TokenizerMapper 
       extends Mapper<Object, Text, Text, IntWritable>{
    
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
      
    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }

このMapperに対するテストコードを書いてみます。

public class TokenizerMapperTest extends TestCase {
    private Mapper<Object, Text, Text, IntWritable>    mapper;

    private MapDriver<Object, Text, Text, IntWritable> driver;

    @Before
    public void setUp() {
        mapper = new TokenizerMapper();
        driver = new MapDriver<Object, Text, Text, IntWritable>(
                mapper);
    }

    @Test
    public void testTokenizerMapper() {
        driver.withInput(
                new LongWritable(1),
                new Text("We must know. We will know."));
        driver.withOutput(new Text("We"), new IntWritable(1));
        driver.withOutput(new Text("must"), new IntWritable(1));
        driver.withOutput(new Text("know."), new IntWritable(1));
        driver.withOutput(new Text("We"), new IntWritable(1));
        driver.withOutput(new Text("will"), new IntWritable(1));
        driver.withOutput(new Text("know."), new IntWritable(1));
        driver.runTest();
    }
}

TokenizerMapperTest を実行すると、以下のように成功します。

ためしに出力結果を間違えてみると、

    public void testTokenizerMapper() {
        driver.withInput(
                new LongWritable(1),
                new Text("We must know. We will know."));
        driver.withOutput(new Text("I"), new IntWritable(1));
        driver.withOutput(new Text("must"), new IntWritable(1));
        driver.withOutput(new Text("know."), new IntWritable(1));
        driver.withOutput(new Text("We"), new IntWritable(1));
        driver.withOutput(new Text("will"), new IntWritable(1));
        driver.withOutput(new Text("know."), new IntWritable(1));
        driver.runTest();
    }

こうなります。

コンソールにエラーが出ます。

エラーメッセージは以下の通り。

11/07/24 02:41:31 ERROR mrunit.TestDriver: Matched expected output (We, 1) but at incorrect position 0 (expected position 3)
11/07/24 02:41:31 ERROR mrunit.TestDriver: Missing expected output (I, 1) at position 0

どこを間違えたかわかりますね。

Reducerのテスト

Reducer のテストもほとんど同様です。

public class IntSumReducer 
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, 
                       Context context
                       ) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }

に対するテストコードが以下。

public class IntSumReducerTest extends TestCase {
    private Reducer<Text,IntWritable,Text,IntWritable>      reducer;

    private ReduceDriver<Text,IntWritable,Text,IntWritable> driver;

    @Before
    public void setUp() {
        reducer = new IntSumReducer();
        driver = new ReduceDriver<Text,IntWritable,Text,IntWritable>(
                reducer);
    }

    @Test
    public void testIntSumReducer() {
        List<IntWritable> values = new ArrayList<IntWritable>();
        values.add(new IntWritable(1));
        values.add(new IntWritable(1));
        driver.withInput(new Text("We"), values);
        driver.withOutput(new Text("We"), new IntWritable(2));
        driver.runTest();
    }
}

Mapper との違いは、
List で複数の value を渡してやるところくらいですね。

実行結果は以下のようになります。

MapperとReducerをつなげたテスト

Mapper から Reducer まで、一連の流れをテストすることもできます。

その場合、以下のように、MapReduceDriver を使います。

public class TokenizerMapperIntSumReducerTest extends TestCase {
	private Mapper<Object, Text, Text, IntWritable> mapper;
	private Reducer<Text, IntWritable, Text, IntWritable> reducer;

	private MapReduceDriver<Object, Text, Text, IntWritable, Text, IntWritable> driver;

	@Before
    public void setUp() {
        mapper = new TokenizerMapper();
        reducer = new IntSumReducer();
        driver = new MapReduceDriver<Object, Text,
            Text, IntWritable, Text,IntWritable>(mapper, reducer);
    }

	@Test
	public void testTokenizerMapper() {
		driver.withInput(new LongWritable(1), new Text(
				"We must know. We will know."));
        driver.withOutput(new Text("We"), new IntWritable(2));
        driver.withOutput(new Text("know."), new IntWritable(2));
        driver.withOutput(new Text("must"), new IntWritable(1));
        driver.withOutput(new Text("will"), new IntWritable(1));
		driver.runTest();
	}
}

実行結果は以下のようになります。

MapReduceDriver を使えば、このようにMapReduce処理の一連の流れを通してテストすることができます。

うまく使い分けたいですね。