HBase基础

                                                     HBase基础

1HBase简介

1.1 HBase是什么

是 Apache Hadoop 的数据库,是建 立在 HDFS 之上,被设计用来提供高可靠性、高性能、列存储、可伸缩、多版本的 NoSQL 的分布式数据存储系统,实现对大型数据的实时、随机的读写访问。简而言之是针对海量数据,快速随机查询,面向列的NoSQL 分布式数据库。

1.2 HBase产生背景

随着数据规模越来越大,数据存储的水平扩展,而目前的关系型数据库更专注一台机器。海量数据量存储成为提升应用性能的瓶颈,单台机器无法负载海量的数据处理,随之而来的出现了很多的分布式存储解决方案,HBase就是其中之一。

Hadoop 使用分布式文件系统Hdfs存储大数据,并使用 MapReduce 来处理。Hadoop 擅长于存储各种格式的庞大的数据,任意的格式甚至非结构化的处理。Hadoop 只能执行批量处理,并且只以顺序方式访问数据,所以每个搜索必须搜索整个数据集。

2 HBase安装

(1)安装准备

jdk;hadoop;zookeeper

(2)安装节点

HBase是主从结构的。主:Hmaster,从:Hregionserver此处以3个节点为例

bigdata01bigdata02bigdata03
Hmaster Hmaster
HregionserverHregionserverHregionserver

(3)版本选择

HBase版本选择不合适会和jdk或hadoop产生冲突,所以一定要慎重选择版本,此处以1.2.6为例

官网地址http://hbase.apache.org/book.html#basic.prerequisites

 

(4)开始安装

①上传安装包

②解压 tar -zxf hbase-1.2.6-bin.tar.gz -C /home/refuel/opt/module/

③修改环境变量  vim /home/refuel/.bash_profile

添加

export HBASE_HOME=/home/refuel/opt/module/hbase-1.2.6

PATH=$PATH:$HBASE_HOME/bin

使配置文件生效:source /home/refuel/.bash_profile

④修改配置文件

vim hbase-env.sh

1修改jdk

2不使用内置的zookeeper

vim hbase-site.xml

<property>

<!-- 指定 hbase 在 HDFS 上存储的路径,高可用使用组名hdfs 的 nameservice -->

 <name>hbase.rootdir</name>

 <value>hdfs://bigdatagroup/user/hbase</value>

 </property>

 <property>

<!-- 指定 hbase 是分布式的 -->

 <name>hbase.cluster.distributed</name>

 <value>true</value>

 </property>

 <property>

<!-- 指定 zk 的地址,多个用“,”分割 -->

 <name>hbase.zookeeper.quorum</name>

 <value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value>

 </property>

vim regionservers

添加从节点

vim backup-masters

创建一个配置文件,指定备份的master节点的位置(可以有多个)

 

⑤将hadoop的hdfs-site.xml和core-sit.xml拷贝到conf目录下

cp /home/refuel/opt/module/hadoop-2.7.7/etc/hadoop/hdfs-site.xml /home/refuel/opt/module/hadoop-2.7.7/etc/hadoop/core-site.xml /home/refuel/opt/module/hbase-1.2.6/conf/

⑥将安装包远程拷贝到另外两台机器

scp -r /home/refuel/opt/module/hbase-1.2.6/ bigdata02:/home/refuel/opt/module/

scp -r /home/refuel/opt/module/hbase-1.2.6/ bigdata03:/home/refuel/opt/module/

⑦修改其他节点的环境变量

⑧启动start-hbase:注意在哪个节点启动,就会在哪一个节点启动hmaster,这个hmaster是active的,backup-masters配置的是standby的master

3 HBase设计思想

随机(近)实时查询,采用跳表结构,创建多层索引的,存储时按布隆过滤器(数组下标),不过hbase最大只到二层索引,最上层索引无论多大都不会切分的。

hbase对zk的依赖性极强,允许master宕机,但是zk不允许宕机。体现在下面两点:

(1)选主机制

(2)寻址机制(址:最上层索引表存储位置),所以如果zk宕机整个集群数据无法访问到

4 HBase特点

(1)HBase中数据库的特点

①仅能通过主键(rowkey)和主键的 range 来检索数据;

②不能支持join;

③不支持复杂的事务,只支持行级事务;

④底层所有数据的存储都是字节数组 byte[] ;

⑤主要用来存储结构化和半结构化的松散数据。

(2)HBase中表的特点

①大:一个表可以有上十亿行,上百万列

②面向列:严格意义上来说面向“列族|列簇”

③稀疏:hbase中null(空)不进行存储的

④无模式

           数据库中的两种模式:读模式和写模式

           读模式:数据读取的时候,进行数据校验的。如:hive,加载数据写入到hive的时候不会检验,如插入的数据5个                字段,表中只有3个字段是没问题的。读数据的时候会校验,只读取前3个字段。

           写模式:数据写入的时候进行数据校验的,如mysql,在写入时就进行校验,校验不通过不让写入

5 HBase结构

