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