HBase CRUD Get

Submitted by Lizhe on Sun, 04/30/2017 - 23:10

HTable类提供了get()方法

我们可以一次获取一条数据或者多条

如果不设置时间戳的话,默认会返回最新版本

get.setTimeStamp(1493569159412l); 会帮助你获取一个指定的时间戳数据

get.setTimeRange(1l, 1493569168382l); 会得到 >=1 和 < 1493569168382 的最大时间戳的数据,下面的数据内容使用上面的时间戳范围会得到data1-2, 因为最大时间戳为不包含

HBase CRUD Put

Submitted by Lizhe on Sat, 04/29/2017 - 19:51

HBase 通过org.apache.hadoop.hbase.client 包中的HTable类提供存储,检索和删除数据的基本功能

所有对数据的操作都以行为级别保证了原子性, 当许多客户端需要同时修改同一行时会产生问题,

应该使用batch来更新减少单独操作同一行数据的次数.

在创建HTable实例时,每个实例都需要扫描.META.表, 以检查该表是否存在,可用.

推荐用户只创建一个或是为每个线程只创建一个HTable实例 (当然在Java环境中我们还是推荐对所有对象在可能的情况下都采用单例模式)

存取数据的主要方法如下

public Put add(byte [] family, byte [] qualifier, byte [] value)

public List<Cell> get(byte[] family, byte[] qualifier)

Cell类实现了KeyValue接口, 代表了一个唯一的数据单元格,使用行键,列簇,列限定符,时间戳指向一个单元格的值.

HBase 分区 (region)

Submitted by Lizhe on Thu, 04/27/2017 - 17:47

HBase中扩展和负载均衡的基本单元称为region 

region是使用rowkey进行排序的连续存储空间 ( HBase的region和HDFS中的文件不是一个概念)

一个table一开始只有一个region,随着存储数据的增长而增加

每个region只会由一个region server加载, 一个region server一般(最佳) 加载10~1000ge 个region

当存储的数据大小超过配置的最大值时, region会采取一种"分裂"的机制来让自己变成2个region

(系统会在middle key处将region拆分成两个)

 

再强调一次

HBase的region和HDFS中的文件不是一个概念

region在拆分后,仍然会使用原来的存储文件, 直到合并动作(需要离线后使用工具)运行后,把存储文件异步地写成独立的文件

HBase 线程数和文件描述符设置

Submitted by Lizhe on Thu, 04/27/2017 - 17:25

HBase和Mapreduce使用HDFS的方式不同, Mapreduce在工作时会先打开文件,运行结束后会关闭这个文件流

但HBase在启动时就会打开所有需要使用到的表文件,并且这些文件会在运行期间一直处在打开状态

如果表中的列特别多,可能会超出系统的文件描述符设置

一个100个区域,每个区域10个列簇,每个列簇2个flush file的情况会使用到 100*10*2=2000个文件描述符

而在linux系统中一个进程默认只能打开1024个文件描述符

超出1024会导致"Too many open files" 错误发生,可以通过下面的方式修改最大限制

vi /etc/security/limits.conf

Hbase Mapreduce 从Hbase读写

Submitted by Lizhe on Thu, 04/27/2017 - 02:02

下面这个例子中我使用TableMapper从HBase中读入一个表的所有数据

然后使用TableReducer将这些数据做一些修改,最后存入到另一个表中

用于演示如何通过Mapreduce存取HBase中的数据内容

package hbase.count;

import java.io.IOException;
import java.util.List;