HBase客户端API(整理 修改一下)
2015-08-14 10:39
218 查看
1. 创建表:(由master完成) 首先需要获取master地址(master启动时会将地址告诉zookeeper)因而客户端首先会访问zookeeper获取master的地址 client和master通信,然后有master来创建表( 包括表的列簇,是否 cache ,设置存储的最大版本数,是否压缩等 )。 2. 读写删除数据 client与regionserver通信,读写、删除数据 写入和删除数据时讲数据打上不同的标志append,真正的数据删除操作在compact时发生 3. 版本信息 HbaseConfiguration, 表示HBase的配置信息 两种构造函数如下: public HBaseConfiguration() -----------默认的构造方式会从hbase-default.xml和hbase-site.xml中读取配置,如果classpath中没有这两个文件,需要自己配置 public HBaseConfiguration(final Configuration c) static HBaseConfiguration cfg = null; static { Configuration HBASE_CONFIG = new Configuration(); HBASE_CONFIG.set("hbase.zookeeper.quorum", "192.168.1.95"); HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", "2181"); cfg = new HBaseConfiguration(HBASE_CONFIG); } 复制代码 创建表 使用HBaseAdmin对象的createTable方法 public static void createTable(String tableName) { System.out.println("************start create table**********"); try { HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建 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*************"); } 复制代码 public static void main(String[] agrs) { try { String tablename = "wishTest"; HBaseTest.createTable(tablename); } catch (Exception e) { e.printStackTrace(); } } 复制代码 在centos中查看是否创建成功: 网页上查看: HTableDescriptor其他方法如下: 复制代码 setMaxFileSize ,指定最大的 region size setMemStoreFlushSize 指定 memstore flush 到 HDFS 上的文件大小,默认是 64M public void addFamily(final HColumnDescriptor family) 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 public static void insert(String tableName) { System.out.println("************start insert ************"); HTablePool pool = new HTablePool(cfg, 1000); Put put = new Put("1".getBytes());// 一个PUT代表一行数据,每行一个唯一的ROWKEY,此处rowkey为1 put.add("name".getBytes(), null, "wish".getBytes());// 本行数据的第一列 put.add("age".getBytes(), null, "20".getBytes());// 本行数据的第三列 put.add("gender".getBytes(), null, "female".getBytes());// 本行数据的第三列 try { pool.getTable(tableName).put(put); } catch (IOException e) { e.printStackTrace(); } System.out.println("************end insert************"); } 复制代码 public static void main(String[] agrs) { try { String tablename = "wishTest"; HBaseTest.insert(tablename); } catch (Exception e) { e.printStackTrace(); } } 复制代码 日志信息如下: ************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************ 查看插入结果: 查询数据 分为单条查询和批量查询,单条查询通过get查询。 通过HTable的getScanner实现批量查询 public Result get(final Get get) //单条查询 public ResultScanner getScanner(final Scan scan) //批量查询 单条查询: public static void querySingle(String tableName) { HTablePool pool = new HTablePool(cfg, 1000); try { Get get = new Get("1".getBytes());// 根据rowkey查询 Result r = pool.getTable(tableName).get(get); 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(); } } 复制代码 批量查询: public static void queryAll(String tableName) { HTablePool pool = new HTablePool(cfg, 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(); } } 复制代码 public static void createTable(String tableName) { System.out.println("************start create table**********"); try { HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建 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: public static void createTable(String tableName) { System.out.println("************start create table**********"); try { HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建 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: public static void createTable(String tableName) { System.out.println("************start create table**********"); try { HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建 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删除成功! 完整代码 public static void createTable(String tableName) { System.out.println("************start create table**********"); try { HBaseAdmin hBaseAdmin = new HBaseAdmin(cfg); if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建 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 复制代码 |
相关文章推荐
- struts2中actionContext().put到底把东西放哪了
- JSOUP爬虫示例
- java自定义注解与反射
- 拳击游戏(虚函数应用)
- PHP数组处理函数的使用array_push(一)
- Mac 实用工具
- linux的二进制编辑
- Codeforces 570 A. Elections
- c++ cout 格式化输出浮点数、整数及格方法
- Num 35 : HDOJ : 1241 Oil Deposits [ 深度优先搜索算法 ] [ 非回溯 ][ 图论 ]
- android 判断是否支持闪光灯
- hdu 2108 Shape of HDU
- enum 相对 接口、类定义常量的优势
- 数据结构与算法 代码整理:外排序法
- android.support.v4.app.Fragment-Activity
- API网络接口
- 快速排序示例
- springmvc+bootstrap 自动开发模式
- Spring与jdbc连接实现增删改查(二)
- java中两个整数相除得到小数点并保留两位小数的方法