FC2ブログ

スポンサーサイト

このエントリーのカテゴリ : スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【GAEでMapReduceを使おう!】MapReduceからの非同期連携

このエントリーのカテゴリ : 【GAEでMapReduceを使おう!】

サイトはコチラ→http://monitorequest.appspot.com/traininfo/

【GAEでMapReduceを使おう!】MapInputの条件指定で、MapReduceで行う集計処理の対象を全期間から直近2日分に減らしました。

うまくいったと思いきや、全期間の集計データまで2日分に減ってしまっていました。

非同期処理追加前

うーん、MySQLとかRDBだったら画面からのリクエスト時に

SELECT 路線名,count(*) AS 日数, sum(報告数) AS 累積 FROM 日別路線別サマリ
GROUP BY 路線名


で済むんだけど…。
Java上で集計してもいいけど、日数x路線数だとそのうちまたOutOfMemory問題になりそうだし。
せっかくなので集計処理にします。

最初は日別路線別サマリからのMapReduce処理にしようかと思いましたが、上記SQLで単純に記述できるように日別路線別サマリのCOUNTと報告数のSUMを路線別サマリにINSERTするだけなので余計に複雑になってしまいました。
そこで、この集計処理をサーブレット一つにして、MapReduce処理の非同期後続処理にしました。

非同期後続処理後

サーブレット処理は単純に、以下の処理だけです。
 1. 日別路線別サマリを全件取得
 2. 路線別に日数と報告数を集計
 3. 2を保存(Update or Insert、Oracleで言うところのmerge)

MapReduceのReduce処理サーブレットに集計処理サーブレットのURLをキューに追加するだけでできました。

Queue queue = QueueFactory.getDefaultQueue();
TaskOptions task = TaskOptions.Builder.withDefaults()
  .url("集計処理サーブレットのURL").method(Method.POST);
queue.add(task);



真面目にやるとすれば、MapReduceは1日分のみ対象で、明細に集計済みフラグかなにかをつけて、路線別サマリにも日数と報告数を追加するだけにすればいいんだろうけど、路線別サマリにコミットできなかったら明細の集計済みフラグをロールバックするとかできなさそうだし。。。
バッチを再実行可能なようにつくるには結構面倒だなぁ。

スポンサーサイト

テーマ : Google関連
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

toronic

Author:toronic
IT関係で10年働いたのでそろそろ独立したいと考えているけどなかなか一歩が踏み出しきれないありきたりなプログラマ

カテゴリ
ブックマーク
最新記事
月別アーカイブ
検索フォーム
最新コメント
ブロとも申請フォーム

この人とブロともになる

メールフォーム

名前:
メール:
件名:
本文:

スポンサーリンク
リンク
一攫千金?
RSSリンクの表示
QRコード
QRコード
    助成金
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。