--------------------------------------------------------------------------------------

[版权申明:本文系作者原创,转载请注明出处]

文章出处:http://blog.csdn.net/sdksdk0/article/details/51680296

作者: 朱培              ID:sdksdk0

-----------------------------------------------------------------------------------

一、HBase简介

1.1简介

hbase是bigtable的开源山寨版本。是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。

它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。主要用来存储非结构化和半结构化的松散数据。与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。

HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族(row family)。

1.2 Hbase与传统数据库的对比

我们可以先来看一下传统的关系型数据库中的表:

然后与HBase的表进行对比,hbase的表结构,与传统的关系型数据库有较大的差别

我们就可以发现很多不同地方:

hbase不支持sql语句,它是一个nosql的一种,如果没有学过nosql或rubey,我们可以用help





1、定义表时不指定字段

2、定义表的时候只要指定列族名,列族数量不限

3、每一行都有一个固定的字段(行键),具有唯一性

4、对值的修改,原来的值是保留着的,每个值可以保留多个版本。默认查询的是最新版本的的值。(默认保留一个版本)

1.3 HBase中的重要概念

列族: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中的数据是没有类型的,全部是字节码形式存贮。

二、HBase体系结构






1、一个表会按照行划分为若干个region,每一个region分配给一台特定的regionserver管理

2、每一个region内部还要一句列族划分为若干个HStore

3、每个HStore中的数据会落地到若干个HFILE文件中

4、region体积会随着数据插入而不断增长,到一定阈值后悔分裂

5、随着region的分裂,一台regionserver上管理的region会越来越多

6、HMASTER会根据regionserver上管理的region数做负载均衡

7、region中的数据拥有一个内存缓存:memstore,数据的访问优先在memstore中进行

8、memstore中的数据因为空间有限,所以需要定期flush到文件storefile中,每次flush都是生成新的storefile

9、storefile的数量随着时间也会不断增加,regionserver会定期将大量storefile进行合并(merge)





行键的设计对数据查询效率的影响非常大。
HBase具有很好的可伸缩性:如果存储容量不够的时候,直接加datanode或者regionservers

hbase可以作为一个线上系统的底层系统的功能。



Hmaster可以做负载均衡,监控到各个节点之间的数据存储情况。

每一个store(列族)会有一个内存缓存,存放的是一些最热的数据(最近访问的),这样的话读取数据的速度会快很多。



文件都是有索引的,所以查起来会比较快的。


region会在storefile定期进行合并操作。

三、HBase环境搭建

1、首先要去下载一个HBase的安装文件:http://hbase.apache.org/,然后解压到你需要安装的目录,如果你已经学到hbase了,我相信这些基本的安装肯定全部都会了的。
2、在habse目录下的conf目录下找到hbase-env.sh和hbase-site.xml,以及regionservers,然后分别按照下面的进行配置,整个配置过程非常简单。

在hbase-env.sh中,主要是配置java的环境变量,还有就是要开启zookeeper功能,这里要把默认的true改成的false,意思就是启用zookeeper,但是启用的不是hbase自带的zookeeper,而是使用我自己安装的zookeeper。


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>

3、最后修改regionservers,将默认的localhost修改为主机的地址,这个配置文件的意思就是设置从节点,和我们之前配置的hadoop集群都是差不多的,就相当于那个salver。

ubuntu1
ubuntu2
ubuntu3
4、最后将hadoop中的core-site.xml和hdfs-site.xml拷贝到hbase的conf目录下。
5、然后通过scp将这个配置好的文件发往其他的两个节点。


最后我只想说一句不要在这配置文件里面多打了字母,否则会报错的。
1、启动所有的hbase进程

首先启动zk集群

./zkServer.sh start

启动hbase集群

start-dfs.sh

启动hbase,在主节点上运行:

start-hbase.sh

2、 通过浏览器访问hbase管理页面

192.168.44.131:60010

3、 为保证集群的可靠性,要启动多个HMaster

hbase-daemon.sh start master



jps在主节点上面的效果是:会启动HRegionServer和HMaster



其他的子节点就只启动HRegionServer进程


我们可以通过web页面查看启动的情况:192.168.44.131:60010,也就是你的主节点的ip或主机名+端口号60010就可以了。



四、HBase   shell的使用

4.1 启动

bhase shell的启用只要运行
 bin/hbase shell

我们首先来show database一下,从图片上面,我们可以看到有错误,也即使说hbase不支持sql的语法,这点我们前面已经说到了。那么我们就可以输入help命令来查看hbase的基本语句语法了。





4.2 建表

官方给的例子是:
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'}}

那么我们就以例子为准,来新建一个用户信息表。表名为user-info,包含两个列族(base_info和extra_info),保留3个版本。


create 'user-info',{NAME=>'base_info',VERSIONS=>3},{NAME=>'extra_info'}

4.3 插入

官方给的语句是:

hbase> put 'ns1:t1', 'r1', 'c1', 'value', ts1

那么我们就按照它的语法来写:
 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','湖南长沙'

在hbase只能一条条的插入,就比如一次只能插入name,那么如果我们想插入age,address就需要一个个的put。

4.4 查询

1、我们可以通过scan来查询:
 scan 'user-info'


我们可以从图中看到它是按key来排序的(字段的名称会根据字典排序)k-value



如果我再插入一行,

put 'user-info','rk100003','base_info:name','angelabby'



一行中的所有字段名+字段值,在存储的时候,hbase会排序,排序的依据是按照K的字典顺序,所有的行也会有序存储,排序的依据是rowkey的字典顺序。

这个特性会影响连续存放。


