Apologies, I should have mentioned I do not see a ConnectionLossException in
any log files. This lack of the described exception made me think I had a
different problem.
The teeny weeny stack trace I get just shows that the 'closed' field in the
'HConnectionManager' class is set to false.
java.io.IOException:
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation@18862d13
closed
at
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:567)
at
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:555)
at org.apache.hadoop.hbase.client.HTable.<init>(HTable.java:171)'
Tracing through the logs and code I found a workaround whereby I should no
longer reuse the same HBaseConfiguration/Configuration instance throughout
my test suite. Previously, with HBase 0.20.4 I just created one instance
of HBaseConfiguration and used this in ctors when creating HTable
instances.
My first attempt at a fix was to use a new instance of HBaseConfiguration
every time I created an instance of HTable. This caused OutOfMemoryError
exceptions to be thrown part way through my test suite.
To get my test suite working again I have now coded the following solution
which is less than ideal in that normal, predictable logic involves catching
an exception,
HTable htable = null;
try {
htable = new HTable(conf, tableName);
}
catch (IOException) {
conf = new HBaseConfiguration.create(conf);
htable = new HTable(conf, tableName);
}
It appears to me that some change in the behavior under the covers of map
reduce jobs is now forcing me to recreate, rather than reuse, instances
created by HBaseConfiguration.
Oh well, at least my code is working in this area, onto the next breaking
change :)