HBase客户端API(整理 修改一下)

时间:2021-03-31 08:37:42



  1. 创建表:(由master完成)

  • 首先需要获取master地址(master启动时会将地址告诉zookeeper)因而客户端首先会访问zookeeper获取master的地址 
  • client和master通信,然后有master来创建表( 包括表的列簇,是否 cache ,设置存储的最大版本数,是否压缩等 )。 

2. 读写删除数据
  • client与regionserver通信,读写、删除数据 
  • 写入和删除数据时讲数据打上不同的标志append,真正的数据删除操作在compact时发生 
  3. 版本信息
   HBase客户端API(整理 修改一下) 








HbaseConfiguration, 表示HBase的配置信息
两种构造函数如下:
  public HBaseConfiguration() -----------默认的构造方式会从hbase-default.xml和hbase-site.xml中读取配置,如果classpath中没有这两个文件,需要自己配置
public HBaseConfiguration(final Configuration c)

  1. static HBaseConfiguration cfg = null; 
  2. static { 
  3. Configuration HBASE_CONFIG = new Configuration(); HBASE_CONFIG.set("hbase.zookeeper.quorum", "192.168.1.95"); HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", "2181"); 
  4.  cfg = new HBaseConfiguration(HBASE_CONFIG); 
  5. }
复制代码
创建表 

   使用HBaseAdmin对象的createTable方法
  1. public static void createTable(String tableName) { System.out.println("************start create table**********"); 
  2. try {
  3.   HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); 
  4.   if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建
  5.         hBaseAdmin.disableTable(tableName);        hBaseAdmin.deleteTable(tableName);
  6.         System.out.println(tableName + " is exist");
  7.   } 
  8.   HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);// 代表表的schema  
  9.   tableDescriptor.addFamily(new HColumnDescriptor("name")); //增加列簇  
  10.   tableDescriptor.addFamily(new HColumnDescriptor("age"));
  11.   tableDescriptor.addFamily(new HColumnDescriptor("gender"));
  12.   hBaseAdmin.createTable(tableDescriptor); 
  13. }  catch (MasterNotRunningException e) {
  14.   e.printStackTrace(); 
  15. }  catch (ZooKeeperConnectionException e) {
  16.   e.printStackTrace();
  17.  } catch (IOException e) { 
  18.   e.printStackTrace(); 
  19. System.out.println("*****end create table*************"); }
复制代码
  1. public static void main(String[] agrs) { 
  2. try {
  3.  String tablename = "wishTest";
  4.  HBaseTest.createTable(tablename);
  5.  } catch (Exception e) {
  6.  e.printStackTrace(); 
  7.  } 
  8. }
复制代码


在centos中查看是否创建成功:
   HBase客户端API(整理 修改一下) 

   网页上查看:
    HBase客户端API(整理 修改一下) 
  1.   HTableDescriptor其他方法如下:
复制代码


  • setMaxFileSize  ,指定最大的 region size  
  • setMemStoreFlushSize    指定 memstore flush 到 HDFS 上的文件大小,默认是 64M  
  • public void addFamily(final HColumnDescriptor family) 

  1.  HColumnDescriptor 其他方法如下:
复制代码


  • setTimeToLive: 指定最大的 TTL, 单位是 ms, 过期数据会被自动删除。 
  • setInMemory: 指定是否放在内存中,对小表有用,可用于提高效率。默认关闭 
  • setBloomFilter: 指定是否使用 BloomFilter, 可提高随机查询效率。默认关闭 
  • setCompressionType: 设定数据压缩类型。默认无压缩。 
  • setScope(scope): 集群的 Replication ,默认为 flase 
  • setBlocksize(blocksize); block 的大小默认是 64kb , block 小适合随机读,但是可能导 Index 过大而使内存 oom, block 大利于顺序读。 
  • setMaxVersions: 指定数据最大保存的版本个数。默认为 3 。版本数最多为 Integer.MAX_VALUE,  但是版本数过多可能导致 compact 时 out of memory 。 
  • setBlockCacheEnabled: 是否可以 cache,  默认设置为 true ,将最近读取的数据所在的 Block 放入内存中,标记为 single ,若下次读命中则将其标记为 multi 

插入数据 

   使用HTable获取table    注意: HTable 不是线程安全的,因此当多线程插入数据的时候推荐使用 HTablePool   
使用put插入数据,可以单条插入数据和批量插入数据,put方法如下:
  public void put(final Put put) throws IOException 
public void put(final List puts) throws IOException

put 常用方法:
  

  • add:  增加一个 Cell  
  • setTimeStamp:  指定所有 cell 默认的 timestamp, 如果一个 Cell 没有指定 timestamp, 就会用到这个值。如果没有调用, HBase 会将当前时间作为未指定 timestamp 的 cell 的 timestamp.  
  • setWriteToWAL: WAL  是 Write Ahead Log 的缩写,指的是 HBase 在插入操作前是否写 Log 。默认是打开,关掉会提高性能,但是如果系统出现故障 ( 负责插入的 Region Server 挂掉 ) ,数据可能会丢失。  

