[
https://issues.apache.org/jira/browse/HADOOP-2068?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
stack updated HADOOP-2068:
--------------------------
Attachment: rest.patch
First cut at RESTful interface. Implements metainfo, gets, and scanners. Does
not yet support put. Bunch of TODOs:
+ Returning results multipart/related is crippled by lack of support in the
container; jetty has a MultipartResponse class but can't set properly qualified
Content-Type with boundary and start parameters... they get stripped. Need to
figure out how to fix this (maybe jetty 6 does it better).
+ Need to agree on timestamp format to use (ISO8601?)
+ Need to fix HTable so it has table metadata; until then, you need to specify
a column getting a scanner.
Here's some samples run against a simple table named 'x' with column family
'x:' with following contents:
{code}
Hbase> select * from x;
+-------------------------+-------------------------+-------------------------+
| Row | Column | Cell |
+-------------------------+-------------------------+-------------------------+
| x | x: | xyz |
+-------------------------+-------------------------+-------------------------+
| xyz | x:abc | abc |
+-------------------------+-------------------------+-------------------------+
| xyz | x:xyz | xyzxyz |
+-------------------------+-------------------------+-------------------------+
3 row(s) in set (0.19 sec)
{code}
In below session I'm using curl. Doesn't have DELETE and I fake PUT with the
-T option uploading a file:
{code}
$ curl http://localhost:60010/api/
<?xml version="1.0" encoding="UTF-8"?>
<tables>
<table>
x
</table>
$ curl --header 'Accept: text/plain' http://localhost:60010/api/
x
$ curl --header 'Accept: text/plain' http://localhost:60010/api/x
name: x, families: {x:={name: x, max versions: 3, compression: NONE, in memory:
false, max length: 2147483647, bloom filter: none}}
$ curl --header 'Accept: text/xml' http://localhost:60010/api/x
<?xml version="1.0" encoding="UTF-8"?>
<table>
<name>
x
</name>
<columnfamilies>
<columnfamily>
<name>
x:
</name>
<compression>
NONE
</compression>
<bloomfilter>
NONE
</bloomfilter>
<max-versions>
3
</max-versions>
<maximum-cell-size>
2147483647
</maximum-cell-size>
</columnfamily>
</columnfamilies>
</table>
$ curl --header 'Accept: text/xml' http://localhost:60010/api/x/regions
<?xml version="1.0" encoding="UTF-8"?>
<regions>
<region/>
# only one region and its start key is null, the default table start key
$ curl --verbose --header 'Accept: text/xml'
http://localhost:60010/api/x/scanner
* About to connect() to localhost port 60010
* Trying ::1... * connected
* Connected to localhost (::1) port 60010
> GET /api/x/scanner HTTP/1.1
User-Agent: curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7l
zlib/1.2.3
Host: localhost:60010
Pragma: no-cache
Accept: text/xml
< HTTP/1.1 404 No+handler
< Date: Mon, 19 Nov 2007 23:22:23 GMT
< Server: Jetty/5.1.4 (Mac OS X/10.4.10 i386 java/1.5.0_07
< Content-Type: text/html
< Content-Length: 1228
<html>
<head>
<title>Error 404 No handler</title>
</head>
<body>
...
# Fails because currently you must specify a column name (To be fixed)
$ curl --verbose --header 'Accept: text/xml' -T /tmp/diff.txt
http://localhost:60010/api/x/scanner?column=x:
* About to connect() to localhost port 60010
* Trying ::1... * connected
* Connected to localhost (::1) port 60010
> PUT /api/x/scanner?column=x: HTTP/1.1
User-Agent: curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7l
zlib/1.2.3
Host: localhost:60010
Pragma: no-cache
Accept: text/xml
Content-Length: 7096
Expect: 100-continue
< HTTP/1.1 100 Continue
< HTTP/1.1 201 Created
< Date: Mon, 19 Nov 2007 23:23:33 GMT
< Server: Jetty/5.1.4 (Mac OS X/10.4.10 i386 java/1.5.0_07
< Location: //api /x/scanner/88316f77
< Content-Length: 0
* Connection #0 to host localhost left intact
* Closing connection #0
$ curl --verbose --header 'Accept: text/xml' -T /tmp/diff.txt
http://localhost:60010/api/x/scanner/88316f77
* About to connect() to localhost port 60010
* Trying ::1... * connected
* Connected to localhost (::1) port 60010
> PUT /api/x/scanner/88316f77 HTTP/1.1
User-Agent: curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7l
zlib/1.2.3
Host: localhost:60010
Pragma: no-cache
Accept: text/xml
Content-Length: 7096
Expect: 100-continue
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Mon, 19 Nov 2007 23:23:56 GMT
< Server: Jetty/5.1.4 (Mac OS X/10.4.10 i386 java/1.5.0_07
< Content-Type: text/xml;charset=UTF-8
< Transfer-Encoding: chunked
<?xml version="1.0" encoding="UTF-8"?>
<row>
<name>
x
</name>
<timestamp>
1195372581842
</timestamp>
<column>
<name>
x:
</name>
<value>
eHl6
</value>
</column>
* Connection #0 to host localhost left intact
* Closing connection #0
</row>
$ curl --verbose --header 'Accept: multipart/related' -T /' -T /tmp/diff.txt
http://localhost:60010/api/x/scanner/88316f77
* About to connect() to localhost port 60010
* Trying ::1... * connected
* Connected to localhost (::1) port 60010
> PUT /api/x/scanner/88316f77 HTTP/1.1
User-Agent: curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7l
zlib/1.2.3
Host: localhost:60010
Pragma: no-cache
Accept: multipart/related
Content-Length: 7096
Expect: 100-continue
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Mon, 19 Nov 2007 23:24:26 GMT
< Server: Jetty/5.1.4 (Mac OS X/10.4.10 i386 java/1.5.0_07
< Content-Type: multipart/related
< Content-Length: 814
--org.mortbay.http.MultiPartResponse.boundary.f97mkcfm
Content-Type: application/octet-stream
Content-Description: row
Content-Transfer-Encoding: binary
Content-Length: 3
xyz
--org.mortbay.http.MultiPartResponse.boundary.f97mkcfm
Content-Type: application/octet-stream
Content-Description: timestamp
Content-Transfer-Encoding: binary
Content-Length: 13
1195372609009
--org.mortbay.http.MultiPartResponse.boundary.f97mkcfm
Content-Type: application/octet-stream
Content-Description: x:abc
Content-Transfer-Encoding: binary
Content-Length: 3
abc
--org.mortbay.http.MultiPartResponse.boundary.f97mkcfm
Content-Type: application/octet-stream
Content-Description: x:xyz
Content-Transfer-Encoding: binary
Content-Length: 6
xyzxyz
--org.mortbay.http.MultiPartResponse.boundary.f97mkcfm--
* Connection #0 to host localhost left intact
* Closing connection #0
$ curl --verbose --header 'Accept: multipart/related'
http://localhost:60010/api/x/row/x
* About to connect() to localhost port 60010
* Trying ::1... * connected
* Connected to localhost (::1) port 60010
> GET /api/x/row/x HTTP/1.1
User-Agent: curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7l
zlib/1.2.3
Host: localhost:60010
Pragma: no-cache
Accept: multipart/related
< HTTP/1.1 200 OK
< Date: Mon, 19 Nov 2007 23:24:55 GMT
< Server: Jetty/5.1.4 (Mac OS X/10.4.10 i386 java/1.5.0_07
< Content-Type: multipart/related
< Content-Length: 240
--org.mortbay.http.MultiPartResponse.boundary.f97mkyj8
Content-Type: application/octet-stream
Content-Description: x:
Content-Transfer-Encoding: binary
Content-Length: 3
xyz
--org.mortbay.http.MultiPartResponse.boundary.f97mkyj8--
* Connection #0 to host localhost left intact
* Closing connection #0
$ curl --verbose --header http://localhost:60010/api/x/row/x
curl: no URL specified!
curl: try 'curl --help' or 'curl --manual' for more information
durruti:~/Documents/checkouts/hadoop-trunk stack$ curl --verbose
http://localhost:60010/api/x/row/x
* About to connect() to localhost port 60010
* Trying ::1... * connected
* Connected to localhost (::1) port 60010
> GET /api/x/row/x HTTP/1.1
User-Agent: curl/7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7l
zlib/1.2.3
Host: localhost:60010
Pragma: no-cache
Accept: */*
< HTTP/1.1 200 OK
< Date: Mon, 19 Nov 2007 23:25:22 GMT
< Server: Jetty/5.1.4 (Mac OS X/10.4.10 i386 java/1.5.0_07
< Content-Type: text/xml;charset=UTF-8
< Transfer-Encoding: chunked
<?xml version="1.0" encoding="UTF-8"?>
<row>
<column>
<name>
x:
</name>
<value>
eHl6
</value>
</column>
* Connection #0 to host localhost left intact
* Closing connection #0
</row>
{code}
> [hbase] RESTful interface
> -------------------------
>
> Key: HADOOP-2068
> URL: https://issues.apache.org/jira/browse/HADOOP-2068
> Project: Hadoop
> Issue Type: New Feature
> Components: contrib/hbase
> Reporter: stack
> Priority: Minor
> Attachments: rest.patch
>
>
> A RESTful interface would be one means of making hbase accessible to clients
> that are not java. It might look something like the below:
> + An HTTP GET of http://MASTER:PORT/ outputs the master's attributes: online
> meta regions, list of tables, etc.: i.e. what you see now when you go to
> http://MASTER:PORT/master.jsp.
> + An HTTP GET of http://MASTER:PORT/TABLENAME: 200 if tables exists and
> HTableDescription (mimetype: text/plain or text/xml) or 401 if no such table.
> HTTP DELETE would drop the table. HTTP PUT would add one.
> + An HTTP GET of http://MASTER:PORT/TABLENAME/ROW: 200 if row exists and 401
> if not.
> + An HTTP GET of http://MASTER:PORT/TABLENAME/ROW/COLUMNFAMILY:
> HColumnDescriptor (mimetype: text/plain or text/xml) or 401 if no such table.
> + An HTTP GET of http://MASTER:PORT/TABLENAME/ROW/COLUMNNAME/: 200 and latest
> version (mimetype: binary/octet-stream) or 401 if no such cell. HTTP DELETE
> would delete the cell. HTTP PUT would add a new version.
> + An HTTP GET of http://MASTER:PORT/TABLENAME/ROW/COLUMNNAME/TIMESTAMP: 200
> (mimetype: binary/octet-stream) or 401 if no such cell. HTTP DELETE would
> remove. HTTP PUT would put this record.
> + Browser originally goes against master but master then redirects to the
> hosting region server to serve, update, delete, etc. the addressed cell
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.