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

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

文章出处: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. MyBatis(1)——快速入门

    MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...

  2. Redis Cluster 4.0 on CentOS 6.9 搭建

    集群简介 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需 ...

  3. 从零开始系列之vue全家桶(2)安装调试插件vue Devtools

    小白安装前提是会用git,会从github上找东西. 第一步: 我们可以先从github上找到vue-devtools的项目,下载到本地.下载vue-devtools链接. 克隆方法:git clon ...

  4. String类中常用的方法(重要)

    1.字符串与字节 public String(byte[] byte); 将全部字节变成字符串 public String (byte[] byte,int offset,int length) 将部 ...

  5. [LeetCode] Remove Comments 移除注释

    Given a C++ program, remove comments from it. The program source is an array where source[i] is the ...

  6. (MariaDB/MySQL)之DML(1):数据插入

    本文目录: 1.insert和replace插入数据 1.1 insert into values() 1.2 insert into set 1.3 insert into select_state ...

  7. [NOI 2014]起床困难综合症

    Description 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过研究相关文献,他找 ...

  8. [WC2006]水管局长数据加强版

    Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...

  9. 成也DP,败也DP(AFO?)

    不知道想说什么.. 从来没写过博客,markdown什么的也不会,凑合着看一下吧. 初中的时候开始搞OI,学了两个月后普及组爆零就退赛了. 初三直升的时候说每个人都要选竞赛,抱着混一混的心态选了信息, ...

  10. bzoj1043[HAOI2008]下落的圆盘 计算几何

    1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1598  Solved: 676[Submit][Stat ...