好程序员大数据分享:Hbase精解

好程序员大数据分享:Hbase精解,为何有hbase?hbase是什么?Hbase的架构。java

 

  1、 为何有hbase?mysql

 

  数据量愈来愈大,传统的关系型数据库不能知足存储和查询的需求。而hive虽然能知足存储的要求,可是hive不能知足非结构化、半结构化数据的存储和查询。linux

 

  2、hbase是什么?程序员

 

hbase是一个开源的、分布式的、多版本的、可扩展的非关系型数据库。hbase是bigtable的开源java版本,创建在hdfs之上,提供高可靠性的、高性能、列式存储、可伸缩、实时读写的nosql数据库系统。适用的场景如:须要对海量非结构化的数据进行存储。sql

 

  须要随机近实时的读写管理数据。shell

 

  3、hbase的架构数据库

 

client\zookeeper\hmaster\api

 

hregionserver\hlog\hregion\memstore\storefile\hfile服务器

 

client:hbase的客户端,包含访问hbase的接口(linux shell 、java api)架构

 

client维护一些cache来加快访问hbase的速度,好比region的位置信息。

 

zookeeper:监控hmaster的状态,保证有些仅有一个active的hmaster,达到高可用。存储全部region的寻址入口,--root表在那台服务器上。实时监控hregionserver的状态,将regionserver的上下线信息实时通知给hmaster。存储hbase的全部表的信息(hbase的元数据)

 

hmaster:(hbase的老大)为regionserver分配region(新建表等)。负责regionserver的负载均衡。负责region的从新分配(hregionserver异常、hregion裂变)。hdfs上的垃圾文件回收。处理schema的更新请求。

 

hregionserver:(hbase的小弟)hregionserver维护master分配给他的region(管理本机器上region)。处理client对这些region的IO请求,并和hdfs进行交互

 

region server负责切分在运行过程当中变大的region。

 

hlog:对hbase的操做进行记录,使用WAL写数据,优先写入log,而后再写入memstore,以防数据丢死能够进行回滚。

 

hregion:hbase中分布式存储和负载均衡的最小单元,表或者表的一部分。

 

store:至关于一个列簇。

 

memstore:128M内存缓冲区,用于将数据批量刷新到hdfs上。

 

hstorefile(hfile):hbase中的数据是以hfile的形式存储在hdfs上。

 

  各组件间的数量关系:

 

hmaster:hregionserver=1:n

 

hregionserver:hregion=1:n

 

hregionserver:hlog=1:1

 

hregion:hstore=1:n

 

store:memstore=1:1

 

store:storefile=1:n

 

storefile:hfile=1:1

 

hbase关键字词:

 

rowkey:行键,和mysql的主键是同样的,不容许重复,有顺序。

 

columnfamily:列簇(列的集合)。

 

column:列。

 

timestamp:时间戳,默认显示最新的时间戳。

 

version:版本号。

 

cell:单元格。

 

  4、hbase和hadoop的关系

 

hbase是基于hadoop:hbase的存储依赖于hdfs。具体说hbase的特色:

 

  模式:无模式。

 

  数据类型:单一 byte[]。

 

  多版本:每一个值均可以有多个版本。

 

  列式存储:一个列簇存储到一个目录。

 

  稀疏存储:若是key-value为null,则将不占用存储空间。

 

  再说hbase的安装:

 

一、standalone模式

 

1)解压并配置环境变量

 

tar -zxvf hbase-1.2.1-bin.tar.gz -C /usr/local

 

cd /usr/local

 

vi /etc/profile

 

source /etc/profile

 

2)测试hbase的安装

 

hbase version

 

  配置hbase的配置文件

 

vi conf/hbase-env.sh

 

JAVA_HOME

 

  注意:

 

# Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+

 

export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"。

 

export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"。

 

vi hbase-site.xml

 

hbase.rootdir

 

file:///usr/local/hbasedata

 

hbase.zookeeper.property.dataDir

 

/usr/local/zookeeperdata

 

  启动hbase服务:

 

bin/start-hbase/sh

 

  启动客户端:

 

bin/hbase shell

 

二、伪分布式

 

三、全分布式

 

  解压并配置环境变量

 

  配置hbase的配置文件

 

vi conf/hbase-env.sh

 

export HBASE_MANAGES_ZK=false

 

vi regionservers

 

vi backup-masters

 

vi hbase-site.xml

 

hbase.cluster.distributed

 

true

 

hbase.rootdir

 

hdfs://qianfeng/hbase

 

hbase.zookeeper.property.dataDir

 

/usr/local/zookeeperdata

 

hbase.zookeeper.quorum

 

hadoop05:2181,hadoop06:2181,hadoop07:2181

 

  注意:

 

  若是hdfs是高可用的,要讲hadoop下的core-site.xml和hdfs-site.xml copy到hbase/conf目录下。

 

  分发:

 

