hbase笔记-----基础

默认情况下hbase会将存储写入本地文件系统,因此,如果要使用hbase集群,首先需要将hbase的存储配置为指向所要使用的hdfs集群

一、hbase简单命令

start-hbase.sh启动hbase

hbase shell启动hbase的外壳程序

create  'table' , 'column family' , 'column family' , ...创建表

list显示表

put 'table' , 'row_key' , 'column family:column' , 'value'向指定表插入数据,需要指定行键,列簇:列,和具体的值

disable ‘table’设置表为离线

drop 'table'删除表

stop-hbase.sh关闭hbase

二、客户端

java

可以通过java来对hbase进行操作,具体细节待补充

MapReduce

org.apache.hadoop.hbase.mapreduce包中的类和工具有利于将hbase作为MapReduce作业的源或者输出

TableInputFormat类可以在区域的边界进行分割,使map任务能够拿到单个的区域进行处理。TableOutputFormat将reduce的结果写入hbase

三、Table中Family和Qualifier的介绍及如何设置-----这部分介绍来自于http://www.aboutyun.com/thread-8830-1-1.html

1、Table中Family和Qualifier的关系与区别
就像用MySQL一样,我们要做的是表设计,MySQL中的表,行,列的在HBase已经有所区别了,在HBase中主要是Table和Family和Qualifier,这三个概念。Table可以直接理解为表,而Family和Qualifier其实都可以理解为列,一个Family下面可以有多个Qualifier,所以可以简单的理解为,HBase中的列是二级列,也就是说Family是第一级列,Qualifier是第二级列。两个是父子关系。
2、谈谈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笔记-----基础)