HttpFSの検証
モバイルアプリからのリクエストをリアルタイムにHadoopに投入する方法を検討しています。
begirama.hatenablog.com MuleのHDFSコネクタを使おうと思ったけど、Mule CEではだめだったので、今回はだめ。
begirama.hatenablog.com WebHDFSはクライアントから個々のデータノードへアクセスさせるので、社外ネットワークに存在するモバイルアプリに対して、すべてのデータノードを公開することはできないのでNG。
HadoopにWebベースでアクセスする方式を検討して丸1日。 HttpFSにたどり着きました。
WebHDFSをインターフェイスを似せてくれているので、WebHDFSをやった後だと理解は楽だった。 結局使わなかったWebHDFSの検証も無駄ではなかったと思いたい・・・。
設定
$HADOOP_HOME/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の所は起動ユーザーです。環境に合わせて書き換える必要があります。
HttpFSの起動
$ $HADOOP_HOME/sbin/httpfs.sh start Setting HTTPFS_HOME: /usr/local/Cellar/hadoop/2.7.1/libexec Setting HTTPFS_CONFIG: /usr/local/Cellar/hadoop/2.7.1/libexec/etc/hadoop Sourcing: /usr/local/Cellar/hadoop/2.7.1/libexec/etc/hadoop/httpfs-env.sh Setting HTTPFS_LOG: /usr/local/Cellar/hadoop/2.7.1/libexec/logs Setting HTTPFS_TEMP: /usr/local/Cellar/hadoop/2.7.1/libexec/temp Setting HTTPFS_HTTP_PORT: 14000 Setting HTTPFS_ADMIN_PORT: 14001 Setting HTTPFS_HTTP_HOSTNAME: Ryohei-no-MacBook-Pro.local Setting HTTPFS_SSL_ENABLED: false Setting HTTPFS_SSL_KEYSTORE_FILE: /Users/rsogo/.keystore Setting HTTPFS_SSL_KEYSTORE_PASS: password Setting CATALINA_BASE: /usr/local/Cellar/hadoop/2.7.1/libexec/share/hadoop/httpfs/tomcat Setting HTTPFS_CATALINA_HOME: /usr/local/Cellar/hadoop/2.7.1/libexec/share/hadoop/httpfs/tomcat Setting CATALINA_OUT: /usr/local/Cellar/hadoop/2.7.1/libexec/logs/httpfs-catalina.out Setting CATALINA_PID: /tmp/httpfs.pid (略)
tomcatが起動します。14000ポートをデフォルトでリッスンするみたいです。
ファイルの作成
使うのはこのファイル。
$ cat sample.txt 1 aaa 2 bbb 3 ccc
WebHDFS同様、ファイルの生成には2回のリクエストが必要です。
$ curl -i -X PUT "http://localhost:14000/webhdfs/v1/hoge?op=create&overwrite=true&user.name=rsogo" HTTP/1.1 307 Temporary Redirect Server: Apache-Coyote/1.1 Set-Cookie: hadoop.auth="u=rsogo&p=rsogo&t=simple&e=1474419838951&s=xlo/gx4W9ABt+0kB7NCLb1xVHFk="; Path=/; Expires= , 21-9-2016 01:03:58 GMT; HttpOnly Location: http://localhost:14000/webhdfs/v1/hoge?op=CREATE&data=true&user.name=rsogo&overwrite=true Content-Type: application/json Content-Length: 0 Date: Tue, 20 Sep 2016 15:03:58 GMT
WebHDFSと違うのは、リダイレクトされるホスト名、ポート番号が変わらないというところ。
ヘッダーに"content-type: application/octet-stream"
を付ける必要がある。付けないと400 Bad Requestが返ってくるよ。
$ curl -i -X PUT "http://localhost:14000/webhdfs/v1/hoge?op=CREATE&data=true&user.name=rsogo&overwrite=true" -T sample.txt --header "content-type: application/octet-stream" HTTP/1.1 100 Continue HTTP/1.1 201 Created Server: Apache-Coyote/1.1 Set-Cookie: hadoop.auth="u=rsogo&p=rsogo&t=simple&e=1474420289696&s=DcQxT8lP7kcCBuBbxaaCKyR5LqM="; Path=/; Expires= , 21-9-2016 01:11:29 GMT; HttpOnly Content-Type: application/json Content-Length: 0 Date: Tue, 20 Sep 2016 15:11:31 GMT
ファイルの確認
$ curl -i "http://localhost:14000/webhdfs/v1/hoge?op=liststatus&user.name=rsogo" HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: hadoop.auth="u=rsogo&p=rsogo&t=simple&e=1474420414909&s=ELbVZf2Fqnyg5v0ohAWraURvTC4="; Path=/; Expires= , 21-9-2016 01:13:34 GMT; HttpOnly Content-Type: application/json Transfer-Encoding: chunked Date: Tue, 20 Sep 2016 15:13:34 GMT {"FileStatuses":{"FileStatus":[{"pathSuffix":"hoge","type":"FILE","length":19,"owner":"rsogo","group":"supergroup","permission":"755","accessTime":1474384290147,"modificationTime":1474384291294,"blockSize":134217728,"replication":1}]}}
ファイルのオープンと読み込み
WebHDFSだと2回に分けて取ってくるけど、1回のリクエストで取ってこれる。
$ curl -i "http://localhost:14000/webhdfs/v1/hoge?op=open&user.name=rsogo" HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: hadoop.auth="u=rsogo&p=rsogo&t=simple&e=1474420480591&s=haNBlr1YEaySxzRQSH/bE2Ed8eg="; Path=/; Expires= , 21-9-2016 01:14:40 GMT; HttpOnly Content-Type: application/octet-stream Content-Length: 19 Date: Tue, 20 Sep 2016 15:14:40 GMT 1 aaa 2 bbb 3 ccc
HttpFSの停止
$ $HADOOP_HOME/sbin/httpfs.sh stop
AppPot経由でHttpFSでREST化したHadoopとやり取りする
GetAnonymouseToken
- GETメソッド
http://localhost:8080/apppot/api/1/apppot.TestApplication/1.0.0/anonymousTokens?appKey=40c71254aca44664b61635573085ef1d&deviceUDID=bd393116-0b47-4b9e-a186-e64ffc0fbdf2
- Response
{ "status": "OK", "errCode": 0, "description": null, "results": "e3b82dd1cd964b76a2ee62c0ec97344f" }
Login
- POSTメソッド
http://localhost:8080/apppot/api/1/apppot.TestApplication/1.0.0/auth/login
- Request
{ "username": "yamada", "password": "12345678@X", "appId": "apppot.TestApplication", "appVersion": "1.0.0", "deviceUDID": "bd393116-0b47-4b9e-a186-e64ffc0fbdf2", "isPush": "false", "companyId": 1 }
- Response
{ "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" } ] } }
ファイルの状態確認
- GETメソッド
http://localhost:8080/apppot/api/1/apppot.TestApplication/1.0.0/gateway/hdfs/hoge?user.name=rsogo&op=liststatus
HttpFSの検証で作ったファイルをAppPot経由で参照することができました。
- Response
{ "status": "OK", "errCode": 0, "description": "", "results": { "hoge": { "FileStatuses": { "FileStatus": [ { "pathSuffix": "hoge", "type": "FILE", "length": 19, "owner": "rsogo", "group": "supergroup", "permission": "755", "accessTime": 1474384290147, "modificationTime": 1474384291294, "blockSize": 134217728, "replication": 1 } ] } } } }
ファイルの作成
- apppot-token: Loginの結果得られたトークン
- Content-Type: application/octet-stream
http://localhost:8080/apppot/api/1/apppot.TestApplication/1.0.0/gateway/hdfs/hoge1?op=CREATE&data=true&user.name=rsogo&overwrite=true
POSTMANを使っていますが、ファイルの添付ができるので、Hadoopに投入したいファイルを選択します。
ファイルの読み込み
http://localhost:8080/apppot/api/1/apppot.TestApplication/1.0.0/gateway/hdfs/hoge1?op=open&user.name=rsogo
{ "status": "OK", "errCode": 0, "description": "", "results": { "hoge1": "aaa,bbb" } }
OK