1. http://www.it165.net/admin/html/201407/3390.html
  2.  
  3. 步骤1:创建一个Configuration对象
       包含了客户端链接Hbase服务所需的全部信息:
       zookeeper位置(我们只有链接到zookeeper才能与hbase通信,master仅负责负载均衡等)
       zookeeper链接超时时间
  4.  
  5. 包含各种配置信息,hbase server zookeeper 访问地址和端口号等。
    Configutation conf = HbaseConfiguration.create();
    create()函数的内部逻辑:
    classpath中加载hbase-default.xmlhbase-site.xml两个文件
    hbase-defaut.xml已经打包到Hbase jar包中
    hbase-site.xml需要添加到class path
    hbase-site.xml将覆盖hbase-default.xml中的同名属性。
  6.  
  7. hbase如何找到并从classpath中获取hbase-site.xml信息 ====》如何检查hbase-site.xml已经在hadoop classpath中了呢? 运行 hadoop classpath | grep hbase
    1 修改hadoop脚本,将Hbase classpath加入
    2 在<hadoop_install>/conf/hadoop-env.sh中设置:
    export HADOOP_CLASSPATH=$HBASE_HOME/*:$HBASE_HOME/conf:$HADOOP_CLASSPATH 两个目录放到hadoop的conf的hadoop.env.sh中
  8.  
  9. 如果已经有了一个Configuration文件,可进行如下操作:
    Configuration newconf = Configuration.create(existingConf);
    用户自定义的配置文件将在已有配置文件之后加载,将覆盖hbase-default.xml hbase-site.xml中的配置
  1. create
  2. public static org.apache.hadoop.conf.Configuration create()
  3. Creates a Configuration with HBase resources
  4. Returns:
  5. a Configuration with HBase resources
  6. create
  7. public static org.apache.hadoop.conf.Configuration create(org.apache.hadoop.conf.Configuration that)
  8. Parameters:
  9. that - Configuration to clone.
  10. Returns:
  11. a Configuration created with the hbase-*.xml files plus the given configuration.
  12.  
  13. 没有直接从路径添加的构造函数,但是可以构造一个 org.apache.hadoop.conf.Configuration
      /**
       * Add a configuration resource.
       *
       * The properties of this resource will override properties of previously
       * added resources, unless they were marked <a href="#Final">final</a>.
       *
       * @param file file-path of resource to be added, the local filesystem is
       *             examined directly to find the resource, without referring to
       *             the classpath.
       */
      public void addResource(Path file) {
        addResourceObject(new Resource(file));
      }

可单独覆盖某一个或多个参数值