(1)column family(列族|列簇):唯一的表结构部分,建表的时候只要指定列族就可,一个或多个列。

hbase中一个列族会存储一个物理文件,面向列簇存储。列族的设计依据:通常情况下将具有相同io属性(经常一起查询的字段)的列放在同一个列族下。

io属性与业务相关,列族不建议过多,最多不超过3个(不同的列族需要跨文件访问)

(2)rowkey(行键):表数据的一部分。

一行的标识,不同行的行键是不同的,相同行键的数据是属于同一行的hbase中表索引的时候默认会按照字典顺序进行升序排序,便于创建索引。

(3)colunn(列):表数据的一部。

每一行的列名和对应的值,在插入数据的时候指定的。每一个列都属于一个列族的,定位一个列,首先要指定列族

(4)version:数据版本|时间戳。

每一个列存储的数据,可以存储多个版本的,存储的每一个列数据的时候,默认添加一个时间戳信息,这个时间戳信息就是数据版本,默认每一列只存储一个版本的,最新版本。

(5)cell:单元格。

hbase表中,每一列的每一个值存储在一个单元格中的

定位一个单元格顺序:指定行键---》列族---》列----》时间戳

6 HBase的shell命令行操作

启动hbase的客户端命令:hbase shell 

help 查看帮助文档               help command   查询某一个命令的详细使用

COMMAND GROUPS:
  Group name: general
  Commands: status, table_help, version, whoami

(1)status 查看集群的状态信息


(2)version hbase版本信息


(3)whoami 当前用户的

  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

(1)建表

语法:create 't1', 'f1', 'f2', 'f3'  简写,所有的属性默认值

         create 't1', {NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 1}  指定属性值建表
         VERSIONS 指定数据版本  默认1   TTL  过期时间 时间戳  默认forever

(2)查看表列表

list        查看所有的表列表
list_namespace_tables    指定namespace的表

(3)查看表的详细描述信息

describe或desc 
describe 'mydata:table_test1'
desc 'mydata:table_test1'

(4)修改表

①修改表属性

语法:alter “表名”,{NAME=> ,VERSIONS=>}

alter 'mydata:table_test2',{NAME=>'column_family2',VERSIONS=>5}

②删除列族

语法:alter 'ns1:t1', NAME => 'f1', METHOD => 'delete'
           alter 'ns1:t1', 'delete' => 'f1'

         注意:只有一个列族是不能删除的

 alter 'mydata:table_test2',{NAME=>'column_family2',METHOD=>'delete'}

alter 'mydata:table_test2','delete'=>'column_family1'

③添加列族

语法:alter “表名”,{NAME=> ,VERSIONS=>}

alter 'mydata:table_test2',{NAME=>'column_family3',VERSIONS => 6}

(5)表的启用和禁用

hbase中的表的2种状态:启动和禁用,默认表状态为启用

①启用:

disable    禁用表
    disable 'mydata:table_test2'


disable_all          禁用某一个namespace下的所有表
    disable_all ‘’namespace:.*‘’
    disable_all 'mydata:t.*'


is_disabled 表是否被禁用  true 禁用  false 启用
    is_disabled 'mydata:table_test2'

②禁用:

enable  启用表
    enable 'mydata:table_test2'


enable_all           启用某一个namespace下的所有表
    enable_all 'mydata:.*'


is_enabled
    is_enabled 'mydata:table_test2'

(6)删除表

注意:首先要先禁用表,才能删除

disable "mydata:table_test2"


drop "mydata:table_test2"


drop_all "mydata:.*"

 

  Group name: namespace
  Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables

hbase的namesapce相关操作,类似于传统关系型数据库的database,在hbase中弱化database的概念
默认有一个namespace,为default。并且不能切换namespace,要操作其他的namespace的表,在表名前加上namespace。

(1)创建namespace 

语法:create_namespace 'ns1'

create_namespace 'mydata'

(2)查看所有namedspace 

语法:list_namespace

(3)查看namespace的描述

语法:describe_namespace 'ns1'

describe_namespace 'mydata'

(4)删除namespace

drop_namespace 'mydata'

(5)显示指定 namespace下的表

list_namespace_tables 'ns1'

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

(1)数据插入  put

shell 一次只能插入一个单元格的数据

语法:put 'namespace:表名', '行健', '列族:列', '值',时间戳|版本

put 'mydata:table_test1','rk01','column_family1:name','refuel'

put 'mydata:table_test1','rk01','column_family1:age','18'

put 'mydata:table_test1','rk01','column_family2:gender','M',2

(2)查询单条数据  get

语法:get "user_info","rk0001"

get '表名', '行健', {COLUMN => '列族:列', TIMESTAMP => 时间戳}
指定版本信息查询  定位一个单元格  查询一行指定版本的

get 'mydata:table_test1','rk01'

get 'mydata:table_test1','rk01',{COLUMN=>'column_family2:gender',TIMESTAMP=>2}

(3)表扫描数据  scan

准备数据

put 'mydata:table_test1','rk02','column_family1:name','refuel2'

put 'mydata:table_test1','rk02','column_family1:age','12'

