Calling close on HTable (it's there contrary to your claim) only calls a
flushCommits to ensure no data is kept in the write buffer (not your case).
We added a shutdownHook to make sure that when the JVM exists it closes the
connection to zookeeper.

There is a hard limit of client connection per IP for each member of the
zookeeper quorum, you maybe hitting that limit. From conf/hbase-default.xml:

  <property>
    <name>hbase.zookeeper.property.maxClientCnxns</name>
    <value>30</value>
    <description>Property from ZooKeeper's config zoo.cfg.
    Limit on number of concurrent connections (at the socket level) that a
    single client, identified by IP address, may make to a single member of
    the ZooKeeper ensemble. Set high to avoid zk connection issues running
    standalone and pseudo-distributed.
    </description>
  </property>

You may want to play with that.

J-D

2010/2/5 <y_823...@tsmc.com>

> Hi,
> I didn't see any code about close HTable, just scaner.close.
> Finish running HBase client program in a container then I restart HBase;
> I found there's message zookeeper.ClientCnxn: Server connection successful
> in my
> container console.
> I think that maybe I didn't close that table.
> By adding table.close; I hope that mesage "Server connection successful"
> would not appear again,
> but it's not.
> I guess there are still up to 2000 clients' connection to Hbase without
> closing.
> After that, I can't query data from hbase any more.
> Any suggestions?
>
>
>    HTable table = new HTable(config, "myLittleHBaseTable");
>
>    // To add to a row, use Put.  A Put constructor takes the name of the
> row
>    // you want to insert into as a byte array.  In HBase, the Bytes class
> has
>    // utility for converting all kinds of java types to byte arrays.  In
> the
>    // below, we are converting the String "myLittleRow" into a byte array
> to
>    // use as a row key for our update. Once you have a Put instance, you
> can
>    // adorn it by setting the names of columns you want to update on the
> row,
>    // the timestamp to use in your update, etc.If no timestamp, the server
>    // applies current time to the edits.
>    Put p = new Put(Bytes.toBytes("myLittleRow"));
>
>    // To set the value you'd like to update in the row 'myLittleRow',
> specify
>    // the column family, column qualifier, and value of the table cell
> you'd
>    // like to update.  The column family must already exist in your table
>    // schema.  The qualifier can be anything.  All must be specified as
> byte
>    // arrays as hbase is all about byte arrays.  Lets pretend the table
>    // 'myLittleHBaseTable' was created with a family 'myLittleFamily'.
>    p.add(Bytes.toBytes("myLittleFamily"), Bytes.toBytes("someQualifier"),
>      Bytes.toBytes("Some Value"));
>
>    // Once you've adorned your Put instance with all the updates you want
> to
>    // make, to commit it do the following (The HTable#put method takes the
>    // Put instance you've been building and pushes the changes you made
> into
>    // hbase)
>    table.put(p);
>
>    // Now, to retrieve the data we just wrote. The values that come back
> are
>    // Result instances. Generally, a Result is an object that will package
> up
>    // the hbase return into the form you find most palatable.
>    Get g = new Get(Bytes.toBytes("myLittleRow"));
>    Result r = table.get(g);
>    byte [] value = r.getValue(Bytes.toBytes("myLittleFamily"),
>      Bytes.toBytes("someQualifier"));
>    // If we convert the value bytes, we should get back 'Some Value', the
>    // value we inserted at this location.
>    String valueStr = Bytes.toString(value);
>    System.out.println("GET: " + valueStr);
>
>    // Sometimes, you won't know the row you're looking for. In this case,
> you
>    // use a Scanner. This will give you cursor-like interface to the
> contents
>    // of the table.  To set up a Scanner, do like you did above making a
> Put
>    // and a Get, create a Scan.  Adorn it with column names, etc.
>    Scan s = new Scan();
>    s.addColumn(Bytes.toBytes("myLittleFamily"),
> Bytes.toBytes("someQualifier"));
>    ResultScanner scanner = table.getScanner(s);
>    try {
>      // Scanners return Result instances.
>      // Now, for the actual iteration. One way is to use a while loop like
> so:
>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
>        // print out the row we found and the columns we were looking for
>        System.out.println("Found row: " + rr);
>      }
>
>      // The other approach is to use a foreach loop. Scanners are
> iterable!
>      // for (Result rr : scanner) {
>      //   System.out.println("Found row: " + rr);
>      // }
>    } finally {
>      // Make sure you close your scanners when you are done!
>      // Thats why we have it inside a try/finally clause
>      scanner.close();
>    }
>
>
>
>
>
> Fleming Chiu(邱宏明)
> 707-6128
> y_823...@tsmc.com
> 週一無肉日吃素救地球(Meat Free Monday Taiwan)
>
>
>
>  ---------------------------------------------------------------------------
>                                                         TSMC PROPERTY
>  This email communication (and any attachments) is proprietary information
>  for the sole use of its
>  intended recipient. Any unauthorized review, use or distribution by anyone
>  other than the intended
>  recipient is strictly prohibited.  If you are not the intended recipient,
>  please notify the sender by
>  replying to this email, and then delete this email and any copies of it
>  immediately. Thank you.
>
>  ---------------------------------------------------------------------------
>
>
>
>

Reply via email to