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. > > --------------------------------------------------------------------------- > > > >