首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hbase中Region,Split,Store的关系

在Hbase中split是一个很重要的功能,Hbase是通过把数据分配到一定数量的region来达到负载均衡的。一个table会被分配到一个或多个region中,这些region会被分配到一个或者多个regionServer中。在自动split策略中,当一个region达到一定的大小就会自动split成两个region。table在region中是按照row key来排序的,并且一个row key所对应的行只会存储在一个region中,这一点保证了Hbase的强一致性 。

在一个region中有一个或多个stroe,每个stroe对应一个column families(列族)。一个store中包含一个memstore和或 多个store files。每个column family是分开存放和分开访问的。

概念:

1、Split决定数据放到哪一个region(区)的一种策略,默认为当前文件大于10G时进行分割。

2、region是hbase的一个存储区域,如果设置为本地存储,一般为一个目录。如以下表有四个regions:

则查看本地目录:

drwxrwxr-x. 4 wangjian wangjian 60 6月18 17:27 73c271f026da046b6bc91e930c9a2d1b

drwxrwxr-x. 5 wangjian wangjian 72 6月18 18:23 7d831c1fa9687c6a10f5376e6e0f6210

drwxrwxr-x. 4 wangjian wangjian 60 6月18 17:27 e1a4395701a713510b10e144d734009e

正好对应有四个目录。

3、Store就是一个Column Family, 即一个Store就是一个列族。

经过上面的分析,Spit,Region,Store的关系为:

2、关于保存到hbase中的中文转成ascii码的形式

将中文保存到HBase数据库中。会出如:\xhh这样的形式。为什么呢?

首先需要说明的是hbase中保存的都是字节码,在保存过的过程中,会将字节码转成ascii码的形式加以保存。

以下保存一个”张”字到hbase数据库中:

hbase(main):004:0> put "t2",'S003',"info:name","张"

0 row(s) in 0.0670 seconds

然后查询:

hbase(main):006:0> get "t2","S003"

COLUMN CELL

info:name timestamp=1529327955211, value=\xE5\xBC\xA0

1 row(s) in 0.0690 seconds

查到的数据可见为:\xE5\xBC\xA0。

关于Ascii见下表的说明:

注意,最后一个\xhh,就是表示任意字符的ascii码。现在我们写一下段Java代码,将”张”字的字节码转成十六进制:

Stringname="张";

byte[]bs=name.getBytes();

for(byteb:bs) {

}

获取到的结果为:

ffffffe5

ffffffbc

ffffffa0

现在我们将前面的6个进行与运算。然后再转成大写:

Stringname="张";

Stringstr="";

byte[]bs=name.getBytes();

for(byteb:bs) {

Stringtem= Integer.toHexString(b& 0xff);

str+="\\x"+tem.toUpperCase();

}

输出的结果为:

\xE5\xBC\xA0

现在再比较一下保存到Hbase中的数据,是不是相同的结果:

hbase(main):006:0> get "t2","S003"

COLUMN CELL

info:name timestamp=1529327955211, value=\xE5\xBC\xA0

在Java代码中,连接Hbase读取到的值可以直接转回成中文形式:

用于连接Hbase的公共代码:

publicclassHBaseConnection {

protectedHBaseAdminhbaseadmin;

protectedConnectionconnection;

publicHBaseConnection()throwsException {

Configurationconf= HBaseConfiguration.create();

connection= ConnectionFactory.createConnection(conf);

Adminadmin=connection.getAdmin();

if(admininstanceofHBaseAdmin) {

this.hbaseadmin= (HBaseAdmin)admin;

}

}

publicvoidclose()throwsException{

hbaseadmin.close();

connection.close();

}

}

用于查询的测试代码:

/**

* 使用Get对象查询,查询一个中文的值

*/

publicclassDemo08_ReadChineseextendsHBaseConnection {

publicDemo08_ReadChinese()throwsException {

Tabletable=connection.getTable(TableName.valueOf("t2"));

Getget=newGet("S003".getBytes());//参数为行键

Resultresult=table.get(get);

byte[]bs=result.getValue("info".getBytes(),"name".getBytes());

Stringstr= Bytes.toString(bs);

System.out.println(str);//张,可以直接返回中文

table.close();

close();

}

publicstaticvoidmain(String[]args)throwsException {

newDemo08_ReadChinese();

}

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180618G1DNFO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券