`
dalan_123
  • 浏览: 87072 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

HBase系列一

阅读更多
关于hbase
一、客户端类
HTable 和 HTablePool: (1)、HTable用于一个线程创建一个HTable;最好只创建唯一一个HTable对象;因为每次创建HTable实例都需要付出代价;检查meta.表对应的表是否存在,是否可用以及其他
                             的一些操作;对性能的损耗不可忽视的;同时HBase所有的修改操作都是保证行级别的原子性;
   (2)、若是需要多个HTable对象,则考虑使用HTablePool类;操作同一行的记录 最好使用batch操作;以减少单独操作该行的次数
二、CRUD操作
(1)、put方法
    1、void put(Put put) throws IOException;将一个put或者存储在列表中的一组put作为输入参数
   注:构建Put对象
   Put(byte[] row);
   Put(byte[] row, RowLock rowlock);
   Put(byte[] row, long ts);
   Put(byte[] long ts, RowLock rowLock);
   参数说明:RowKey---》row 提供唯一的行键 RowLock--》行级锁  ts---》时间戳
2、byte转换类 Bytes
    static byte[] toBytes(ByteBuffer bb);
static byte[] toBytes(String s);
static byte[] toBytes(boolean b);
static byte[] toBytes(long val);
static byte[] toBytes(float f);
static byte[] toBytes(int val);
3、put的add方法
    Put add(byte[] family, byte[] qualifier,byte[] value);
Put add(byte[] family,byte[] qualifier,long ts, byte[] value);
Put add(KeyValue kv) throws IOException;
    可以通过行键+列族+列限定符+时间戳定位具体的内容
关于ts参数,在通过add进行数据添加时,不指定ts参数内容时,则使用构造函数的ts对应的内容;若是在
构造实例也没有指定ts参数,则有region机器指定
(1)、KeyValue = 行键+列族+列限定符+时间戳
    List<KeyValue> get(byte[] family,byte[] qualifier);
            Map<byte[],List<KeyValue>> getFamilyMap();
(2)、检查单元格是否存在
    boolean has(byte[] family,byte[] qualifier);
boolean has(byte[] family,byte[] qualifier, long ts);
boolean has(byte[] family,byte[] qualifier,byte[] value);
boolean has(byte[] family,byte[] qualifier,long ts,byte[]);
    4、HBase使用
  // 1、创建所需配置
  Configuration conf = HBaseConfiguration.create();
  // 2、实例化客户端
  HTable table = new HTable(conf,"table name");
  // 3、创建put存放数据记录
  // 创建row key
  Put put = new Put(Bytes.toBytes("row_key"));
  // 创建column family
  put.add(Bytes.toBytes("colfam1"),Bytes.toBytes("qual1"));
  put.add(Bytes.toBytes("colfam2"),Bytes.toBytes("qual2"));
  // 4、添加记录到指定的表
  table.put(put);
  以上代码Configuration对应HBase的hbase-site.xml文件(默认情况下程序会从classpath下直接尝试读取
  hbase-default.xml 和 hbase-site.xml)再程序获取到Configuration一般是默认+用户自定义参数合并之后的结果
5、说明
   (a)、关于hbase中的时间戳
    在hbase中有一个特殊的功能,同一个列单元格(特定类的值)可以存在多个版本。就是通过使用时间戳按照降序来存储的,单位为毫秒;该参数可以通过客户端api进行指定,也可以忽略
让服务器端来完成。主要根据实际情况来完成的。这样获取指定的数据时,根据执行的参数可以获取多个。默认情况下只显示最新的那个版本
   (b)、RowLock类
在构造Put实例时会存在一个RowLock参数,特别在某一行记录需要频繁修改时,可以在客户端创建RowLock实例防止用户的修改该行
   (c)、KeyValue类
    数据和坐标都是以byte[]形式存储;目的主要是为了允许存储任意类型的数据,并有效存储所需的字节,保证最少的
内部结构开销;并且每一个字节数据组都有一个offset和length参数,允许用户提交存在的字节数据,并进行高效率的
字节操作。
KeyValue(byte[] row,int offset,int rlength,   -------RowKey
byte[] family, int foffset,int flength, ----Column Family
byte[] qualifier , int qoffset,int qlength,--Qualifier Column
long timestamp,Type type,                  -- Version
byte[] value,int voffset, int vlength)     -- Value
byte[] getRow()
byte[] getKey() 行---》行键  键---指的是单元格的坐标
三、客户端write buffer
由于每一个put操作就是RPC操作;将client数据传输到server后返回,只适合小量数据操作;因而减少RPC调用就需要限制往返时间(round-trip time);也即是
client发送一个request到server,然后server进行网络response的时间。同时消息大小也会影响rpc性能;尽量使用批量处理,减少请求次数。
(1)、开启客户端的写缓冲区
      void setAutoFlush(boolean autoFlush);
  boolean isAutoFlush();
  默认客户端缓存区是禁用的,可以通过设定为false开启缓冲区;不过一旦开启客户端缓冲区,数据进行写入时,需要手动执行
  void flushCommits() throws IOException;
  同时客户端可以手动调整缓冲区;不过更多是通过hbase-site.xml
  <property>
<name>hbase.client.write.buffer</name>
<value>20971520</value>
  </property>
  缓冲区刷写
  1、显示刷写 flushCommits
  2、隐式刷写 通过将当前的缓冲区大小和用户配置大小作比较;若是超出限制则会调用flushCommits方法;若是禁用则需通过setAutoFlush(true)来开启
注:close方法也会触发隐式刷写
        一旦客户端关闭自动刷写;没有手动执行flushCommits那么通过put操作的内容就不会被提交到server端
        ArrayList<Put> getWriteBuffer() 获取添加到缓冲区中的Put实例列表;该列表在HTable不是线程安全的;
        不能在程序运行期终止程序,否则会导致尚未刷写的数据丢失,
  (2)、put 列表
  // 1、put list
      List<Put> puts = new ArrayList<Put>();
  // 2、create put
      Put put1 = new Put(Bytes.toBytes("ROW1"));
      put1.add(Bytes.toBytes("Column1"),Bytes.toBytes("qual1"),Bytes.toBytes("val1"));
  // 3、add put to put list
  puts.add(put1);
 
  Put put2 = new Put(Bytes.toBytes("ROW2"));
      put1.add(Bytes.toBytes("Column1"),Bytes.toBytes("qual1"),Bytes.toBytes("val2"));
  puts.add(put2);
  // 4、执行put操作
  table.put(puts);
  原子性操作 compare-and-set(CAS)
  boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier,byte[] value,Put put)
throws IOException;
五、Scan的使用
    类似RDBMS的游标
    (1)、创建Scan及应用
// 创建Scan
Scan scan = new Scan();
// 指定扫描范围
scan.addColumn(Bytes.toBytes("colfam1"),
   Bytes.toBytes("col-5").addColumn(Bytes.toBytes("colfam1"))
   Bytes.toBytes("col-33").setStartRow(Bytes.toBytes("row-11")).setStopRow(Bytes.toBytes("row-20"))
   );
// 获取ResultScanner
ResultScanner scanner = table.getScanner(scan);
// 迭代变量scanner
for(Result result : scanner){
System.out.println(result);
}
// scanner关闭
scanner.close();
注:获取的内容进行匹配的时候都是按照字典顺序排序的
六、缓存与批量处理
1、设定scanner的缓存
   hbase-site.xml配置
   <property>
<name>hbase.client.scanner.caching</name>
<value>10</value>
   </property>
   程序配置
   void setCaching(int caching);
   int getCaching();
缓存针对的行级的操作
批量是面向列级的操作
RPC请求次数 = (行数 * 每行的列数) / Min(每行列数,批量大小) / 扫描缓存次数(额外加上打开和关闭scanner)
分享到:
评论

相关推荐

    hadoop+hbase系列配置文档

    ### Hadoop与HBase系列配置知识点 #### 一、Hadoop概述 Hadoop是一个由Apache基金会维护的开源软件框架,其主要目标是为了实现可靠、可扩展的分布式计算环境。通过简单编程模型支持大规模数据集在计算机集群上的...

    HBase学习利器:HBase实战

    - **第7章:构建实际应用**:通过一系列具体的案例研究,展示如何使用HBase构建复杂的应用程序,涵盖了从需求分析到系统设计、实现再到测试和部署的全过程。 #### 三、HBase核心技术详解 **1. 数据存储模型**:...

    hbase1.0.3_part1

    HBase是Apache软件基金会的一个开源项目,是一款基于Google Bigtable理念设计的分布式列式数据库,专为大规模数据存储而设计。...然后,用户可以通过创建表、插入数据、执行查询等一系列操作,体验HBase的强大功能。

    HBase源代码 hbase-0.98.23

    行键是唯一的,而列族则包含一系列相关的列。在hbase-0.98.23的源代码中,可以看到`org.apache.hadoop.hbase.regionserver.HRegion`类是处理单个HBase表区域的主要类,其中包含了行键到列族数据的映射。 其次,...

    hbase的hbase-1.2.0-cdh5.14.2.tar.gz资源包

    1. **表(Table)**:HBase中的数据组织在表中,表由行和列族组成,每个表都有一个唯一的名字。 2. **行(Row)**:表中的数据按照行键(Row Key)排序存储。行键是不可变的,用户自定义的字节数组,用于定位数据。 ...

    thrift1 查询hbase

    这个过程涵盖了一系列的技术细节,包括Thrift的原理、HBase的Thrift服务、Python客户端的使用,以及在实际项目中的应用和优化策略。通过提供的博客配套文件,读者可以更深入地学习和实践这一技术。

    hbase安装与hbase架构说明

    每个HRegionServer管理一系列HRegion对象,每个HRegion对应表的一个逻辑分区。HRegion由多个HStore组成,每个HStore对应一个Column Family,提供了一种存储和访问数据的逻辑单元,适合存放具有相似访问模式的列。 ...

    Apache HBase Release 1.0

    HBase 1.0版本的发布标志着该项目的重要里程碑,它是未来1.x系列版本的稳定基础。这个版本旨在至少达到0.98稳定版本的水平,同时避免引入过多新功能,确保了版本的稳定性和可靠性。HBase 1.0版的发布由HBase 1.0版本...

    java-hbase开发包

    1. **HBase客户端API**:这是Java-HBase开发包的核心,提供了一组Java接口和类,用于连接到HBase集群,创建表,插入、查询和更新数据。例如,`HTableInterface` 和 `HBaseAdmin` 接口,以及 `Put`、`Get` 和 `Scan` ...

    hbase-0.94.27.tar.gz

    1. **分布式架构**:HBase采用Master-Slave架构,由一个HMaster主节点负责区域服务器(RegionServer)的管理、故障检测和负载均衡,多个RegionServer存储实际的数据,提供读写服务。 2. **表和列族**:HBase的表是...

    hbase客户端连接工具winutils-2.2.0.zip

    在Java客户端上连接HBase集群时,需要配置一系列的环境和依赖,其中包括了`winutils`工具。`winutils-2.2.0.zip`这个压缩包就是针对Windows用户提供的,用于配置Hadoop环境,以便于与HBase交互。 首先,`winutils....

    hbase安装,节点添加,移除,常见问题解决

    对于`hadoop-2.5.2-hbase-0.14.0-hadoop2`这个版本,它适用于Hadoop 2.x系列,这是Hadoop的一个重要版本,引入了YARN资源管理器,提高了集群的效率和可扩展性。 HBase的安装通常包括以下几个步骤: 1. 下载HBase的...

    hadoop hbase 全jar包

    在HBase的开发中,常常需要使用到一系列的jar包,这些jar包涵盖了HBase本身及其依赖的库,如Hadoop的相关组件。Hadoop的jar包通常包含Hadoop Common、Hadoop HDFS、Hadoop MapReduce等模块,它们提供了Hadoop的基本...

    HBase Introduction

    - **区域划分**:表被划分为多个区域(table shards),每个区域包含一系列连续的行键。区域由起始和结束行键定义。 ##### 2. 分布与分配 - **分布单位**:区域是HBase集群中数据分布的基本单位。 - **分配策略**:...

    大数据云计算技术系列 Hadoop之Hbase从入门到精通(共243页).pdf

    《大数据云计算技术系列:Hadoop之Hbase从入门到精通》 HBase,全称Hadoop Database,是一款基于Hadoop生态系统的分布式列式存储系统,旨在处理海量结构化数据。它借鉴了Google Bigtable的设计思想,但开源并适应了...

    Hbase1.x可视化客户端工具

    在HBase 1.x版本中,为了便于用户更直观地管理和操作HBase表,开发了一系列的可视化客户端工具。这些工具不仅简化了命令行操作的复杂性,还通过图形化的界面使得数据查询和管理变得更加友好。 首先,我们要了解...

    hbase-1.2.6-bin.tar.gz

    7. **兼容性**:HBase 1.2.6版本与Hadoop 2.x系列兼容,可以无缝地集成到Hadoop生态系统中,如MapReduce、HDFS和YARN。 **资源获取与安装**: 原始资源位于Apache的官方归档服务器上,地址是:`...

    大数据云计算技术系列 Hadoop之Hbase简介(共19页).pdf

    大数据云计算技术系列 Hbase 简介 一、简介 Hbase源于Chad Walters和Jim在2006年11月提出的BigTable概念,它是一个开源的分布式数据库,最初作为Hadoop贡献项目的一部分在2007年2月创建。2007年10月,Hbase成为首...

    hbase相关的安装包

    HBase提供了一系列的管理和监控工具,例如HBase Shell用于执行管理命令,HBase Master UI用于监控集群状态,以及JMX服务用于远程监控。管理员应定期检查这些工具以确保系统健康运行。 通过理解并熟练掌握这些知识...

Global site tag (gtag.js) - Google Analytics