Configuration conf = HbaseConfiguration.create();
   conf.set("hbase.zookeeper.quorum", "node1, node2"); 但通常不推荐这么做。 因为需要重新打包,不方便,不如放到配置文件中。

  1.  
  2. 步骤2:创建一个HTable句柄
       提供Configuration对象
    提供待访问Table名称
    HTable table = new HTable(conf, tabName);
  3.  
  4. 》一个table对应一个Htable句柄 这个句柄在org.apache.hadoop.hbase.client.HTable
    》提供了CRUD操作 create read update del
    》提供行级事务,
    不支持多行事务或者表级别事务
    严格的行一致性
    并发读,顺序写。
  5.  
  6. 创建HTable句柄代价很大
    1 扫描.META.表
    2 创建一次,以后尽可能复用
    3 如果需要创建多个HTable句柄,使用HTableTool
  7.  
  8. HTable并非线程安全的,一个线程创建一个即可。
    Htable支持CRUD批处理,非线程安全,仅是为了提高性能。
  9.  
  10. 步骤3:执行相应的操作
    putgetdeletescan
    table.getTableName();
    步骤4:关闭Htable句柄 【句柄不关,会发生内存泄露】
    将内存数据刷新到磁盘上。
    释放各种资源。
    table.close()
  1. package com.jlc.hadoop.hbase.example;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.hbase.HBaseConfiguration;
  7. import org.apache.hadoop.hbase.client.HTable;
  8. import org.apache.hadoop.hbase.client.Put;
  9. import org.apache.hadoop.hbase.util.Bytes;
  10.  
  11. public class PutTest {
  12.  
  13. public static void main(String[] args) throws IOException {
  14. Configuration conf = HBaseConfiguration.create();
  15. HTable hTable = new HTable(conf, "tab1");
  16. System.out.println(Bytes.toString(hTable.getTableName()));
  17.  
  18. //步骤一,创建一个put对象
  19. Put put = new Put(Bytes.toBytes("row1"));
  20.  
  21. //设置cell值
  22. //Put.add(family, column, value)
  23. //Put.add(family, column, timestamp, value)
  24. //Put.add(KeyValue kv) KeyValue 事实上就是封装了 上面四个,看起来简单
  25.  
  26. byte[] family = Bytes.toBytes("fam1");
  27. byte[] qualifier = Bytes.toBytes("col1");
  28. byte[] value = Bytes.toBytes("val2");;
  29. put.add(family, qualifier, value);
  30.  
  31. hTable.put(put);
  32.  
  33. hTable.close();
  34.  
  35. // hbase(main):003:0> scan 'tab1'
  36. // ROW COLUMN+CELL
  37. // row1 column=fam1:col1, timestamp=1395796780021, value=val1
  38. // row2 column=fam1:col1, timestamp=1398305517331, value=val2
  39. // 2 row(s) in 0.0090 seconds
  40. // 若row1 fam1 col1 已经存在,则 scan的时候 显示最新时间戳的那个值,其他的如何获取呢???
  41. // hbase(main):004:0> scan 'tab1'
  42. // ROW COLUMN+CELL
  43. // row1 column=fam1:col1, timestamp=1398305623182, value=val2
  44. // row2 column=fam1:col1, timestamp=1398305517331, value=val2
  45.  
  46. }
  47.  
  48. }
  1. package com.jlc.hadoop.hbase.example;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.apache.hadoop.hbase.HBaseConfiguration;
  6. import org.apache.hadoop.hbase.client.HTable;
  7. import org.apache.hadoop.hbase.util.Bytes;
  8. import org.apache.hadoop.conf.Configuration;
  9.  
  10. public class ConstructHTable {
  11.  
  12. public static void main(String[] args) throws IOException {
  13. Configuration conf = HBaseConfiguration.create();
  14. HTable hTable = new HTable(conf, "tab1");
  15. System.out.println(Bytes.toString(hTable.getTableName()));
  16. hTable.close();
  17. }
  18.  
  19. }
  1. package com.jlc.hadoop.hbase.example;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.hbase.HBaseConfiguration;
  7. import org.apache.hadoop.hbase.client.Delete;
  8. import org.apache.hadoop.hbase.client.Get;
  9. import org.apache.hadoop.hbase.client.HTable;
  10. import org.apache.hadoop.hbase.client.Result;
  11. import org.apache.hadoop.hbase.client.ResultScanner;
  12. import org.apache.hadoop.hbase.client.Scan;
  13. import org.apache.hadoop.hbase.util.Bytes;
  14.  
  15. public class ReadTest {
  16.  
  17. public static void print(Result result){
  18. System.out.println("-----------------------------");
  19. System.out.println("RowId:" + Bytes.toString(result.getRow()));
  20. byte[] val1 = result.getValue(Bytes.toBytes("fam1"), Bytes.toBytes("col1"));
  21. System.out.println("fam1:col1=" + Bytes.toString(val1));
  22. byte[] val2 = result.getValue(Bytes.toBytes("fam1"), Bytes.toBytes("col1"));
  23. System.out.println("fam1:col1=" + Bytes.toString(val2));
  24. }
  25.  
  26. public static void scan(HTable hTable, String startrow,String stoprow) throws IOException{
  27. System.out.println("scaning from " + startrow + " to " + stoprow);
  28.  
  29. Scan scan = new Scan(Bytes.toBytes(startrow), Bytes.toBytes(stoprow)); // 这个限定了row 但怎么限定列呢
  30. //scan.addColumn(family, qualifier)
  31. scan.addColumn(Bytes.toBytes("fam1"), Bytes.toBytes("col1")); // 这个就指明我们仅仅取某个列就行了
  32. ResultScanner scanner = hTable.getScanner(scan); //获取scanner句柄
  33. for (Result result : scanner) {
  34. // byte[] value = result.getValue(family, qualifier)
  35. byte[] value = result.getValue(Bytes.toBytes("fam1"), Bytes.toBytes("col1"));
  36. System.out.println(Bytes.toString(result.getRow()) + "=>" + Bytes.toString(value));
  37. }
  38. scanner.close();// 这个不要忘记哦
  39. }
  40.  
  41. public static void main(String[] args) throws IOException {
  42.  
  43. /*
  44. * 支持的API类型 通过rowkey获取一行数据 通过rowkey集合获取多条记录 扫描整个表或者表的一部分
  45. *
  46. * 扫描表:可指定扫描的范围,[startkey, endkey] 表中数据是按照rowkey排序的
  47. *
  48. * 读取时的注意事项: 1 只读取需要的数据
  49. * [比方我只读取某个columnfamliy里某一个column的数据,指定这一列就行了,不要都读取出来,浪费io] 2
  50. * 尽可能的增加数据约束条件 3 可增加family, column(s) time range 和 max
  51. * versions【我要返回多少个版本号】等约束条件
  52. *
  53. * 接口实例:get.setTimeRange(minStamp, maxStamp) 这个就是增加时间范围, time range
  54. * get.setMaxVersions(maxVersions)get.addFamily(family) 只后去众多familys
  55. * 中的一个familyget.addColumn(family, column)
  56. * 只获取某个family的众多columen中的一个column的数据
  57. */
  58.  
  59. Configuration conf = HBaseConfiguration.create();
  60. HTable hTable = new HTable(conf, "tab1");
  61. System.out.println(Bytes.toString(hTable.getTableName()));
  62.  
  63. // byte[] family = Bytes.toBytes("fam1");
  64. // byte[] qualifier = Bytes.toBytes("col1");
  65. // byte[] value = Bytes.toBytes("val2");;
  66.  
  67. // get example
  68. // Get get = new Get(Bytes.toBytes("row1"));
  69. // Result result = hTable.get(get);
  70. // print(result);
  71.  
  72. //有时候我们不需要整个row里的所有数据,我们可以加以限制 [推荐使用这种限制的]
  73. // get.addColumn(Bytes.toBytes("fam1"), Bytes.toBytes("col1"));
  74. // result = hTable.get(get);
  75. // print(result);
  76.  
  77. // keyvalues={row1/fam1:col1/1398305623182/Put/vlen=4/mvcc=0}
  78. // keyvalues={row1/fam1:col1/1398305623182/Put/vlen=4/mvcc=0}
  79.  
  80. //delete example
  81. //Delete delete = new Delete(Bytes.toBytes("rowtodel"));
  82. //hTable.delete(delete);
  83.  
  84. //Delete delete1 = new Delete(Bytes.toBytes("another row"));
  85. //delete1.deleteColumn(family, qualifier)
  86. //hTable.delete(delete1);
  87.  
  88. //scan example
  89. scan(hTable, "row1", "row3"); //前闭 后开的 要得道前两行,需要指定到第三行
  90. hTable.close();
  91.  
  92. }
  93.  
  94. }

