Support Questions

Find answers, ask questions, and share your expertise
Announcements
Celebrating as our community reaches 100,000 members! Thank you!

ClassNotFoundException for Hbase

avatar

Hi,

I have created the code as below to write a record into hbase table of 1.1.2 version. I have included all the jars present in 1.1.2 hbase lib folder but while executing that I am getting the Error Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration

Code

package com.hp;

import java.io.IOExceptionimport org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
public class HbasePut 
{
public static void main(String[] args) throws IOException
{// You need a configuration object to tell the client where to connect.    
// When you create a HBaseConfiguration, it reads in whatever you've set    
// into your hbase-site.xml and in hbase-default.xml, as long as these can    
// be found on the CLASSPATH  
Configuration config = HBaseConfiguration.create();  
// Next you need a Connection to the cluster. Create one. When done with it,    
// close it (Should start a try/finally after this creation so it gets closed    
// for sure but leaving this out for readibility's sake).  
Connection connection = ConnectionFactory.createConnection(config); try 
{      
// This instantiates a Table object that connects you to      
// the "myLittleHBaseTable" table (TableName.valueOf turns String into TableName instance).      
// When done with it, close it (Should start a try/finally after this creation so it gets      
// closed for sure but leaving this out for readibility's sake).      
Table table = connection.getTable(TableName.valueOf("myLittleHBaseTable"));      
try 
{        
// 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("cf1"),Bytes.toBytes("SomeValue"));        
// 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("cf1"));        
// 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("cf1"));        
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();        
} 
*/        
// Close your table and cluster connection.      
} 
finally 
{
if (table != null) 
table.close();      
}    
} 
finally 
{      
connection.close();    
}  }

12 REPLIES 12

avatar
Guru

you may try adding /etc/hadoop/conf to the classpath

avatar
Super Guru

@krishna sampath

Did you tried exporting HADOOP_CLASSPATH variable in your env before running your java code?

Example:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/path/hbase<version>.jar

avatar

is it in bashrc you are telling me to add or in ambari

avatar
Super Guru

@krishna

you simply need to execute this command on shell prompt before you run java -cp

bash# export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/path/hbase<version>.jar

bash# export CLASSPATH=$CLASSPATH:$HADOOP_CLASSPATH

avatar
Super Guru

@krishna

Please let us know if this issue got resolved after implementing suggested changes.

Thanks

avatar
Rising Star

If you've installed HBase client on your test environment, you could use this command to test your code:

export HBASE_CLASSPATH=$HBASE_CLASSPATH:<jar_compiled_using_your_code>

$HBASE_HOME/bin/hbase <package_name>.HbasePut

avatar

where exactly we can add, I mean in the bashrc or in ambari(in ambari means where we can change)

avatar
Rising Star

In the bash command line:

$ export HBASE_CLASSPATH=${HBASE_CLASSPATH}:<path_to_jar_compiled_using_your_code>

$ ${HBASE_HOME}/bin/hbase <package_name_of_your_class>.HbasePut

avatar

how are you running the job with "java " or "hadoop jar"?