• Top
  • > Blog
  • > AppPotのGateway機能でHadoopに接続
2016/09/21 Enterprise BaaS製品“AppPot”, MBaaS, MEAP

AppPotのGateway機能でHadoopに接続

こんにちは、AppPotのプロダクトマネージャの十川です。

AppPotにはGatewayという「AppPotを経由して、他のシステムへ接続」する機能があります。今回は、Gateway機能を利用して、モバイルアプリなどからのリクエストをHadoopに連携する手順を書いてみたいと思います。

Gateway機能が提供する機能

  • リクエストが認証済みであるかの確認
  • AppPot管理画面で設定されたサービスの定義に基づいたルーティング

    Gateway自体はルーティングに特化しており、メッセージの変換や、データベースなどに接続するような場合にはMuleのアダプタと組み合わせて使います。

    今回、採用したのは次のような構成です。
    AppPot-HttpFS-Hadoop

    HttpFSはhadoopが提供しているHDFSにRESTベースのAPIでアクセスするための仕組みです。
    HttpFSのマニュアル

    同じような仕組みでWebHDFSというものもありますが、WebHDFSはデータ生成や、取得の際にnamenodeに一旦アクセスし、個別のdatanodeにリダイレクトされるアクセス方式になっています。そのため、クライアントアプリにdatanodeのサーバーを意識させたくない今回のようなケースには向きません。

    HttpFSはそのあたりをすべて吸収してくれて、AppPotからはHttpFSにさえアクセスできれば良いので、今回のようなアーキテクチャには向いています。

    手順としては次のようになります。

    • 1. Hadoopのセットアップ
    • 2. Hadoopの起動
    • 3. HttpFSの起動
    • 4. AppPot管理画面でサービスの設定
    • 5. クライアントからデータの生成
    • 6. クライアントからデータの取得

    1. Hadoopのセットアップ

    各環境に合わせてHadooopをセットアップや、設定ファイルの変更を行って下さい。
    詳細な手順はここでは省略しますが、ご参考までにhdfs-site.xml、core-site.xmlの設定例を記載します。

    $ cat $HADOOP_HOME/etc/hadoop/hdfs-site.xml 
     <?xml version="1.0" encoding="UTF-8"?>
     <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
     <configuration>
         <property>
             <name>dfs.replication</name>
             <value>1</value>
         </property>
     </configuration>
    
    $ cat etc/hadoop/core-site.xml 
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
        <property>
           <name>fs.defaultFS</name>
           <value>hdfs://localhost:9000</value>
        </property>
        <property>
           <name>hadoop.proxyuser.rsogo.hosts</name>
           <value>localhost</value>
        </property>
        <property>
           <name>hadoop.proxyuser.rsogo.groups</name>
           <value>*</value>
        </property>
        <property>
           <name>doop.job.ugi</name>
           <value>rsogo,staff</value>
        </property>
    </configuration>
    

    * rsogoは私のローカル環境のhadoopの実行ユーザーなので各環境に合わせて、変更して下さい。

    2. Hadoopの起動

    $HADOOP_HOME/sbin/start-all.sh

    停止はstop-all.shで行えます。

    3. HttpFSの起動

    $HADOOP_HOME/sbin/httpfs.sh start

    停止はhttpfs.sh stopで行えます。

    4. AppPot管理画面でサービスの設定

    AppPotの管理画面でHttpFSへのルーティングの設定を行います。
    20160921004308

  • サービス名: クライアントから指定する任意の名前。ここでは「hdfs」としています
  • プロトコル: 今回はHttpFSがhttpで動作しているので「http」を選択
  • ホスト名: HttpFSをAppPotと同じ環境で動作させているため「localhost」
  • ポート: HttpFSがリッスンしているポート「14000」
  • アプリ: サービスを利用していアプリを選択

    5. クライアントからの呼び出し確認

    Gateway APIを使用するためには匿名トークン(AnonymousToken)と、ユーザートークン(UserToken)を取得する必要があります。

    5.1. 匿名トークンの取得

    リクエストURL
    GETメソッドで以下のURLにアクセス
    http://localhost:8080/apppot/api/{CompanyId}/{AppId}/{AppVersion}/anonymousTokens?appKey={管理画面でアプリ作成時に発行されたAppKey}

    応答メッセージ

    {
      "status": "OK",
      "errCode": 0,
      "description": null,
      "results": "e3b82dd1cd964b76a2ee62c0ec97344f"
    }
    

    “e3b82dd1cd964b76a2ee62c0ec97344f”の部分が匿名トークンです。

    5.2. ユーザー認証(ユーザートークンの取得)

    リクエストURL
    POSTメソッドで以下のURLにアクセス
    http://localhost:8080/apppot/api/{CompanyId}/{AppId}/{AppVersion}/auth/login

    ヘッダー

  • Content-Type: application/json
  • apppot-token: 先程取得した匿名トークンを設定します
  • {
      "username": "yamada",
      "password": "12345678@X",
      "appId": "apppot.TestApplication",
      "appVersion": "1.0.0",
      "deviceUDID": "bd393116-0b47-4b9e-a186-e64ffc0fbdf2",
      "isPush": "false",
      "companyId": 1
    }
    

    応答メッセージ

    {
      "status": "OK",
      "errCode": 0,
      "description": null,
      "apppotInfo": "AppPot Server 2.3.6 ",
      "authInfor": {
        "userTokens": "e0f08ddd14d3496d978afdb3530fe64f",
        "validTime": 1474388126575,
        "userId": 2,
        "userInfo": {
          "account": "yamada",
          "firstName": "太郎",
          "lastName": "山田"
        },
        "groupsAndRoles": [
          {
            "groupId": 1,
            "groupName": "開発グループ",
            "description": "",
            "roleId": 2,
            "roleName": "Super Admin"
          }
        ]
      }
    }
    

    5.3. クライアントからのデータの生成

    リクエストURL
    PUTメソッドで以下のURLにアクセス
    http://localhost:8080/apppot/api/{CompanyId}/{AppId}/{AppVersion}/gateway/hdfs/hoge1?op=CREATE&data=true&user.name=rsogo&overwrite=true

    * URLに含まれるhdfsというのが、先程管理画面で定義したサービス名です
    * hoge1は今回作成するファイル名。
    * opは操作名。今回はファイル生成なのでCREATE
    * user.nameはファイルオーナー

    ヘッダー

  • Content-Type: application/octet-stream
  • apppot-token: ユーザートークン
  • 今回、クライアントはPOSTMANを使っています。HDFSに送信したいファイルを添付します。

    20160921011546

    送信しているファイルの中身はこのようなものです。

    "aaa,bbb"
    

    応答メッセージ

    {
      "status": "OK",
      "errCode": 0,
      "description": ""
    }
    

    5.4. クライアントからデータの取得

    リクエストURL
    GETメソッドで以下のURLにアクセス
    http://localhost:8080/apppot/api/{CompanyId}/{AppId}/{AppVersion}/gateway/hdfs/hoge1?op=open&user.name=rsogo

    ヘッダー

  • apppot-token: ユーザートークン
  • 応答メッセージ

    {
      "status": "OK",
      "errCode": 0,
      "description": "",
      "results": {
        "hoge1": "aaa,bbb"
      }
    }
    

    先程送信したファイルの中身が取得できていることがわかります。

    以上となります。
    AppPotのGateway機能を利用することで、Hadoopなど社内に配置したシステムに対してモバイルアプリなどの外部アプリからAPIで簡単にアクセスできることをおわかりいただけたでしょうか。

    AppPotの製品ページは下のバナーをクリックしてください。AppPot_banner02

    記事一覧へ