Hbase Java API程序设计步骤的更多相关文章

  1. 【Hbase学习之三】Hbase Java API

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-2.6.5 hbase-0.98.12.1-h ...

  2. hbase java api样例(版本1.3.1,新API)

    hbase版本:1.3.1 目的:HBase新API的使用方法. 尝试并验证了如下几种java api的使用方法. 1.创建表 2.创建表(预分区) 3.单条插入 4.批量插入 5.批量插入(客户端缓 ...

  3. hbase java API跟新数据,创建表

    package hbaseCURD; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import o ...

  4. HBase 学习之路(六)——HBase Java API 的基本使用

    一.简述 截至到目前(2019.04),HBase 有两个主要的版本,分别是1.x 和 2.x ,两个版本的Java API有所不同,1.x 中某些方法在2.x中被标识为@deprecated过时.所 ...

  5. HBase 系列(六)——HBase Java API 的基本使用

    一.简述 截至到目前 (2019.04),HBase 有两个主要的版本,分别是 1.x 和 2.x ,两个版本的 Java API 有所不同,1.x 中某些方法在 2.x 中被标识为 @depreca ...

  6. Hbase Java API详解

    HBase是Hadoop的数据库,能够对大数据提供随机.实时读写访问.他是开源的,分布式的,多版本的,面向列的,存储模型. 在讲解的时候我首先给大家讲解一下HBase的整体结构,如下图: HBase ...

  7. HBase Java API使用(一)

    前言 1. 创建表:(由master完成) 首先需要获取master地址(master启动时会将地址告诉zookeeper)因而客户端首先会访问zookeeper获取master的地址 client和 ...

  8. Hbase(六) hbase Java API

    一. 几个主要 Hbase API 类和数据模型之间的对应关系: 1. HBaseAdmin关系: org.apache.hadoop.hbase.client.HBaseAdmin作用:提供了一个接 ...

  9. Hbase Java API包括协处理器统计行数

    package com.zy; import java.io.IOException; import org.apache.commons.lang.time.StopWatch; import or ...

随机推荐

  1. 【Apache Kafka】安装指南

    在Ubuntu12.04 server上安装单结点kafka,我的机器上之前已经安装过zookeeper-3.4.5 根据官网的说明:http://kafka.apache.org/07/quicks ...

  2. Android网络:HTTP之利用HttpURLConnection访问网页、获取网络图片实例 (附源码)

    http://blog.csdn.net/yanzi1225627/article/details/22222735 如前文所示的TCP局域网传送东西,除了对传输层的TCP/UDP支持良好外,Andr ...

  3. SOA是什么

    一.SOA是什么   SOA的全称是Service-Oriented Architecture,面向服务架构.是一种架构,不是一种具体的开发技术.   要真正理解什么是SOA需要从软件开发的技术发展史 ...

  4. IDEA下安装/配置Jrebel

    IDEA下安装/配置Jrebel6.X 1. 为什么要使用Jrebel 在日常开发过程中, 一旦修改配置/在类中增加静态变量/增加方法/修改方法名等情况, tomcat不会自动加载, 需要重启tomc ...

  5. linux sed使用

    原文引用:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html [root@www ~]# sed [-nefr] [动作] ...

  6. 根据文件夹的GUid找到该文件夹

    Guid guid = Guid.Parse(folderGuID); SPFolder folder = list.Folders[guid].Folder;

  7. [时间操作] C#DateFormat时间帮助类 (转载)

    点击下载 DateFormat.rar 主要功能如下 返回每月的第一天和最后一天 看下面代码吧 /// <summary> /// 类说明:时间操作类 /// 编 码 人:苏飞 /// 联 ...

  8. asp.net <%%> <%#%><%=%><%@%><%$%>用法与区别

    1.<% %>用来绑定后台代码 如: < % for(int i=0;i<100;i++) { Reaponse.Write(i.ToString()); } %> 2. ...

  9. c语言学习之基础知识点介绍(八):函数的基本用法

    本节开始说函数. 一.函数的基本用法  /* 作用:可以实现代码的复用,在一定程度上解决代码冗余的问题:方便后期维护. 语法: void 函数名(){ 函数体; } 函数命名要有意义,遵守驼峰命名法. ...

  10. SQL学习:查询的用法(1)

    在SQL servre的使用中,查询的用法是最多的.最重要的,也是最难学习的,因此掌握查询的用法很重要. 先将表的示例上图 员工表: 部门表:                             ...