2013年1月17日木曜日

Huahin Manager 0.1.4 and 0.2.1 released


HCJ2013Wまでにリリースしとうこうかなと思って。
  • 0.2.1でPig REST APIに対応
  • 0.1.4でHadoop 1系とCDH3のHiveとPigのREST API対応
最近ブログがリリースしか書いてない。

Huahin Framework

2012年12月27日木曜日

Huahin Manager 0.2.0 released

CDH4 と Apache 2.0.2-alpha対応でございます。
beta版から設定項目も増えてるので注意が必要です。
以下、主な出来事

  • Job関連のAPIは変わってない
  • YARN Application APIが追加
    • Job Kill だけじゃなくて Application Kill でもいけるよ!
  • それぞれのManager等が持っているREST APIにproxy接続
  • HiveQLの実行(HiveServer1 or 2対応)
    • 戻り値を返さない場合は、executeを使用
    • 戻り値を返す場合は、executeQueryを使用
      • 戻り値はストリームで返される
      • 実行時間がアレだとアレなのでタイムアウトには気をつけてね
  • Job の キュー登録にHiveが追加
    • キューでの実行なので出力先はテーブル、HDFSにする必要あり


たぶん、次はPigが入るかなと、0.1系もHiveなコードは入ってるんだけどpushをしてないのでそのうちにあれするかなと。

Huahin Framework

2012年11月22日木曜日

Huahin Manager 0.2.0-beta released

さて、皆さんお待ちかね Manager の CDH4 対応です。
存分にステマするが良いと思います。

今回、beta としてるのはCDH4のクラスタが無いのでクラスタでのテストが出来てないってこと...
なのでbetaとして出してクラスタ持ってる人にテストしてもらおうかなと思って。。

あとMRv1には対応してるけど、YARN対応はまだなのとApplication Masterとかに対応してないのでbetaが取れる時に入る感じで。まだCDH4しか対応してないのでApache版もその時に...



2012年10月19日金曜日

Huahin EManager 0.1.0 released

EManager、Managerと何が違うのかっていうと、Amazon Elastic MapReduce(EMR)に特化したManagerです。もちろん、EManagerのEはEMRのEです。

本当はManagerの中に入れちゃおうと思ったんだけど、いろいろ無理が出る感じがしたので、分けたしだいです。まぁ、内部での使用もEManagerとManagerがあって、インターフェースで切り替えて、オンプレHadoopとEMRを使い分けてる感じなので、同じっちゃ同じなんですけど。

EManagerができることは、基本Managerと同じで以下のとおり。
  • Job Flowの一覧取得
  • Job Flowの詳細取得
  • StepのKill
  • キューの一覧取得
  • キューの詳細取得
  • キューの登録
まず、Managerと違う点。
Jobの一覧等がJob FlowとStepという感じでEMRのものになってます。キューはManagerと同じだけど、Jobの実行できるものがHive, Pig, Streaming, Custom JarとEMRで使えるものは基本的に使えます。

EManager独自の機能。
まず、Stepのkill。現状、EMRはJobのkillを行うにはEMR自体をターミネートするか、マスターインスタンスにログインしてkillするしか方法がありません。EManagerはManagerと組み合わせることでこの機能を実現しています。

クラスタ数の指定。複数のHadoopクラスタ(EMR)を起動し制御することができます(複数起動する場合は、インスタンスの上限値に注意する必要あり)。

コスト管理。EC2は時間課金なので1時間使用しようが5分使用しようが料金は同じです。Jobが終了したらEMRをターミネートするのではなく、起動したままで次のキューが登録されたら、起動しているEMRにJobを割り振ります。1時間未使用のままであれば自動的にEMRがターミネートされます。

Job(step)の実行。EMRはS3に保存してあるスクリプトなりを指定して実行しますが、EManagerのREST API(APIしかないんだけど)のメソッドでPOSTを指定した場合にファイルをS3に送信することができるのでオンデマンドで実行する時に楽です。オプションの指定で、実行が完了したスクリプトは削除もできます。

などなど。

一応これで、内部のツール系ものは出し切った感。


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で動くようになってます。

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