标签:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
hbase是bigtable的开源山寨版本。是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。
它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。主要用来存储非结构化和半结构化的松散数据。与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族(row family)。
我们可以先来看一下传统的关系型数据库中的表:
然后与HBase的表进行对比,hbase的表结构,与传统的关系型数据库有较大的差别
我们就可以发现很多不同地方:
hbase不支持sql语句,它是一个nosql的一种,如果没有学过nosql或rubey,我们可以用help
1、定义表时不指定字段
2、定义表的时候只要指定列族名,列族数量不限
3、每一行都有一个固定的字段(行键),具有唯一性
4、对值的修改,原来的值是保留着的,每个值可以保留多个版本。默认查询的是最新版本的的值。(默认保留一个版本)
列族:hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如courses:history , courses:math 都属于 courses 这个列族。
访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因 为隐私的原因不能浏览所有数据)。
时间戳:HBase中通过row和columns确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
Cell:由{row key, column( =<family> + <label>),version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64 export HBASE_MANAGES_ZK=false
在hbase-site.xml中,主要就是配置hdfs的主机地址,还有下面的ubuntu1,2,3就是zookeeper的主机名个端口2181,不同的机器可以酌情配置。
configuration> <property> <name>hbase.rootdir</name> <value>hdfs://ubuntu2:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>ubuntu1:2181,ubuntu2:2181,ubuntu3:2181</value> </property> </configuration>
ubuntu1 ubuntu2 ubuntu3
bin/hbase shell我们首先来show database一下,从图片上面,我们可以看到有错误,也即使说hbase不支持sql的语法,这点我们前面已经说到了。那么我们就可以输入help命令来查看hbase的基本语句语法了。
Examples: hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40'] hbase> create 't1', 'f1', SPLITS => ['10', '20', '30', '40'] hbase> create 't1', 'f1', SPLITS_FILE => 'splits.txt', OWNER => 'johndoe' hbase> create 't1', {NAME => 'f1', VERSIONS => 5}, METADATA => { 'mykey' => 'myvalue' } hbase> # Optionally pre-split the table into NUMREGIONS, using hbase> # SPLITALGO ("HexStringSplit", "UniformSplit" or classname) hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'} hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit', CONFIGURATION => {'hbase.hregion.scan.loadColumnFamiliesOnDemand' => 'true'}}
create 'user-info',{NAME=>'base_info',VERSIONS=>3},{NAME=>'extra_info'}
put 'user-info','rk-100001','base_info:name','张s' put 'user-info','rk-100001','base_info:age','20' put 'user-info','rk-100001','base_info:address','湖南长沙'
scan 'user-info'
get 'user-info','rk100003'
put 'user-info','rk100003','base_info:name',’yangying' put 'user-info','rk100003','base_info:name','baobao'
scan 'user-info',{VERSIONS=>10}
需要先禁用这个表,然后才可以drop掉。 disable 'user-info' drop 'user-info'
打开eclipse,导入hbase/lib中的所有包。然后就可以愉快的开始写了,这里以在eclipse中庸hbase建表和插入数据为例:
//建表,DDL操作 public static void main(String[] args) throws MasterNotRunningException, ZooKeeperConnectionException, IOException { // Configuration conf=new Configuration(); //会加载hbase-site.xml配置文件 Configuration conf=HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum","ubuntu1:2181,ubuntu2:2181,ubuntu3:2181"); HBaseAdmin admin=new HBaseAdmin(conf); TableName name = TableName.valueOf("user-info"); HTableDescriptor tableDescriptor=new HTableDescriptor(name); //创建列名 HColumnDescriptor base_info = new HColumnDescriptor("base_info"); //给列族增加版本约束 base_info.setMaxVersions(3); //将列族添加到表描述对象中 tableDescriptor.addFamily(base_info); //用createTable方法创建一个tabelDescriptor所描述的对象 admin.createTable(tableDescriptor); //关闭连接 admin.close(); }
@Test //插入数据,属于DML操作 public void Put() throws IOException{ Configuration conf=HBaseConfiguration.create(); conf.set("hbase.zookeeper.quorum","ubuntu1:2181,ubuntu2:2181,ubuntu3:2181"); HTable hTable = new HTable(conf,"user-info"); Put put=new Put(Bytes.toBytes("rk-10001")); put.add("base_info".getBytes(),"name".getBytes(),"wangming".getBytes()); put.add("base_info".getBytes(),"age".getBytes(),"20".getBytes()); hTable.put(put); hTable.close(); }
到此,HBase的环境配置及其基本的使用以及分享完毕!如果想进一步学习相关知识,欢迎关注,如果对Hbase有什么疑问的地方欢迎留言!
HBase非常适用于大量的数据存储,因为它是一张非常大的表,可以有无数个列族,可以不断的扩展,这个特点是传统的mysql,oracle等关系型数据库是无法比拟的!
标签:
原文地址:http://blog.csdn.net/sdksdk0/article/details/51680296