HBase入门实例: Table中Family和Qualifier的关系与区别

Table中Family和Qualifier的关系与区别

就像用MySQL一样,我们要做的是表设计,MySQL中的表,行,列的在HBase已经有所区别了,在HBase中主要是Table和Family和Qualifier,这三个概念。Table可以直接理解为表,而Family和Qualifier其实都可以理解为列,一个Family下面可以有多个Qualifier,所以可以简单的理解为,HBase中的列是二级列,也就是说Family是第一级列,Qualifier是第二级列。两个是父子关系。

谈谈Table中Family和Qualifier的设置
对于传统关系型数据库中的一张table,在业务转换到hbase上建模时,从性能的角度应该如何设置family和qualifier呢?
最极端的,可以每一列都设置成一个family,也可以只有一个family,但所有列都是其中的一个qualifier,那么有什么区别呢?
family越多,那么获取每一个cell数据的优势越明显,因为io和网络都减少了,而如果只有一个family,那么每一次读都会读取当前rowkey的所有数据,网络和io上会有一些损失。
当然如果要获取的是固定的几列数据,那么把这几列写到一个family中比分别设置family要更好,因为只需一次请求就能拿回所有数据。
以上是从读的方面来考虑的,那么写呢?可以参考一下这篇文章:
http://hbase.apache.org/book/number.of.cfs.html
首先,不同的family是在同一个region下面。而每一个family都会分配一个memstore,所以更多的family会消耗更多的内存。
其次,目前版本的hbase,在flush和compaction都是以region为单位的,也就是说当一个family达到flush条件时,该region的所有family所属的memstore都会flush一次,即使memstore中只有很少的数据也会触发flush而生成小文件。这样就增加了compaction发生的机率,而compaction也是以region为单位的,这样就很容易发生compaction风暴从而降低系统的整体吞吐量。
第三,由于hfile是以family为单位的,因此对于多个family来说,数据被分散到了更多的hfile中,减小了split发生的机率。这是把双刃剑。更少的split会导致该region的体积比较大,由于balance是以region的数目而不是大小为单位来进行的,因此可能会导致balance失效。而从好的方面来说,更少的split会让系统提供更加稳定的在线服务。
上述第三点的好处对于在线应用来说是明显的,而坏处我们可以通过在请求的低谷时间进行人工的split和balance来避免掉。
因此对于写比较多的系统,如果是离线应该,我们尽量只用一个family好了,但如果是在线应用,那还是应该根据应用的情况合理地分配family。

HBase,如果你想要从表获取数据,你可以通过HBase Java API进行操作。首先,你需要创建一个`HTable`实例,这代表了数据库的一个连接。以下是一个基本步骤: 1. **包含依赖**:确保你的项目包含了HBase的JAR文件,或者已经添加到项目的构建路径。 ```java import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.HTable; ``` 2. **配置连接**:通常,你需要提供HBase的配置信息,比如Zookeeper地址等。如果没有设置成默认,可以这样获取配置: ```java Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "your_zookeeper_hosts"); // ZK集群地址 ``` 3. **打开表**:创建并打开HTable对象,指定要操作的表名: ```java HTable table = new HTable(config, "your_table_name"); ``` 4. **查询数据**:你可以使用`get`方法根据行键(row key)获取数据。例如,获取特定行的数据: ```java Get get = new Get(Bytes.toBytes("your_row_key")); // 行键转字节数组 Result result = table.get(get); ``` 5. **解析结果**:`Result`对象包含了该行的所有列及其值。你可以遍历这个结果来获取你需要的信息: ```java for (KeyValue kv : result.list()) { byte[] family = kv.getFamily(); // 列族 byte[] qualifier = kv.getQualifier(); // 列标识符 byte[] value = kv.getValue(); // 值 // 打印或处理数据 } ``` 6. **关闭连接**:完成操作后别忘了关闭HTable: ```java table.close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值