下面两个方法会影响插入性能
  

  • setAutoFlash: 
    AutoFlush 指的是在每次调用 HBase 的 Put 操作,是否提交到 HBase Server 。默认是 true, 每次会提交。如果此时是单条插入,就会有更多的 IO, 从而降低性能。进行大量 Put 时, HTable 的 setAutoFlush 最好设置为 flase   。否则每执行一个 Put 就需要和 RegionServer 发送一个请求。如果 autoFlush = false ,会等到写缓冲填满才会发起请求。显式的发起请求,可以调用 flushCommits 。 HTable 的 close 操作也会发起 flushCommits 


  • setWriteBufferSize: 
  Write Buffer Size 在 AutoFlush 为 false 的时候起作用,默认是 2MB, 也就是当插入数据超过 2MB, 就会自动提交到 Server 

  1. public static void insert(String tableName) {
  2.  System.out.println("************start insert ************");
  3.   HTablePool pool = new HTablePool(cfg, 1000);
  4.  Put put = new Put("1".getBytes());// 一个PUT代表一行数据,每行一个唯一的ROWKEY,此处rowkey为1   
  5.  put.add("name".getBytes(), null, "wish".getBytes());// 本行数据的第一列 
  6.  put.add("age".getBytes(), null, "20".getBytes());// 本行数据的第三列
  7.  put.add("gender".getBytes(), null, "female".getBytes());// 本行数据的第三列 
  8.  try {
  9.  pool.getTable(tableName).put(put);
  10.  } catch (IOException e) {
  11.  e.printStackTrace();
  12.  } 
  13. System.out.println("************end insert************"); }
复制代码
  1. public static void main(String[] agrs) {
  2.  try {
  3.  String tablename = "wishTest";
  4.  HBaseTest.insert(tablename); 
  5.  } catch (Exception e) {
  6.  e.printStackTrace(); 
  7.  } 
  8. }
复制代码
日志信息如下:
   ************start insert ************ 
14/05/18 15:01:17 WARN hbase.HBaseConfiguration: instantiating HBaseConfiguration() is deprecated. Please use HBaseConfiguration#create() to construct a plain Configuration 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:zookeeper.version=3.4.5-1392090, built on 09/30/2012 17:52 GMT 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:host.name=LJ-PC 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:java.version=1.6.0_11 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:java.vendor=Sun Microsystems Inc. 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:java.home=D:javajdk1.6.0_11jre 
..... 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:java.compiler= 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:os.name=Windows Vista 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:os.arch=x86 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:os.version=6.1 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:user.name=root 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:user.home=C:UsersLJ 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Client environment:user.dir=D:javaeclipse4.3-jee-kepler-SR1-win32workspacehadoop 
14/05/18 15:01:17 INFO zookeeper.ZooKeeper: Initiating client connection, connectString=192.168.1.95:2181 sessionTimeout=180000 watcher=hconnection 
14/05/18 15:01:17 INFO zookeeper.RecoverableZooKeeper: The identifier of this process is 1252@LJ-PC 
14/05/18 15:01:17 INFO zookeeper.ClientCnxn: Opening socket connection to server hadoop/192.168.1.95:2181. Will not attempt to authenticate using SASL (无法定位登录配置) 
14/05/18 15:01:17 INFO zookeeper.ClientCnxn: Socket connection established to hadoop/192.168.1.95:2181, initiating session 
14/05/18 15:01:17 INFO zookeeper.ClientCnxn: Session establishment complete on server hadoop/192.168.1.95:2181, sessionid = 0x460dd23bda000b, negotiated timeout = 180000 
************end insert************ 

查看插入结果:
   HBase客户端API(整理 修改一下) 

查询数据 

  分为单条查询和批量查询,单条查询通过get查询。 通过HTable的getScanner实现批量查询
  public Result get(final Get get)   //单条查询
public ResultScanner getScanner(final Scan scan)  //批量查询

单条查询:
  1. public static void querySingle(String tableName) {
  2.         HTablePool pool = new HTablePool(cfg, 1000);
  3.         try {
  4.          Get get = new Get("1".getBytes());// 根据rowkey查询
  5.          Result r = pool.getTable(tableName).get(get); 
  6.  System.out.println("rowkey:" + new String(r.getRow()));
  7.    for (KeyValue keyValue : r.raw()) {
  8.      System.out.println("列:" + new String(keyValue.getFamily()) + " 值:" + new String(keyValue.getValue())); 
  9.    }
  10.         } catch (IOException e) { 
  11.           e.printStackTrace(); 
  12.         } 
  13. }