2、get取数据,一次只能取一行数据

get 'user-info','rk100003'

4.5 修改

三个版本:

 put 'user-info','rk100003','base_info:name',’yangying'
put 'user-info','rk100003','base_info:name','baobao'

查看以前版本的值:

scan 'user-info',{VERSIONS=>10}


4.6 删除

需要先禁用这个表,然后才可以drop掉。
需要先禁用这个表,然后才可以drop掉。
disable 'user-info'
drop 'user-info'

五、eclipse中使用HBase

打开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(); }

最后我们可以在hbase的shell窗口来查看表是否已建好表。输入list就可以查询了

然后来插入数据:

	@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的shell窗口来查看表是否已插入好数据。

到此,HBase的环境配置及其基本的使用以及分享完毕!如果想进一步学习相关知识,欢迎关注,如果对Hbase有什么疑问的地方欢迎留言!

HBase非常适用于大量的数据存储,因为它是一张非常大的表,可以有无数个列族,可以不断的扩展,这个特点是传统的mysql,oracle等关系型数据库是无法比拟的!

HBase的环境配置及其应用的更多相关文章

  1. hbase centOS生产环境配置笔记 (1 NameNode, 1 ResourceManager, 3 DataNode)

    本次是第一次在生产环境部署HBase,本文若有配置上的不妥之处还请高手指正. hadoop版本:hadoop-2.4.1 HBase版本:hbase-0.98.6.1-hadoop2 Zookeepe ...

  2. hbase单机环境的搭建和完全分布式Hbase集群安装配置

    HBase 是一个开源的非关系(NoSQL)的可伸缩性分布式数据库.它是面向列的,并适合于存储超大型松散数据.HBase适合于实时,随机对Big数据进行读写操作的业务环境. @hbase单机环境的搭建 ...

  3. HBase 学习之路(四)—— HBase集群环境配置

    一.集群规划 这里搭建一个3节点的HBase集群,其中三台主机上均为Regin Server.同时为了保证高可用,除了在hadoop001上部署主Master服务外,还在hadoop002上部署备用的 ...

  4. HBase 系列(四)—— HBase 集群环境配置

    一.集群规划 这里搭建一个 3 节点的 HBase 集群,其中三台主机上均为 Regin Server.同时为了保证高可用,除了在 hadoop001 上部署主 Master 服务外,还在 hadoo ...

  5. 基于Eclipse的Hadoop应用开发环境配置

    基于Eclipse的Hadoop应用开发环境配置 我的开发环境: 操作系统ubuntu11.10 单机模式 Hadoop版本:hadoop-0.20.1 Eclipse版本:eclipse-java- ...

  6. Hive在集群环境配置

    本文转载自:https://blog.csdn.net/hanjin7278/article/details/53035739 一.简介 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数 ...

  7. Hbase简介安装配置

    HBase —— Hadoop Database的简称 ,hbase 是分布式,稀疏的,持久化的,多维有序映射,它基于行键rowkey,列键column key,时间戳timestamp建立索引.它是 ...

  8. hbase安装与配置-分布式

    HBASE安装与配置 备注: 1:本文在hadoop的完全分布式基础上部署hbase 2:本文使用的是小博主自己搭建的zookpeer服务,未使用hbase本身的zookpeer服务 本文内容在以下前 ...

  9. eclipse+hbase开发环境部署

    一.前言 1. 前提 因为hbase的运行模式是伪分布式,需要用到hdfs,所以在此之前,我已经完成了hadoop-eclipse的开发环境搭建,详细看另一篇文章:hadoop开发环境部署——通过ec ...

随机推荐

  1. 众说纷纭的ul、ol、li

    (1)提到ul ol li,大家都知道,就是三个列表标签,ul表示无需列表(unordered list),ol表示有序列表(oredr list), li 表示列表项(list item),之前我也 ...

  2. php一句话反弹bash shell

    来源:https://www.leavesongs.com/PHP/backshell-via-php.html 用到了,记录一下 $sock = fsockopen($ip, $port); $de ...

  3. 【HNOI2017】影魔

    题目描述 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄. 每一个灵魂,都有着自 ...

  4. [Codeforces]856C - Eleventh Birthday

    题目大意:给出n个数,问有多少种排列把数字接起来是11的倍数.(n<=2000) 做法:一个数后面接一个数等同于乘上10的若干次幂然后加上这个数,10模11等于-1,所以10的若干次幂是-1或1 ...

  5. Codeforces 802L Send the Fool Further! (hard)

    Description 题面 题目大意:求从根节点出发,每次随机走一个相邻的点,问走到任意一个叶子节点经过的路径长度的期望(走到就停止) Solution 树上高斯消元,复杂度是 \(O(n)\) 的 ...

  6. CSAPP-链接

    主要任务: 1.符号解析 在声明变量和函数之后,所有的符号声明都被保存到符号表. 而符号解析阶段会给每个符号一个定义. 2.重定位: 把每个符号的定义与一个内存位置关联起来,然后修改所有对这些符号的引 ...

  7. 【bzoj4567 scoi2016】 背单词

    题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...

  8. bzoj4830 hnoi2017 抛硬币

    题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...

  9. 例10-1 uva11582(裴波那切数列)

    题意:你的任务是计算f(a^b)除以n的余数.其中f(0)=f(1)=1,且对于所有非负整数i,f(i+2)=f(i+1)+f(i). 思路: 由于是模运算,因此整个序列肯定会出现重复序列,所以先找出 ...

  10. bzoj2007 NOI2010 网络流转对偶图

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2775  Solved: 1331[Submit][Status] ...