FC2ブログ

スポンサーサイト

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

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

【GAEでMapReduceを使おう!】実装編4:MapReduce起動サーブレットとweb.xml

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

【GAEでMapReduceを使おう!】実装編3:MapperとReducerの実装で実装したMapReduceを起動させるサーブレットの実装部分を説明します。



【新規開発部分】
・4:StartMapReduceServlet …Servlet
 MapReduceの処理を開始する処理を実装し、Webアクセスで開始できるようにします。

MapReduceを起動するサーブレットを作成します。
こちらを参考に実装しています。
 http://d.hatena.ne.jp/eller/20110403#1301840205



import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.appengine.api.taskqueue.TaskOptions.Method;
・・・
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.InputFormat;
import org.apache.hadoop.mapreduce.Mapper;

/**
* MapReduce開始サーブレット
*/
public class TrainInfoSumMapReduceServlet extends HttpServlet {

 public TrainInfoSumMapReduceServlet() {}

 private String generateHtml(String configXml) {
  return "Success!など";
 }

 // cronによる起動なのでgetにしておく
 @Override
 public void doGet(HttpServletRequest req,
   HttpServletResponse resp) {

  // Hadoopの設定情報インスタンス
  Configuration conf = new Configuration(false);
  try {

   // 1.Mapperの指定
   conf.setClass("mapreduce.map.class",
     TrainInfoDataRailMapper.class,Mapper.class);

   // 2. Inputの型とエンティティクラス(テーブル)の指定
   conf.setClass("mapreduce.inputformat.class",
     DatastoreInputFormat.class, InputFormat.class);
   conf.set(DatastoreInputFormat.ENTITY_KIND_KEY,
     "TrainInfo");

   // 3. Reducerとなるサーブレットの指定
   conf.set(AppEngineJobContext.DONE_CALLBACK_URL_KEY,
     "/reducer/callback");

   // 4. MapReduceの定義情報をxmlに変換
   String xml = ConfigurationXmlUtil
     .convertConfigurationToXml(conf);

   // 5. MapReduce開始URLへのPOST処理をキューにつめる
   Queue queue = QueueFactory.getDefaultQueue();
   TaskOptions task = TaskOptions.Builder.withDefaults().url(
     "/mapreduce/start").method(Method.POST)
     .param("configuration", xml);
   queue.add(task);

   // 6. 戻りは関係ないのでなんでもいい
   String html = generateHtml(ConfigurationXmlUtil
     .convertConfigurationToXml(conf));
   PrintWriter pw = new PrintWriter(resp.getOutputStream());
   pw.println(html);
   pw.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}



1. Mapperの指定
 第2引数の「TrainInfoDataRailMapper.class」の部分を利用するMapperクラスに指定

2. Inputの型とエンティティクラス(テーブル)の指定
 GoogleAppEngineのデータストアから取得する場合、InputFormatをDatastoreInputFormatに指定します。
  conf.setClass("mapreduce.inputformat.class",
    DatastoreInputFormat.class, InputFormat.class);
 データストアのエンティティ名(クラス名)を第2引数で指定します。
  conf.set(DatastoreInputFormat.ENTITY_KIND_KEY, "TrainInfo");
   
3. Reducerとなるサーブレットの指定
 第1引数にAppEngineJobContext.DONE_CALLBACK_URL_KEY、第2引数にweb.xmlで設定したReducerサーブレットのUR
Lを設定します。

4. MapReduceの定義情報をxmlに変換
 このサーブレットがMapReduceを実行するのではなく、appengine-mapreduceが提供している
  com.google.appengine.tools.mapreduce.MapReduceServlet
 がMapReduceの処理を開始します。
 1.~3.で設定したMapRedeuceの定義情報はXMLに変換してこのサーブレットのPOST引数で渡します。

5. MapReduce開始URLに4.の定義XMLでPOSTする処理をキューにつめる
 今回はappengine-mapreduceの起動は、web.xmlにて"/mapreduce/start"に設定しています。
 4.のXMLをPOST引数で渡すとMapReduce処理が開始されます。
 このサーブレット内部でHTTP通信で呼び出すと、MapReduceの処理が終わるまでこのサーブレット処理も終わらないので、GoogleAppEngine上のQueueを経由することで非同期処理としてMapReduce処理につなげます。




【web.xmlの設定】


<!-- MapReduce -->

<!-- 1. appengine-mapreduceの処理サーブレット定義 -->  
<servlet>
 <servlet-name>mapreduce</servlet-name>
 <servlet-class>
  com.google.appengine.tools.mapreduce.MapReduceServlet
 </servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>mapreduce</servlet-name>
 <url-pattern>/mapreduce/*</url-pattern>
</servlet-mapping>

<!-- 2. MapReduce開始サーブレット定義 -->  
<servlet>
 <servlet-name>trainInfoMapReduce</servlet-name>
 <servlet-class>
  traininfo.mapreduce.TrainInfoSumMapReduceServlet
 </servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>trainInfoMapReduce</servlet-name>
 <url-pattern>/startMapReduce/*</url-pattern>
</servlet-mapping>

<!-- 3. Reducerサーブレット定義 -->  
<servlet>
 <servlet-name>trainInfoSumStore</servlet-name>
 <servlet-class>
  traininfo.mapreduce.TrainInfoSumStoreServlet
 </servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>trainInfoSumStore</servlet-name>
 <url-pattern>/reducer/*</url-pattern>
</servlet-mapping>

<!-- 4. 重要!セキュリティ制限 -->  
<security-constraint>
 <web-resource-collection>
  <url-pattern>/mapreduce/*</url-pattern>
  <url-pattern>/startMapReduce/*</url-pattern>
  <url-pattern>/reducer/*</url-pattern>
 </web-resource-collection>
 <auth-constraint>
  <role-name>admin</role-name>
 </auth-constraint>
</security-constraint>



1. appengine-mapreduceの処理サーブレット定義
 appengine-mapreduceのサンプル定義をそのままコピーします。
 MapReduce開始サーブレットの5. MapReduce開始URLと合わせる必要があります。

2. MapReduce開始サーブレット定義
 cron.xmlにてURLを指定するので、そちらと合わせる必要があります。

3. Reducerサーブレット定義
 MapReduce開始サーブレットの3. Reducerとなるサーブレットの指定と合わせる必要があります。

4. 重要!セキュリティ制限
 1.や2.や3.は外部からアクセスされると困るURLになります。
 これを管理者権限がないとアクセスできないように指定します。
 サンプルでは「/mapreduce/*」「/startMapReduce/*」「/reducer/*」になります。
 ※ただし、このセキュリティ制限を指定すると、ローカルでEclipseをデバッグ実行した場合にログインできなくなりました。この設定はローカルでアプリの動作の確認ができた後で設定すべき部分ですね。

次は、MapReduceの処理が日次で実行されるようにcronを設定します。
【GAEでMapReduceを使おう!】実装編5:cronで日次処理にする



ここで実装したアプリはこちら
 ・日別の報告数と路線数のグラフ
 ・日別時刻別の報告数集計表



【GAEでMapReduceを使おう!】GAEの制約とMapReduceの活用
【GAEでMapReduceを使おう!】環境準備編
【GAEでMapReduceを使おう!】実装編1:追加開発部分
【GAEでMapReduceを使おう!】実装編2:モデルの実装
【GAEでMapReduceを使おう!】実装編3:MapperとReducerの実装
【GAEでMapReduceを使おう!】実装編4:MapReduce起動サーブレットとweb.xml
【GAEでMapReduceを使おう!】実装編5:cronで日次処理にする
【GAEでMapReduceを使おう!】管理コンソールでMapReduce状況を確認する
【GAEでMapReduceを使おう!】MapReduceを使ってみた感想
【GAEでMapReduceを使おう!】JavaでのShardの増やし方
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

toronic

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

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

この人とブロともになる

メールフォーム

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

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