I’ve recently released a simple json-rpc query bridge (using our own simple json-rpc framework) for HBase at http://code.google.com/p/hbasebridge/
You can use this bridge to query HBase for either the current record or the last few versions of a record.
To see the methods
http://localhost:8080/hbasebridge/rpc?debug=true
Which returns a list of usable RPC methods:
{ "jsonrpc": "2.0", "result": {"method": [ { "class": "com.werxltd.hbasebridge.HBaseInfo", "name": "listtables", "params": [], "returns": "org.json.JSONObject", "static": false }, { "class": "com.werxltd.hbasebridge.HadoopInfo", "name": "clusterstatus", "params": [], "returns": "org.json.JSONObject", "static": false }, { "class": "com.werxltd.hbasebridge.HadoopInfo", "name": "jobstatus", "params": [], "returns": "org.json.JSONObject", "static": false }, { "class": "com.werxltd.jsonrpc.RPC", "name": "listrpcmethods", "params": [], "returns": "org.json.JSONObject", "static": false }, { "class": "com.werxltd.hbasebridge.TableLookup", "name": "lookup", "params": ["org.json.JSONObject"], "returns": "org.json.JSONObject", "static": false } ]} }
To list tables:
http://localhost:8080/hbasebridge/rpc?debug=true&method=listtables
Which returns:
{ "jsonrpc": "2.0", "result": {"tables": [ "mytable" ]} }
To get the current status of the cluster:
http://localhost:8080/hbasebridge/rpc?debug=true&method=clusterstatus
Which returns:
{ "jsonrpc": "2.0", "result": { "activetrackernames": [ "trackernode1:localhost/127.0.0.1:33455", "trackernode2:localhost/127.0.0.1:54616", ], "blacklistedtrackernames": [], "blacklistedtrackers": 0, "jobqueues": {"queues": [{ "jobs": [ { "cleanuptasks": [{"state": ""}], "complete": false, "filename": "hdfs://hadoophdfsnode:9000/data/hadoop/mapred/system/job_201003191557_0442/job.xml", "jobpriority": "normal", "mapprogress": 1, "name": "My mapreduce job", "reduceprogress": 0.9819000363349915, "runstate": "running", "schedulinginfo": "NA", "setupprogress": 1, "starttime": 1269024863960, "username": "hadoop-admin" } ], "name": "default" }]}, "jobtrackerstate": "running", "maptasks": 1, "maxmaptasks": 116, "maxmemory": 2079719424, "maxreducetasks": 58, "reducetasks": 16, "tasktrackers": 34, "ttyexpiryinterval": 600000, "usedmemory": 969170944 } }
Key/Value Query:
http://localhost:8080/hbase_tape/rpc?debug=true&data={"method":"lookup","params":{"table":"tablename","keys":["mykey"]}}
Results:
{ "jsonrpc": "2.0", "result": {"rows": [{"mykey": { "family:col": "myvalue" }}]} }
Key/Value query with versions:
http://localhost:8080/hbase_tape/rpc?debug=true&data={"method":"lookup","params":{"table":"tablename","keys":["mykey"],versions:2}}
Results:
{ "jsonrpc": "2.0", "result": {"rows": [{"mykey": { "family:col": [{ "value": "myval", "version": 123456789 }], "family:col": [{ "value": "myoldval", "version": 123456788 }] }}]} }
The code should also provide a handy reference for anyone who wants to learn how to query HBase and scrape Result objects for values without knowing family or column names in advance.