2017-01-26 42 views
0

我試圖使用批量掃描從HBase表中刪除行。當我將此代碼作爲類文件運行時,它運行良好。但是,當我將代碼作爲JAR運行時,它給出了以下例外:帶HBase的java.lang.NoSuchMethodError Scan.setBatch

線程「main」中的異常java.lang.NoSuchMethodError:org.apache.hadoop.hbase.client.Scan.setBatch(I)V

這是我的代碼:

公共類吹掃{ 公共靜態無效的主要(字串[] args)拋出IOException異常,InterruptedException的{

 if (args.length != 3) { 
      System.out.println("Incorrect number of arguments"); 
      System.out.println("Correct Usage: java Purge <table> <column name> <value>"); 
      System.out.println("Exiting ....."); 
      System.exit(0); 
     } 

     String tablename = args[0]; 
     String column = args[1]; 
     String value = args[2]; 
     Configuration conf = HBaseConfiguration.create(); 
     Connection connection = ConnectionFactory.createConnection(conf); 
     Table table = connection.getTable(TableName.valueOf(tablename)); 

     List<Delete> deleteList = new ArrayList<Delete>(); 
     Scan scan = new Scan(); 
     scan.setBatch(100); 

     scan.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes(column)); 
     Filter filter = new ValueFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,new BinaryComparator(Bytes.toBytes(value))); 
     scan.setFilter(filter); 
     ResultScanner scanner=table.getScanner(scan); 
     for (Result rr : scanner) { 
      Delete d=new Delete(rr.getRow()); 
      deleteList.add(d); 
     } 
     table.delete(deleteList); 
} 

}

我使用以下命令行:

HADOOP_CLASSPATH = hbase mapredcp Hadoop的罐子purge.jar清理「$表」,「$欄」,「$時間戳」

回答

0

是什麼意思「當我爲班級使用」? 無論如何,這個異常通常在缺少某些lib時出現:lib在編譯過程中可能是可見的(所以編譯是成功的),但是啓動編譯的jar時不會,因爲環境可能不同。

很可能,它從IDE(如eclipse)啓動時起作用,因爲這些庫是由eclipse classpath管理的,當您將.jar放在編譯的類路徑外部時,它不起作用,因爲有一些jar失蹤。 嘗試找到丟失的lib,然後將它們放在類路徑中。

+0

很抱歉的混亂。我想說的是,當我像這樣運行它時,它工作正常 - java清除「$ table」「$ column」「$ timestamp」。但是當我作爲一個罐子運行時,它給我錯誤。 –