1.修改windows配置文件
C:\WINDOWS\system32\drivers\etc\hosts
将远程hbase和zookeeper主机的IP地址加进去
54.0.88.53 HADOOP1
54.0.88.54 HADOOP2
2.加入jar包
3.加载配置文件
问题:网上很多都是自定义配置文件,根据hbase-site.xml里的参数如下配置:
configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.property.clientPort", "2181");
configuration.set("hbase.zookeeper.quorum", "HADOOP1,HADOOP2,HADOOP3,HADOOP4,HADOOP5");
configuration.set("hbase.master", "HADOOP3:60000");
但是在运行时出现以下错误:
Exception in thread "main" org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=35, exceptions: Wed Sep 24 08:47:46 CST 2014, org.apache.hadoop.hbase.client.RpcRetryingCaller@191f801, java.io.IOException: Failed to find location, tableName=hbase:meta, row=hbasekang,,, reload=false Wed Sep 24 08:48:56 CST 2014, org.apache.hadoop.hbase.client.RpcRetryingCaller@191f801, java.io.IOException: Failed to find location, tableName=hbase:meta, row=hbasekang,,, reload=true
参考这里的方法,但是还没有很好的解决,我猜可能是configuration访问的不止这三个参数选项。
所以最好加载配置文件的方式,zookeeper的配置项和hbase的配置也可以保持一致。
static { config = HBaseConfiguration.create(); config .addResource(new Path( "D://eclipse/myeclipse/workspace/Hive/hbaselib/hbase-site.xml")); }
记得这个hbase-site.xml和当前的hbase环境下的是一致的,要不然会报错:
Caused by: java.io.IOException: Unable to determine ZooKeeper ensemble
顺便普及一下:
Hbase的客户端API中,configuration相当于提供对配置参数的访问途径,任何操作都要先创建HBaseConfiguration实例。而配置文件在configuration中被当做一个个资源(Resource),也就是一组以XML格式存在的name/value对,以此来提供访问配置信息的接口,还提供了set/get方法用于读写。通过addResource方法加载xml配置文件,可以允许hadoop其他子项目和用户自定义的配置参数被加载使用。
4.贴代码
/** * */ package com.util.hbase; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.MasterNotRunningException; import org.apache.hadoop.hbase.ZooKeeperConnectionException; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.HTablePool; 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.filter.Filter; import org.apache.hadoop.hbase.filter.FilterList; import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; import com.ccb.entity.Detail3; /** * @author kangxuedan * */ public class HbaseUtil { public static Configuration config; static { config = HBaseConfiguration.create(); config .addResource(new Path( "D://eclipse/myeclipse/workspace/Hive/hbaselib/hbase-site.xml")); } /** * 创建表 * * @throws IOException * @param tableName * 表名 * @param columns * 列族 */ public static void createTable(String tableName, String[] columns) throws IOException { HBaseAdmin Hbaseadmin = new HBaseAdmin(config); if (Hbaseadmin.tableExists(tableName)) { System.out.println("表已经存在!"); } else { HTableDescriptor desc = new HTableDescriptor(tableName); for (String column : columns) { desc.addFamily(new HColumnDescriptor(column)); } Hbaseadmin.createTable(desc); System.out.println("表创建成功!"); } } /** * 插入数据 */ // insert data // String newRowKey = "ffvs";String[] familys ={"cf1"};String[] values // ={"fdxs"}; // insert(tableName,newRowKey,familys,values); public static void insert(String tableName, String newRowKey, String[] familys, String[] values) { System.out.println("************start insert ************"); HTablePool pool = new HTablePool(config, 1000); Put put = new Put(newRowKey.getBytes());// 插入一行数据,传入rowKey put.add(familys[0].getBytes(), null, values[0].getBytes());// 本行数据的第三列 try { pool.getTable(tableName).put(put); } catch (IOException e) { e.printStackTrace(); } System.out.println("************end insert************"); } /** * 根据 rowkey删除一条记录 * * @param tablename * @param rowkey */ public static void deleteRow(String tablename, String rowkey) { try { HTable table = new HTable(config, tablename); List list = new ArrayList(); Delete d1 = new Delete(rowkey.getBytes()); list.add(d1); table.delete(list); System.out.println("删除行成功!"); } catch (IOException e) { e.printStackTrace(); } } /** * 删除表 * * @param tableName */ public static void dropTable(String tableName) { try { HBaseAdmin Hbaseadmin = new HBaseAdmin(config); Hbaseadmin.disableTable(tableName); Hbaseadmin.deleteTable(tableName); } catch (MasterNotRunningException e) { e.printStackTrace(); } catch (ZooKeeperConnectionException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 修改表信息 * * @param tableName */ public static void modifyTable(String tableName) { HBaseAdmin Hbaseadmin; try { Hbaseadmin = new HBaseAdmin(config); Hbaseadmin.disableTable(tableName); // modifying existing ColumnFamily addColumn, modifyColumn, // removeColumn Hbaseadmin.modifyColumn(tableName, new HColumnDescriptor("cf1")); Hbaseadmin.enableTable(tableName); } catch (MasterNotRunningException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ZooKeeperConnectionException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 查询表,返回所有记录 * * @param tableName */ public static void QueryAll(String tableName) { HTablePool pool = new HTablePool(config, 1000); try { ResultScanner rs = pool.getTable(tableName).getScanner(new Scan()); for (Result r : rs) { System.out.println("rowkey: " + new String(r.getRow())); for (KeyValue keyValue : r.raw()) { System.out.println("列:" + new String(keyValue.getFamily()) + "====值:" + new String(keyValue.getValue())); } } } catch (IOException e) { e.printStackTrace(); } } /** * 单条件查询,根据rowkey查询唯一一条记录 * * @param tableName * @return */ public static List<Detail3> QuerySingle(String tableName, String rowKey) { HTablePool pool = new HTablePool(config, 1000); String results = ""; Detail3 detail3 = new Detail3(); List<Detail3> resultList = new ArrayList<Detail3>(); try { Get scan = new Get(rowKey.getBytes());// 根据rowkey查询 Result r = pool.getTable(tableName).get(scan); System.out.println("获得到rowkey:" + new String(r.getRow())); for (KeyValue keyValue : r.raw()) { String result = new String(keyValue.getValue(), "utf-8"); System.out.println("列:" + new String(keyValue.getFamily()) + "====值:" + new String(keyValue.getValue(), "utf-8")); StringTokenizer st = new StringTokenizer(results, ","); String[] temp = result.split("\\|"); detail3.setCust_no(temp[0]); detail3.setSa_tx_dt(temp[1]); detail3.setTx_log_no(temp[2]); detail3.setSa_tx_tm(temp[3]); detail3.setTemp(temp[4]); detail3.setCust_acct_no(temp[5]); detail3.setSa_tx_crd_no(temp[6]); detail3.setCr_tx_amt(temp[7]); detail3.setAcct_bal(temp[8]); detail3.setF_fare(temp[9]); detail3.setDr_cr_cod(temp[10]); detail3.setTran_cd(temp[11]); detail3.setTx_type(temp[12]); detail3.setXt_op_trl(temp[13]); detail3.setXt_op_trl2(temp[14]); detail3.setBus_inst_no(temp[15]); detail3.setCanal(temp[16]); detail3.setSa_op_acct_no_32(temp[17]); detail3.setSa_op_cust_name(temp[18]); detail3.setSa_op_bank_no(temp[19]); detail3.setCr_cust_docag_stno(temp[20]); detail3.setSa_otx_flg(temp[21]); detail3.setSa_rmrk(temp[22]); detail3.setOther(temp[23]); detail3.setTlr_no(temp[24]); resultList.add(detail3); // resultList = java.util.Arrays.asList(temp); } } catch (IOException e) { e.printStackTrace(); } return resultList; } /** * rowkey 范围查询 * * @param tableName * @return */ public static List<Detail3> QueryRange(String tableName, String cust_no,String starttime,String endtime) { String startRow = cust_no + starttime; String endRow = cust_no + endtime; String results = ""; Detail3 detail3 = new Detail3(); List<Detail3> resultList = new ArrayList<Detail3>(); HTablePool pool = new HTablePool(config, 1000); try { Scan scan = new Scan(); scan.setStartRow(Bytes.toBytes(startRow)); scan.setStopRow(Bytes.toBytes(endRow)); scan.setCacheBlocks(true); scan.setCaching(30000); ResultScanner rs = pool.getTable(tableName).getScanner(scan); for (Result r : rs) { for (KeyValue kv : r.raw()) { System.out.println(String.format( "key:%s", Bytes.toString(kv .getRow()))); System.out.println(String.format( "value:%s", Bytes.toString(kv .getValue()))); String result = Bytes.toString(kv.getValue()); String[] temp = result.split("\\|"); detail3.setCust_no(temp[0]); detail3.setSa_tx_dt(temp[1]); detail3.setTx_log_no(temp[2]); detail3.setSa_tx_tm(temp[3]); detail3.setTemp(temp[4]); detail3.setCust_acct_no(temp[5]); detail3.setSa_tx_crd_no(temp[6]); detail3.setCr_tx_amt(temp[7]); detail3.setAcct_bal(temp[8]); detail3.setF_fare(temp[9]); detail3.setDr_cr_cod(temp[10]); detail3.setTran_cd(temp[11]); detail3.setTx_type(temp[12]); detail3.setXt_op_trl(temp[13]); detail3.setXt_op_trl2(temp[14]); detail3.setBus_inst_no(temp[15]); detail3.setCanal(temp[16]); detail3.setSa_op_acct_no_32(temp[17]); detail3.setSa_op_cust_name(temp[18]); detail3.setSa_op_bank_no(temp[19]); detail3.setCr_cust_docag_stno(temp[20]); detail3.setSa_otx_flg(temp[21]); detail3.setSa_rmrk(temp[22]); detail3.setOther(temp[23]); detail3.setTlr_no(temp[24]); resultList.add(detail3); } } } catch (IOException e) { e.printStackTrace(); } return resultList; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String tableName = "detail3"; String rowKey = "442000801K750005487"; String cust_no = "A432502";String starttime ="2014-06-01"; String endtime = "2014-08-01"; QueryRange(tableName, cust_no,starttime,endtime);} }