Uploaded image for project: 'HBase'
  1. HBase
  2. HBASE-1064

HBase REST xml/json improvements

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 0.20.0
    • REST
    • None

    Description

      I've begun work on creating a REST based interface for HBase that can use both JSON and XML and would be extensible enough to add new formats down the road. I'm at a point with this where I would like to submit it for review and to get feedback as I continue to work towards new features.

      Attached to this issue you will find the patch for the changes to this point along with a necessary jar file for the JSON serialization. Also below you will find my notes on how to use what is finished with the interface to this point.

      This patch is based off of jira issues:
      HBASE-814 and HBASE-815

      I am interested on gaining feedback on:
      -what you guys think works
      -what doesn't work for the project
      -anything that may need to be added
      -code style
      -anything else...

      Finished components:
      -framework around parsing json/xml input
      -framework around serialzing xml/json output
      -changes to exception handing
      -changes to the response object to better handle the serializing of output data
      -table CRUD calls
      -Full table fetching
      -creating/fetching scanners

      TODO:
      -fix up the filtering with scanners
      -row insert/delete operations
      -individual row fetching
      -cell fetching interface
      -scanner use interface

      Here are the wiki(ish) notes for what is done to this point:
      REST Service for HBASE Notes:

      GET /
      -retrieves a list of all the tables with their meta data in HBase
      curl -v -H "Accept: text/xml" -X GET -T - http://localhost:60050/

      curl -v -H "Accept: application/json" -X GET -T - http://localhost:60050/

      POST /
      -Create a table
      curl -H "Content-Type: text/xml" -H "Accept: text/xml" -v -X POST -T - http://localhost:60050/newTable
      <table>
      <name>test14</name>
      <columnfamilies>
      <columnfamily>
      <name>subscription</name>
      <max-versions>2</max-versions>
      <compression>NONE</compression>
      <in-memory>false</in-memory>
      <block-cache>true</block-cache>
      </columnfamily>
      </columnfamilies>
      </table>

      Response:
      <status><code>200</code><message>success</message></status>

      JSON:
      curl -H "Content-Type: application/json" -H "Accept: application/json" -v -X POST -T - http://localhost:60050/newTable
      {"name":"test5", "column_families":[

      { "name":"columnfam1", "bloomfilter":true, "time_to_live":10, "in_memory":false, "max_versions":2, "compression":"", "max_value_length":50, "block_cache_enabled":true }

      ]}

      NOTE this is an enum defined in class HColumnDescriptor.CompressionType

      GET /[table_name]
      -returns all records for the table
      curl -v -H "Accept: text/xml" -X GET -T - http://localhost:60050/tablename
      curl -v -H "Accept: application/json" -X GET -T - http://localhost:60050/tablename

      GET /[table_name]

      -Parameter Action
      metadata - returns the metadata for this table.
      regions - returns the regions for this table

      curl -v -H "Accept: text/xml" -X GET -T - http://localhost:60050/pricing1?action=metadata

      Update Table
      PUT /[table_name]
      -updates a table
      curl -v -H "Content-Type: text/xml" -H "Accept: text/xml" -X PUT -T - http://localhost:60050/pricing1
      <columnfamilies>
      <columnfamily>
      <name>subscription</name>
      <max-versions>3</max-versions>
      <compression>NONE</compression>
      <in-memory>false</in-memory>
      <block-cache>true</block-cache>
      </columnfamily>
      <columnfamily>
      <name>subscription1</name>
      <max-versions>3</max-versions>
      <compression>NONE</compression>
      <in-memory>false</in-memory>
      <block-cache>true</block-cache>
      </columnfamily>
      </columnfamilies>

      curl -v -H "Content-Type: application/json" -H "Accept: application/json" -X PUT -T - http://localhost:60050/pricing1
      {"column_families":[

      { "name":"columnfam1", "bloomfilter":true, "time_to_live":10, "in_memory":false, "max_versions":2, "compression":"", "max_value_length":50, "block_cache_enabled":true }

      ,

      { "name":"columnfam2", "bloomfilter":true, "time_to_live":10, "in_memory":false, "max_versions":2, "compression":"", "max_value_length":50, "block_cache_enabled":true }

      ]}

      Delete Table
      curl -v -H "Content-Type: text/xml" -H "Accept: text/xml" -X DELETE -T - http://localhost:60050/TEST16

      creating a scanner
      curl -v -H "Content-Type: application/json" -H "Accept: application/json" -X POST -T - http://localhost:60050/TEST16?action=newscanner

      //TODO fix up the scanner filters.

      response:
      xml:
      <scanner>
      <id>
      2
      </id>
      </scanner>

      json:

      {"id":1}

      Using a scanner
      curl -v -H "Content-Type: application/json" -H "Accept: application/json" -X POST -T - "http://localhost:60050/TEST16?action=scan&scannerId=<scannerID>&numrows=<num rows to return>"

      This would be my first submission to an open source project of this size, so please, give it to me rough. =)

      Thanks.

      Attachments

        1. AgileJSON.jar
          66 kB
          Brian Beggs
        2. hbase-1064-patch-v2.patch
          268 kB
          Brian Beggs
        3. hbase-1064-patch-v3.patch
          265 kB
          Brian Beggs
        4. hbase-1064-patch-v4.patch
          270 kB
          Brian Beggs
        5. json2.jar
          101 kB
          Brian Beggs
        6. RESTPatch-pass1.patch
          222 kB
          Brian Beggs
        7. REST-Upgrade-Notes.txt
          5 kB
          Brian Beggs

        Activity

          People

            Unassigned Unassigned
            macdiesel Brian Beggs
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: