hbase java api, NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguratio

1 Java api 操作hbase代码写法如下:

 

 

Java代码   收藏代码
  1. package hbase;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import org.apache.hadoop.conf.Configuration;  
  8. import org.apache.hadoop.hbase.HBaseConfiguration;  
  9. import org.apache.hadoop.hbase.HColumnDescriptor;  
  10. import org.apache.hadoop.hbase.HTableDescriptor;  
  11. import org.apache.hadoop.hbase.KeyValue;  
  12. import org.apache.hadoop.hbase.MasterNotRunningException;  
  13. import org.apache.hadoop.hbase.NamespaceDescriptor;  
  14. import org.apache.hadoop.hbase.TableName;  
  15. import org.apache.hadoop.hbase.ZooKeeperConnectionException;  
  16. import org.apache.hadoop.hbase.client.Delete;  
  17. import org.apache.hadoop.hbase.client.Get;  
  18. import org.apache.hadoop.hbase.client.HBaseAdmin;  
  19. import org.apache.hadoop.hbase.client.HTable;  
  20. import org.apache.hadoop.hbase.client.HTableInterface;  
  21. import org.apache.hadoop.hbase.client.HTablePool;  
  22. import org.apache.hadoop.hbase.client.Put;  
  23. import org.apache.hadoop.hbase.client.Result;  
  24. import org.apache.hadoop.hbase.client.ResultScanner;  
  25. import org.apache.hadoop.hbase.client.Scan;  
  26. import org.apache.hadoop.hbase.util.Bytes;  
  27.   
  28. // hbase shell 和对应 java api操作大全  http://blog.csdn.net/wulantian/article/details/41011297   
  29. /** 
  30.  * 如果在执行  build-hbase.xml时遇到 connect的错误,请多次重复执行  虚拟机第一次连接基本都连接不上  
  31.  * @author Administrator 
  32.  * 
  33.  */  
  34. public class MyHbaseAPI {  
  35.   
  36.     /** 
  37.      * @param args 
  38.      */  
  39.     public static void main(String[] args) {  
  40.   
  41.         Configuration conf = getConf();  
  42.           
  43.         // 查询所有表  
  44.         /*try { 
  45.             HBaseAdmin hBaseAdmin = new HBaseAdmin(conf); 
  46.             HTableDescriptor[]  desors = hBaseAdmin.listTables(); 
  47.             for(int i=0; i<desors.length; i++){ 
  48.                 HTableDescriptor desor = desors[i]; 
  49.                 TableName tableName = desor.getTableName(); 
  50.                 System.out.println("tablename is: " + tableName.getNameAsString()); 
  51.             } 
  52.         } catch (Exception e) { 
  53.             e.printStackTrace(); 
  54.         } */  
  55.           
  56.         // 删除表  
  57.     /*  try { 
  58.             HBaseAdmin hBaseAdmin = new HBaseAdmin(conf); 
  59.             hBaseAdmin.disableTable("tea"); // 先disable 否则会报还没有disable 异常 
  60.             hBaseAdmin.deleteTable("tea"); 
  61.         } catch (Exception e) { 
  62.             e.printStackTrace(); 
  63.         } */  
  64.           
  65.           
  66.         // 创建表  
  67.         /*try { 
  68.             HBaseAdmin hBaseAdmin = new HBaseAdmin(conf); 
  69.             // 设置表名   这个类是表名和列族的容器 
  70.             HTableDescriptor hTableDescriptor = new HTableDescriptor("teacher"); 
  71.             // 设置两个列族名 
  72.             HColumnDescriptor basecolumnDescriptor = new HColumnDescriptor("base"); 
  73.             HColumnDescriptor morecolumnDescriptor = new HColumnDescriptor("more"); 
  74.             // 列族加入到表中 
  75.             hTableDescriptor.addFamily(basecolumnDescriptor); 
  76.             hTableDescriptor.addFamily(morecolumnDescriptor); 
  77.             // 创建之 
  78.             hBaseAdmin.createTable(hTableDescriptor); 
  79.              
  80.             boolean exist = hBaseAdmin.tableExists("teacher"); 
  81.             System.out.println("创建的新表teacher成功了吗? " + exist); 
  82.              
  83.         } catch (Exception e) { 
  84.             e.printStackTrace(); 
  85.         } */  
  86.           
  87.         /* 
  88.          * boolean b = admin.isTableDisabled("stu"); 
  89.          * if(!b){ 
  90.             hBaseAdmin.disableTable("emp"); 
  91.             System.out.println("Table disabled"); 停用此表 
  92.         }esle{ 
  93.             hBaseAdmin.enableTable("emp"); // 启动此表 
  94.         }*/  
  95.           
  96.         // 向hbase表插入/更新 数据  
  97.         /*try { 
  98.             HTablePool htablepool = new HTablePool(conf, 1000); 
  99.             HTableInterface htable = htablepool.getTable("stu"); 
  100.             //HTable htable = new HTable(conf, "stu");  建议用pool方式获得表 
  101.             List  puts = new ArrayList<Put>(); 
  102.             Put put1 = new Put("2".getBytes()); 
  103.             put1.add("base".getBytes(), "name".getBytes(), "baobao".getBytes()); 
  104.             Put put2 = new Put("2".getBytes()); 
  105.             put2.add("base".getBytes(), "age".getBytes(), "1".getBytes()); 
  106.             //Put put3 = new Put("2".getBytes()); 
  107.             //put3.add("more".getBytes(), "weigth".getBytes(), "3.5kg".getBytes()); 
  108.             //Put put4 = new Put("2".getBytes()); 
  109.             //put4.add("more".getBytes(), "height".getBytes(), "50cm".getBytes()); 
  110.             puts.add(put1); 
  111.             puts.add(put2); 
  112.             //puts.add(put3); 
  113.             //puts.add(put4); 
  114.             htable.put(puts); 
  115.             htable.close(); 
  116.         } catch (Exception e) { 
  117.             e.printStackTrace(); 
  118.         } */  
  119.           
  120.         // hbase删除一条数据的指定列  
  121.     /*  try { 
  122.             HTable htable = new HTable(conf, "stu"); 
  123.             Delete delete = new Delete("3".getBytes()); // 删除整行数据 
  124.             //delete.deleteFamily("base".getBytes());  // 删除整个列族 
  125.             delete.deleteColumn("base".getBytes(), "sex".getBytes()); // 删除某个列 
  126.             htable.delete(delete); 
  127.             htable.close(); 
  128.         } catch (Exception e) { 
  129.             e.printStackTrace(); 
  130.         }*/  
  131.           
  132.         // 查询单条记录所有数据  
  133.         /*try { 
  134.             HTable htable = new HTable(conf, "stu"); 
  135.             Get get = new Get("2".getBytes()); 
  136.             Result result = htable.get(get); 
  137.             //String name = Bytes.toString(result.getValue("base".getBytes(), "name".getBytes())); 
  138.             //String age = Bytes.toString(result.getValue("base".getBytes(), "age".getBytes())); 
  139.             //String weight = Bytes.toString(result.getValue("more".getBytes(), "weight".getBytes())); 
  140.             //String high = Bytes.toString(result.getValue("more".getBytes(), "high".getBytes())); 
  141.             for(KeyValue kv : result.raw()){ // 得到组成result的各个单元cell, 这些cell是由row, family, qualifier,value等组成, 如果id为2下有多条则遍历后将每一行的列输出 
  142.                 System.out.println("rowkey: " + Bytes.toString(kv.getRow())); 
  143.                 System.out.println("family: " +  Bytes.toString(kv.getFamily())); 
  144.                 System.out.println("Qualifier: " +  Bytes.toString(kv.getQualifier())); 
  145.                 System.out.println("value: " +  Bytes.toString(kv.getValue())); 
  146.             } 
  147.              
  148.             //System.out.println("name: " + name + " age: " + age + " weight: " + weight + " high: " + high); 
  149.             htable.close(); 
  150.         } catch (Exception e) { 
  151.             e.printStackTrace(); 
  152.         }*/  
  153.           
  154.         // 查询单条记录某一列数值  
  155.         /*try { 
  156.             HTable htable = new HTable(conf, "stu"); 
  157.             Get get = new Get("2".getBytes()); 
  158.             get.addColumn("base".getBytes(), "name".getBytes()); 
  159.             Result result = htable.get(get); 
  160.             String name = Bytes.toString(result.getValue("base".getBytes(), "name".getBytes())); 
  161.             String age = Bytes.toString(result.getValue("base".getBytes(), "age".getBytes())); // 得到 null 
  162.             System.out.println("name: " + name + " age: " + age); 
  163.             htable.close(); 
  164.         } catch (Exception e) { 
  165.             e.printStackTrace(); 
  166.         }*/  
  167.           
  168.           
  169.         // 增加和删除表中的列族  
  170.     /*  try { 
  171.             HBaseAdmin hBaseAdmin = new HBaseAdmin(conf); 
  172.             //hBaseAdmin.deleteColumn("stu", "more"); //Column family  删除表列族 
  173.             HColumnDescriptor morecolumnDescriptor = new HColumnDescriptor("more"); // 增加列族 
  174.             hBaseAdmin.addColumn("stu", morecolumnDescriptor); 
  175.         } catch (Exception e) { 
  176.             e.printStackTrace(); 
  177.         }*/  
  178.           
  179.         // 关闭hbase集群  
  180.         /*try { 
  181.             HBaseAdmin hBaseAdmin = new HBaseAdmin(conf); 
  182.             //hBaseAdmin.stopMaster() 
  183.             //hBaseAdmin.stopRegionServer(hostnamePort) 
  184.             hBaseAdmin.shutdown(); // 关闭hbase 
  185.         } catch (Exception e) { 
  186.             e.printStackTrace(); 
  187.         }*/  
  188.           
  189.         // 插入列  
  190.         /*try { 
  191.             HTable htable = new HTable(conf, "stu"); 
  192.             List  puts = new ArrayList<Put>(); 
  193.             Put put1 = new Put("3".getBytes()); 
  194.             put1.add("base".getBytes(), "sex".getBytes(), "man".getBytes()); 
  195.             puts.add(put1); 
  196.             htable.put(puts); 
  197.             htable.close(); 
  198.         } catch (Exception e) { 
  199.             e.printStackTrace(); 
  200.         } */  
  201.           
  202.         // scan过滤器  
  203.     /*  try { 
  204.             HBaseAdmin hBaseAdmin = new HBaseAdmin(conf); 
  205.             HTable htable = new HTable(conf, "stu"); 
  206.             Scan scan = new Scan(); 
  207.             scan.setStartRow("1".getBytes()); // 增加开始rowkey  包含 
  208.             scan.setStopRow("3".getBytes()); //增加结束rowkey  不包含 
  209.             scan.addColumn("base".getBytes(), "name".getBytes());// 扫描中增加 列族 列名 
  210.             ResultScanner resultScanner = htable.getScanner(scan); 
  211.             for(Result result : resultScanner){ //result: HBase cell defined by the row, family, qualifier, timestamp, and value 
  212.                 if(result.raw().length==0){ 
  213.                     System.out.println("stu 表数据为空"); 
  214.                 }else{ 
  215.                     for(KeyValue kv : result.raw()){ // 得到组成result的各个单元cell, 这些cell是由row, family, qualifier,value等组成 
  216.                         System.out.println(Bytes.toString(kv.getRow())); 
  217.                         System.out.println(Bytes.toString(kv.getFamily())); 
  218.                         System.out.println(Bytes.toString(kv.getQualifier())); 
  219.                         System.out.println(Bytes.toString(kv.getValue())); 
  220.                     } 
  221.                 } 
  222.             } 
  223.         } catch (Exception e) { 
  224.             // TODO Auto-generated catch block 
  225.             e.printStackTrace(); 
  226.         }*/  
  227.           
  228.         // scan + filter过滤器  
  229.         try {  
  230.             HBaseAdmin hBaseAdmin = new HBaseAdmin(conf);  
  231.             HTable htable = new HTable(conf, "stu");  
  232.             Scan scan = new Scan();  
  233.             scan.setStartRow("1".getBytes()); // 增加开始rowkey  包含  
  234.             scan.setStopRow("3".getBytes()); //增加结束rowkey  不包含  
  235.             scan.addColumn("base".getBytes(), "name".getBytes());// 扫描中增加 列族 列名  
  236.             ResultScanner resultScanner = htable.getScanner(scan);  
  237.             for(Result result : resultScanner){ //result: HBase cell defined by the row, family, qualifier, timestamp, and value  
  238.                 if(result.raw().length==0){  
  239.                     System.out.println("stu 表数据为空");  
  240.                 }else{  
  241.                     for(KeyValue kv : result.raw()){ // 得到组成result的各个单元cell, 这些cell是由row, family, qualifier,value等组成  
  242.                         System.out.println(Bytes.toString(kv.getRow()));  
  243.                         System.out.println(Bytes.toString(kv.getFamily()));  
  244.                         System.out.println(Bytes.toString(kv.getQualifier()));  
  245.                         System.out.println(Bytes.toString(kv.getValue()));  
  246.                     }  
  247.                 }  
  248.             }  
  249.         } catch (Exception e) {  
  250.             // TODO Auto-generated catch block  
  251.             e.printStackTrace();  
  252.         }  
  253.           
  254.       
  255.           
  256.         // filter过滤器  见别的链接  
  257.           
  258.           
  259.     }  
  260.   
  261.       
  262.     private static Configuration getConf() {  
  263.         Configuration conf = null;  
  264.         conf = HBaseConfiguration.create();  
  265.         conf.set("hbase.zookeeper.quorum""hadoop3");    
  266.         conf.set("hbase.rootdir""hdfs://hadoop3:9000/hbase");   
  267.         return conf;  
  268.     }  
  269.   
  270. }  

 

 filter过滤器, 实际上定义好你过滤规则filter后, 直接丢给 scan即可然后让scan扫描:

 scan.setFilter(filter); // 增加过滤器

关于过滤器,见:  hbase scan filter以及hbase逻辑存储图和hbase打印数据效果 编辑

 

 

 

2  在 hbase + hadoop2 + zk 构建的集群的时候注意事项:

hbase: h2master主  h2sliver113 从  h2sliver114从

hadoop: h2single

zookeeper:  h2master h2sliver113  h2sliver114

 

将上面代码打包后 放在hadoop上通过执行:

bin/hadoop jar XX.jar 包.类执行的时候,报错如下:



 

 

 

错误原因:  hadoop2节点无法加载到hbase包

 

处理方式1:

 

将hbase jar拷贝到hadoop 节点上,注意请将hbase/lib下的所有包都拷贝过去,比如 /usr/local/hbaselib。

曾经尝试过只将

hbase client, hbase common, hbase server拷贝过去,但是在build-hbase.xml执行时报错:

Java代码   收藏代码
  1. NoClassDefFoundError: org/cloudera/htrace/Trace  

 

 

然后在 hadooop/etc/hadoop/hadoop-env.sh中 增加如下:

 

Java代码   收藏代码
  1. for f in /usr/local/hbaselib/*.jar; do  
  2.   if [ "$HADOOP_CLASSPATH" ]; then  
  3.     export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f  
  4.   else  
  5.     export HADOOP_CLASSPATH=$f  
  6.   fi  
  7. done  

 

最后 可以在 hadoop/bin/mapred classpath下 查看是否已经将hbase lib 加载进来。

 

 

处理方式2:

 

或者直接都不需要拷贝hase jar包,  hadooop/etc/hadoop/hadoop-env.sh中 增加

export HADOOP_CLASSPATH=/opt/hbase-0.98.12/lib/*

 

这两种方式都测试过,现在用方式2, 下面截图是这两种方式的设置:

 



 

 

 

 处理方式3:   下面写法是执行 bulkload引入外部jar的写法

 使用shell脚本执行jar程序

Java代码   收藏代码
  1. 使用shell脚本执行jar程序  
  2. pt='.'  
  3. for jar in `ls /某路径/*.jar  /某路径/*.jar  /某路径/*.jar`  
  4. do  
  5.  pt=$pt:$jar  
  6. done  
  7. echo $pt  

 

贴上以前这种使用方式写法: 

 

Java代码   收藏代码
  1. jars=`ls $PROJECT_HOME/lib`  
  2. for jar in $jars  
  3. do  
  4.     CLASSPATH="$CLASSPATH:$PROJECT_HOME/lib/$jar"     
  5. done  
  6.   
  7. CLASSPATH=/etc/hdfs1/conf:/etc/hadoop/conf:/etc/hbase/conf:$CLASSPATH    
  8.   
  9. java -Djava.library.path=/usr/lib/hadoop/lib/native -cp $CLASSPATH com.transwarp.hbase.bulkload.ImportTextFile2HBase $CONF_FILE -test

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值