put 'mydata:table_test1','rk02','column_family2:gender','F',3

put 'mydata:table_test1','rk06','column_family1:name','refuel6'

put 'mydata:table_test1','rk06','column_family1:age','16'

put 'mydata:table_test1','rk06','column_family2:gender','M'

put 'mydata:table_test1','rk04','column_family1:name','refuel4'

put 'mydata:table_test1','rk04','column_family1:age','14'

put 'mydata:table_test1','rk04','column_family2:gender','M'

put 'mydata:table_test1','aa01','column_family1:name','refuela1'

put 'mydata:table_test1','aa01','column_family1:age','11'

put 'mydata:table_test1','aa01','column_family2:gender','M'

put 'mydata:table_test1','ss001','column_family1:name','refuels1'

put 'mydata:table_test1','ss001','column_family1:age','111'

put 'mydata:table_test1','ss001','column_family2:gender','M'

put 'mydata:table_test1','rk03','column_family1:name','refuel3'

put 'mydata:table_test1','rk03','column_family1:age','13'

put 'mydata:table_test1','rk03','column_family2:gender','M',4

put 'mydata:table_test1','rk05','column_family1:name','refuel5'

put 'mydata:table_test1','rk05','column_family1:age','15'

put 'mydata:table_test1','rk05','column_family2:gender','M'

 

①全表扫描:scan "表名"           

  scan 'mydata:table_test1'

②指定需要扫描的列: scan '表名', {COLUMNS => '列'}     

    scan 'mydata:table_test1',{COLUMN=>['column_family1:age','column_family1:name']}

③指定需要扫描的起始行健,从起始行健开始扫描:scan 'ns1:t1', {COLUMNS => ['c1', 'c2'],STARTROW => 'xyz'}

scan 'mydata:table_test1',{COLUMN=>'column_family1:age',STARTROW=>'rk03'}

④指定需要扫描的结束行健:scan 't1', {COLUMNS => ['c1', 'c2'], STARTROW =>"", ENDROW => 'xyz'} 

注意:含头不含尾

scan 'mydata:table_test1',{COLUMN=>'column_family1:age',STARTROW=>'rk03',ENDROW=>'rk06'}

⑤指定从起始行健开始,需要返回的数据条数,默认从第一条开始:scan "user_info",{COLUMNS => ["base_info:name","base_info:age"],LIMIT => 5}

scan 'mydata:table_test1',{COLUMN=>'column_family2:gender',LIMIT=>5}

⑥指定时间戳范围的数据,效率不高,要扫描所有时间戳范围内的数据:scan 't1', {COLUMNS => 'c1', TIMERANGE => [1303668804, 1303668904]}

scan 'mydata:table_test1',{COLUMN=>'column_family2:gender',TIMERANGE=>[2,4]}

 

  Group name: tools
  Commands: assign, balance_switch, balancer, balancer_enabled, catalogjanitor_enabled, catalogjanitor_run, catalogjanitor_switch, close_region, compact, compact_rs, flush, major_compact, merge_region, move, normalize, normalizer_enabled, normalizer_switch, split, trace, unassign, wal_roll, zk_dump

  Group name: replication
  Commands: add_peer, append_peer_tableCFs, disable_peer, disable_table_replication, enable_peer, enable_table_replication, list_peers, list_replicated_tables, remove_peer, remove_peer_tableCFs, set_peer_tableCFs, show_peer_tableCFs

  Group name: snapshots
  Commands: clone_snapshot, delete_all_snapshot, delete_snapshot, list_snapshots, restore_snapshot, snapshot

  Group name: configuration
  Commands: update_all_config, update_config

  Group name: quotas
  Commands: list_quotas, set_quota

  Group name: security
  Commands: grant, list_security_capabilities, revoke, user_permission

  Group name: procedures
  Commands: abort_procedure, list_procedures

  Group name: visibility labels
  Commands: add_labels, clear_auths, get_auths, list_labels, set_auths, set_visibility

SHELL USAGE:
Quote all names in HBase Shell such as table and column names.  Commas delimit
command parameters.  Type <RETURN> after entering a command to run it.
Dictionaries of configuration used in the creation and alteration of tables are
Ruby Hashes. They look like this:

  {'key1' => 'value1', 'key2' => 'value2', ...}

and are opened and closed with curley-braces.  Key/values are delimited by the
'=>' character combination.  Usually keys are predefined constants such as
NAME, VERSIONS, COMPRESSION, etc.  Constants do not need to be quoted.  Type
'Object.constants' to see a (messy) list of all constants in the environment.

If you are using binary keys or values and need to enter them in the shell, use
double-quote'd hexadecimal representation. For example:

  hbase> get 't1', "key\x03\x3f\xcd"
  hbase> get 't1', "key\003\023\011"
  hbase> put 't1', "test\xef\xff", 'f1:', "\x01\x33\x40"

The HBase shell is the (J)Ruby IRB with the above HBase-specific commands added.
For more on the HBase Shell, see http://hbase.apache.org/book.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值