You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@hbase.apache.org by Tom Nichols <tm...@gmail.com> on 2009/02/02 18:07:14 UTC

NPE from HConnectionManager

Hi,

I am using the HBase client API in from a Groovy script:

import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.HBaseAdmin
println new HBaseAdmin( new HBaseConfiguration() )

The script works fine if run standalone, but if I run it as an embeded
ant task, I get the following exception:

java.lang.NullPointerException
        at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768)
        at org.apache.hadoop.hbase.client.HConnectionManager.getConnection(HConnectionManager.java:90)
        at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:66)
        at com.enernoc.rnd.shredder.core.groovy.HBaseBuilder.getAdmin(HBaseBuilder.java:530)
        at com.enernoc.rnd.shredder.core.groovy.HBaseBuilder.create(HBaseBuilder.java:229)


Looking into the code:
86 : 	  	  	 public static HConnection getConnection(HBaseConfiguration conf) {
87 : 	  	  	TableServers connection;
88 : 	  	  	synchronized (HBASE_INSTANCES) {
89 : 	  	  	String instanceName = conf.get(HBASE_DIR);
90 : 	  	  	connection = HBASE_INSTANCES.get(instanceName);

It means that either "instanceName" is null, or HBASE_INSTANCES is
null.  I am guessing it is the former since the previous line is
retrieving that value.   So can anyone guess why this would fail?  The
HBase JAR is on my classpath, which contains the hbase-default.xml
config file (which has the hbase.rootdir value).

Furthermore, it appears that the value "hbase.rootdir" is a server
configuration to tell the HBase server where the data is stored --
correct?  So if I am just using the client api (i.e. to connect to a
running HBase server instance,) why would the client be attempting to
directly access the data files rather than going through the server
connection?  Or am I confused about how the HBase API works?

Thanks in advance for the help.

-Tom

Re: NPE from HConnectionManager

Posted by stack <st...@duboce.net>.
Thanks for updating the list Tom.
St.Ack

On Mon, Feb 2, 2009 at 10:35 AM, Tom Nichols <tm...@gmail.com> wrote:

> Well after digging (and digging... and digging some more) it turns out
> the source of the problem is in the Groovy Ant task.  Rather, the fact
> that ....hbase.Configuration uses the
> Thread.getCurrentThread().getContextClassloader(), which the Groovy
> Ant task leaves as the system classpath, as opposed to the <groovy
> classpathref='_____'> value.  So none of the HBase JARs were available
> to that classloader...  Which is why HBase couldn't find
> hbase-default.xml or hbase-site.xml.
>
>
>
> On Mon, Feb 2, 2009 at 12:07 PM, Tom Nichols <tm...@gmail.com> wrote:
> > Hi,
> >
> > I am using the HBase client API in from a Groovy script:
> >
> > import org.apache.hadoop.hbase.HBaseConfiguration
> > import org.apache.hadoop.hbase.client.HBaseAdmin
> > println new HBaseAdmin( new HBaseConfiguration() )
> >
> > The script works fine if run standalone, but if I run it as an embeded
> > ant task, I get the following exception:
> >
> > java.lang.NullPointerException
> >        at
> java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768)
> >        at
> org.apache.hadoop.hbase.client.HConnectionManager.getConnection(HConnectionManager.java:90)
> >        at
> org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:66)
> >        at
> com.enernoc.rnd.shredder.core.groovy.HBaseBuilder.getAdmin(HBaseBuilder.java:530)
> >        at
> com.enernoc.rnd.shredder.core.groovy.HBaseBuilder.create(HBaseBuilder.java:229)
> >
> >
> > Looking into the code:
> > 86 :                     public static HConnection
> getConnection(HBaseConfiguration conf) {
> > 87 :                    TableServers connection;
> > 88 :                    synchronized (HBASE_INSTANCES) {
> > 89 :                    String instanceName = conf.get(HBASE_DIR);
> > 90 :                    connection = HBASE_INSTANCES.get(instanceName);
> >
> > It means that either "instanceName" is null, or HBASE_INSTANCES is
> > null.  I am guessing it is the former since the previous line is
> > retrieving that value.   So can anyone guess why this would fail?  The
> > HBase JAR is on my classpath, which contains the hbase-default.xml
> > config file (which has the hbase.rootdir value).
> >
> > Furthermore, it appears that the value "hbase.rootdir" is a server
> > configuration to tell the HBase server where the data is stored --
> > correct?  So if I am just using the client api (i.e. to connect to a
> > running HBase server instance,) why would the client be attempting to
> > directly access the data files rather than going through the server
> > connection?  Or am I confused about how the HBase API works?
> >
> > Thanks in advance for the help.
> >
> > -Tom
> >
>

Re: NPE from HConnectionManager

Posted by Tom Nichols <tm...@gmail.com>.
Well after digging (and digging... and digging some more) it turns out
the source of the problem is in the Groovy Ant task.  Rather, the fact
that ....hbase.Configuration uses the
Thread.getCurrentThread().getContextClassloader(), which the Groovy
Ant task leaves as the system classpath, as opposed to the <groovy
classpathref='_____'> value.  So none of the HBase JARs were available
to that classloader...  Which is why HBase couldn't find
hbase-default.xml or hbase-site.xml.



On Mon, Feb 2, 2009 at 12:07 PM, Tom Nichols <tm...@gmail.com> wrote:
> Hi,
>
> I am using the HBase client API in from a Groovy script:
>
> import org.apache.hadoop.hbase.HBaseConfiguration
> import org.apache.hadoop.hbase.client.HBaseAdmin
> println new HBaseAdmin( new HBaseConfiguration() )
>
> The script works fine if run standalone, but if I run it as an embeded
> ant task, I get the following exception:
>
> java.lang.NullPointerException
>        at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768)
>        at org.apache.hadoop.hbase.client.HConnectionManager.getConnection(HConnectionManager.java:90)
>        at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:66)
>        at com.enernoc.rnd.shredder.core.groovy.HBaseBuilder.getAdmin(HBaseBuilder.java:530)
>        at com.enernoc.rnd.shredder.core.groovy.HBaseBuilder.create(HBaseBuilder.java:229)
>
>
> Looking into the code:
> 86 :                     public static HConnection getConnection(HBaseConfiguration conf) {
> 87 :                    TableServers connection;
> 88 :                    synchronized (HBASE_INSTANCES) {
> 89 :                    String instanceName = conf.get(HBASE_DIR);
> 90 :                    connection = HBASE_INSTANCES.get(instanceName);
>
> It means that either "instanceName" is null, or HBASE_INSTANCES is
> null.  I am guessing it is the former since the previous line is
> retrieving that value.   So can anyone guess why this would fail?  The
> HBase JAR is on my classpath, which contains the hbase-default.xml
> config file (which has the hbase.rootdir value).
>
> Furthermore, it appears that the value "hbase.rootdir" is a server
> configuration to tell the HBase server where the data is stored --
> correct?  So if I am just using the client api (i.e. to connect to a
> running HBase server instance,) why would the client be attempting to
> directly access the data files rather than going through the server
> connection?  Or am I confused about how the HBase API works?
>
> Thanks in advance for the help.
>
> -Tom
>