scp -r hbase-1.2.1 root@hadoop06:$PWD

 

scp -r hbase-1.2.1 root@hadoop07:$PWD

 

  启动:

 

1)启动zk

 

2)启动hdfs

 

3)启动hbase

 

hbase集群的时间必须同步。

 

hmaster:16010

 

hregionserver:16030

 

hbase的shell操做

 

help

 

help "COMMAND"

 

help "COMMAND_GROUP"

 

  列举出当前namespace下的全部表

 

list

 

  建立表:

 

create 'test','f1', 'f2'

 

namespace:

 

hbase没有库的概念,可是有名称空间或者组的概念,namespace至关于(库)

 

hbase默认有两个组:

 

default:

 

hbase:

 

  列举出全部的namespcae:

 

list_namespace

 

list_namespace_tables 'hbase'

 

create_namespace 'ns1'

 

describe_namespace 'ns1'

 

alter_namespace 'ns1', {METHOD => 'set', 'NAME' => 'gjz1'}

 

alter_namespace 'ns1', {METHOD => 'unset', NAME => 'NAME'}

 

drop_namespace 'ns1' ###只能删除一个空的namespace

 

DDL:

 

Group name: ddl

 

Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, locate_region, show_filters

 

  建立表:

 

create 'test','f1', 'f2'

 

create 'ns1:t_userinfo',{NAME=>'base_info',BLOOMFILTER => 'ROWCOL',VERSIONS => '3'}

 

create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40'] --事先分配好region所管辖的rowkey的范围。

 

  修改表:(有则更新,无则新增)

 

alter 'ns1:t_userinfo',{NAME=>'extra_info',BLOOMFILTER => 'ROW',VERSIONS => '2'}

 

alter 'ns1:t_userinfo',{NAME=>'extra_info',BLOOMFILTER => 'ROWCOL',VERSIONS => '5'}

 

  删除列簇:

 

alter 'ns1:t_userinfo', NAME => 'extra_info', METHOD => 'delete'

 

alter 'ns1:t_userinfo', 'delete' => 'base_info'

 

  删除表:(先要禁用表)

 

disable 'ns1:t1'

 

drop 'ns1:t1'

 

DML:

 

Group name: dml

 

Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve

 

  插入数据:(不能一次性插入多列)

 

put 'ns1:test','u00001','cf1:name','zhangsan'

 

put 'ns1:t_userinfo','rk00001','base_info:name','gaoyuanyuan'

 

put 'ns1:t_userinfo','rk00001','extra_info:pic','picture'

 

  更新数据:

 

put 'ns1:t_userinfo','rk00001','base_info:name','zhouzhiruo'

 

put 'ns1:t_userinfo','rk00002','base_info:name','zhaoming'

 

  表扫描(scan)

 

scan 'ns1:t_userinfo'

 

scan 'ns1:t_userinfo',{COLUMNS => ['base_info:name','base_info:age']}

 

  设置查询条件:(包头不包尾)

 

scan 'ns1:t_userinfo',{COLUMNS => ['base_info:name','base_info:age'],STARTROW=>'rk000012',LIMIT=>2}

 

scan 'ns1:t_userinfo',{COLUMNS => ['base_info:name','base_info:age'],STARTROW=>'rk000012',ENDROW=>'rk00002',LIMIT=>2}

 

  查询数据:(GET)

 

get 'ns1:t_userinfo','rk00001'

 

get 'ns1:t_userinfo','rk00001',{TIMERANGE=>[1534136591897,1534136667747]}

 

get 'ns1:t_userinfo','rk00001',{COLUMN=>['base_info:name','base_info:age'],VERSIONS =>4}

 

get 'ns1:t_userinfo','rk00001',{TIMESTAMP=>1534136580800}

 

  删除数据:(DELETE)

 

delete 'ns1:t_userinfo','rk00002','base_info:age'

 

'ns1:t_userinfo','rk00001',{TIMERANGE=>[1534138686498,1534138738862]}

 

  删除指定的版本:(往上删除版本)

 

delete 'ns1:t_userinfo','rk00001','base_info:name',TIMESTAMP=>1534138686498

 

  表判断:

 

exists 'ns1:t_userinfo'

 

disable 'ns1:t_userinfo'

 

enable 'ns1:t_userinfo'

 

desc 'ns1:t_userinfo'

 

  统计表:(统计效率较差,不建议使用)

 

count 'ns1:t_userinfo'

 

  清空表:

 

truncate 'ns1:test'

 

 

  学习大数据开发,内容包含Linux&&Hadoop生态体系、大数据计算框架体系、云计算体系、机器学习&&深度学习。根据好程序员提供的大数据学习路线图可让你对学习大数据须要掌握的知识有个清晰的了解,并快速入门大数据开发。

相关文章
相关标签/搜索