复制代码


批量查询:
  1. public static void queryAll(String tableName) { 
  2.        HTablePool pool = new HTablePool(cfg, 1000);
  3.         try {
  4.           ResultScanner rs = pool.getTable(tableName).getScanner(new Scan());
  5.           for (Result r : rs) {
  6.           System.out.println("rowkey:" + new String(r.getRow())); 
  7.               for (KeyValue keyValue : r.raw()) {
  8.                   System.out.println("列:" + new String(keyValue.getFamily()) + " 值:" + new String(keyValue.getValue()));
  9.                }
  10.          } 
  11.        } catch (IOException e) {
  12.         e.printStackTrace();
  13.        }
  14. }
复制代码
  1. public static void createTable(String tableName) { System.out.println("************start create table**********"); try {  HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建
  2.         hBaseAdmin.disableTable(tableName);        hBaseAdmin.deleteTable(tableName);        System.out.println(tableName + " is exist"); } HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);// 代表表的schema  tableDescriptor.addFamily(new HColumnDescriptor("name")); //增加列簇  tableDescriptor.addFamily(new HColumnDescriptor("age")); tableDescriptor.addFamily(new HColumnDescriptor("gender")); hBaseAdmin.createTable(tableDescriptor); } catch (MasterNotRunningException e) { e.printStackTrace(); } catch (ZooKeeperConnectionException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("*****end create table*************"); } 0
复制代码
结果如下:
   rowkey:1 
列:age 值:20 
列:gender 值:female 
列:name 值:wish 
rowkey:112233bbbcccc 
列:age 值:20 
列:gender 值:female 
列:name 值:wish 
rowkey:2 
列:age 值:20 
列:gender 值:female 
列:name 值:rain 

删除数据

  使用HTable的delete删除数据:
  public void delete(final Delete delete)

  eg:
  1. public static void createTable(String tableName) { System.out.println("************start create table**********"); try {  HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建
  2.         hBaseAdmin.disableTable(tableName);        hBaseAdmin.deleteTable(tableName);        System.out.println(tableName + " is exist"); } HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);// 代表表的schema  tableDescriptor.addFamily(new HColumnDescriptor("name")); //增加列簇  tableDescriptor.addFamily(new HColumnDescriptor("age")); tableDescriptor.addFamily(new HColumnDescriptor("gender")); hBaseAdmin.createTable(tableDescriptor); } catch (MasterNotRunningException e) { e.printStackTrace(); } catch (ZooKeeperConnectionException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("*****end create table*************"); } 1
复制代码
结果如下:
  ****************************删除前数据**********************
  rowkey:1 
列:age 值:20 
列:gender 值:female 
列:name 值:wish 
rowkey:112233bbbcccc 
列:age 值:20 
列:gender 值:female 
列:name 值:wish 
rowkey:2 
列:age 值:20 
列:gender 值:female 
列:name 值:rain 
删除行成功! 
****************************删除后数据********************** 
rowkey:1 
列:age 值:20 
列:gender 值:female 
列:name 值:wish 
rowkey:2 
列:age 值:20 
列:gender 值:female 
列:name 值:rain 

删除表

    和hbase shell中类似,删除表前需要先disable表 ;分别使用disableTable和deleteTable来删除和禁用表 
同创建表一样需要使用HbaseAdmin
eg:
  1. public static void createTable(String tableName) { System.out.println("************start create table**********"); try {  HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建
  2.         hBaseAdmin.disableTable(tableName);        hBaseAdmin.deleteTable(tableName);        System.out.println(tableName + " is exist"); } HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);// 代表表的schema  tableDescriptor.addFamily(new HColumnDescriptor("name")); //增加列簇  tableDescriptor.addFamily(new HColumnDescriptor("age")); tableDescriptor.addFamily(new HColumnDescriptor("gender")); hBaseAdmin.createTable(tableDescriptor); } catch (MasterNotRunningException e) { e.printStackTrace(); } catch (ZooKeeperConnectionException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("*****end create table*************"); } 2
复制代码
结果:
  table: wishTest删除成功!

完整代码

  1. public static void createTable(String tableName) { System.out.println("************start create table**********"); try {  HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建
  2.         hBaseAdmin.disableTable(tableName);        hBaseAdmin.deleteTable(tableName);        System.out.println(tableName + " is exist"); } HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);// 代表表的schema  tableDescriptor.addFamily(new HColumnDescriptor("name")); //增加列簇  tableDescriptor.addFamily(new HColumnDescriptor("age")); tableDescriptor.addFamily(new HColumnDescriptor("gender")); hBaseAdmin.createTable(tableDescriptor); } catch (MasterNotRunningException e) { e.printStackTrace(); } catch (ZooKeeperConnectionException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("*****end create table*************"); } 3
复制代码