2012年8月31日金曜日

Processing small data by Hadoop

ビッグデータ()が流行ってる昨今ですが、あえてスモールデータを処理する話題でも。

ビッグデータってさぞかしデカいデータでしょうって話がよく聞かれるわけですよ。
(最近はあんまり聞かないのでもうみなさんあきてきましたか?)
◯TB、◯PB、えぇ、確かにデカいです。こんなん処理するのにどのぐらい掛かるんですか?って話もあります。

んじゃ、逆を言えばこれらからみると数百MBぐらいのデータって小さいですね。
中身も100万件ほどしかなかったり。
単純に集計やる程度だったらHadoopとか必要ないですね。ってか、誰がそんなめんどかいことやるのかと。

じゃあ、ちょっと考えてみる。
100万件のデータがあります。全部1件ずつそれぞれ処理をしなければいけません。1件処理するのに大体0.1秒掛かったとします。

1,000,000(件) * 0.1(秒) / 60 / 60 = 27.77...時間

これ、スモールデータですか?1日じゃ処理しきれませんよ...
これをマルチスレッドで並行してやったとしても

約28時間 / 8(4コア X 2の想定) = 3.5時間

それでも3.5時間掛かるわけです。

まぁ、こんな話をしようと思ってたわけじゃないのでこの辺りでやめておいて本題。


上記のような処理をHadoopでやらせようと思った場合、単純にMapがネックになる。例えば、上記のものが300MBだったとする。HDFSのデフォルトのブロックサイズは64MB。Mapはブロック単位で処理されるので

300 / 64 = 5(約4.6)

ってことは、Mapは5個しか起動されないわけです。20ノードとか並べてもまったく意味がないわけですね。。。これを回避する方法としてInput部分を自分でアレするってのがありますが、正直そんなのめんどくせぇよってなるわけです。ってことでお手軽な方法として。

FileInputFormat.setMinInputSplitSize(job, 1048576);
FileInputFormat.setMaxInputSplitSize(job, 1048576);

とかやって処理するサイズをちっちゃくしてあげましょう。


次に数GB程度のファイルを成形する処理を考えてみましょう。
先に書いちゃうとローカルモードのHadoop速いです。速いです...
Hadoopのイニシャルコストって結構掛かるのですぐ起動するし速いです。

んでは、やり方。

普通(分散)のHadoop同様Mapがブロック単位で処理されます。ここでネックになってくるのがMapが1つずつ起動するってことです。ようするに一つ目のMapが終了すると次のMapが起動する。タスクの起動コストが高くとても効率が悪いです。。。

上記とは逆でsplitサイズをデカい値にしちゃってMapを一つしか起動しないようにしちゃいます。

FileInputFormat.setMinInputSplitSize(job, 2147483648);
FileInputFormat.setMaxInputSplitSize(job, 2147483648);

次に、これだとシングルスレッドになってしまうのでマルチスレッド化しちゃいましょう。

job.setMapperClass(MultithreadedMapper.class);
MultithreadedMapper.setMapperClass(job, Mapper.class);
MultithreadedMapper.setNumberOfThreads(job, 4);

MultithreadedMapperはMapperをマルチスレッド化してくれるので自分でマルチスレッドの処理を書かなくてすむのでとても楽ですね。
ただ、障害が起きると即死亡なのでそこは気をつけましょう。

ローカルで処理しきれないぐらいでかくなってきたらクラスタにしちゃえばいいので一粒で二度美味しい的な感じがあります(まさにビッグデータ、スモールスタート!)。

本当はここだけをメモ代わりに書いとこうと思ったんだけど、余計なことまで書いちゃったのはもういいや。

ということで、上記のファイルの処理だけやるヤツを公開しました。

Huahin Tools

まだ、ファイルを成形(デフォルトではデフォルトのApacheログを成形)する機能だけしかないですが、成形してからDBなんかにぶち込む感じで。
現在はローカルモードとAmazon Elastic MapReduceで動くようになってます。

注意としては、他のものとリリースをあわせようと思ってるので、まだ正式版ではないってこと。


2012年6月28日木曜日

Huahin Framework(wrapping Hadoop MapReduce) released

内部で使用しているフレームワークをOSS化することにしました。

Huahin Framwork (http://huahinframework.org/)

Huahin Manager (http://huahinframework.org/huahin-manager/)に関しては某所で求められてて先行でリリースしていたのですが、こちらはMapReduceをラップしたフレームワーク本体です。

Pig、Hiveじゃどうしてもできないことがあったためネイティブで書くしかなかったのですが、正直、Writableとかソートとか書くのにはウンザリしていたためこれが出来た感じです。

基本は、MapReduceをラップしてるだけなので足りないものは自分で実装できるようになってます。Key/Valueがレコードという概念になっていて、レコードに対してグルーピングするのかソートにするのかそれともただの値なのかといった感じで指定します。

ジョインに関して内部仕様からの切り出しに苦労してるため現在はサポートされてませんが(自分で実装するのであればできる)、次のリリースでサポートする予定です。

Huahinとは何かってことですが、タイのHua Hinから来ています。
ウチでつけるコード名はワインの産地から決めるって感じなのですが、ワイン産地、タイ=象ということでコード名がそのままフレームワーク名になった超適当な名前付けです。





OSS化って、内部仕様どっぷりだと結構てこずるますね。
去年のHadoop Conference Japanで話してから随分時間が掛かった。。

2012年5月2日水曜日

MRUnit 0.9.0 released (mavenでの取得方法)

ついでなんでメモがわりに書いておく。

MRUnitの0.8.1からHadoop 0.23を対応したことによりMavenでの
取得方法が変更になっている。

0.8.0までだと

<dependency>
  <groupid>org.apache.mrunit</groupid>
  <artifactid>mrunit</artifactid>
  <version>0.8.0-incubating</version>
  <scope>test</scope>
</dependency>

のような感じでよかったのだけど、0.8.1からHadoopのバージョンを指定してあげないといけない。
下記のような感じでclassifierにバージョンを指定してあげる。

<dependency>
  <groupId>org.apache.mrunit</groupId>
  <artifactId>mrunit</artifactId>
  <version>0.9.0-incubating</version>
  <classifier>hadoop1</classifier>
  <scope>test</scope>
</dependency>

ちなみに、hadoop1は1.0.2でhadoop2を指定すると0.23.1が指定されることになる。

Hadoop Hacks now on sale

ステマ的には遅いが一応書いとく。



が4/25に出ました。
まぁ、いろいろありました。

右の翻訳と一時期かぶってたりとか(結構キツかった)。
某氏が起業してベイエリアに行っちゃうとか。
代わりにuしんさんひっぱってきたりとか。

無事出てよかったですね。

2012年4月1日日曜日

HH2をOSSとしてリリースします

HadoopにかわるHH2の開発を進めてきましたがOSSとしてリリースすることにしました。






HH2はHadoopのJobTracker、TaskTrackerを置き換えるもので効率よくJobを実行することができます。まず、JobTrackerにかわるHumanTrackerがTaskTrackerにかわるHumanTaskerにタスクの割り当てを行います。


タスクの割り当てに使うのは特に難しいことはありません。メールによる通知となります。


この時、通常のHadoop同様にHumanTaskerがなんらのか障害により通達エラーが発生する場合があります。


この場合もHadoop同様に別Humanにタスクを割り当てます。ただし注意しなければいけないのは別Humanにタスクを割り当てる場合は、ボーナスの支給が必須となります。


最後に、やはりHumanTrackerはHadoopのJobTracker同様にSPOFになりえるということです。HumanTrackerの障害は様々ですがいずれこの問題は解消される予定です。


ここまで見てきたとおり通常のHadoopよりも効率的にJobが実行できることがおわかりいただけたでしょう。なお、HH2のOSSリリース予定は2045年5月を目標に着々と準備を進めているところです。

リリースが完了するまでしばらくお待ちいただけますと幸いです。

HH2開発チーム一同